A ještě k tomu LOCKu. Kdysi jsem se zabýval, prot Microsoft Windows používá volání Call InterlockedIncrement namísto provedení LOCK INC. Důvod mne překvapil po tom, co jsem si prohlédl, jak se liší kód na jednojádrovém a dvoujádrovém procesoru. Zatímco na jednojádrovém procesoru je na adrese kam ukazuje CALL uvedeno INC [adresa] a RET. Tak u vícejádrového procesoru je tam tatáž instrukce s LOCK INC [adresa]. Ten CALL totiž vede do KERNEL32.DLL, který existuje ve vícero verzích. Stejně tak existuje vícero verzí různých zámků typu EnterCriticalSection a podobně, která ve verzi pro jedno jádro je mnohem jednodušší, protože u ní je nižší riziko race conditions.
Opakuji instrukce s prefixem LOCK je velice drahá, je to serializační instrukce, která způsobí, že se nejprve vyčká, až se dokončí všechn instrukce před ní, pak se vykoná ona sama jediná a následně se začnou vykonávat následující instrukce. Je to asi tak, jako byste ve škodovce zastavili linku, pak vyrobili jedno auto a pak tu linku zase spustili. Dále je potřeba s tím, že čtená adresa se bude načítat z paměti a ne z cache a bude se zapisovat do paměti a ne do cache. Pokud se sejde víc LOCKů současně, pak jde už tak mizerný výkon do kytek. Nějaké info jsem našel tady:
http://stackoverflow.com/questions/2538070/atomic-operation-cost
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 230×
Přečteno 25 392×
Přečteno 23 814×
Přečteno 20 193×
Přečteno 17 895×