Názor ke článku Chytrý a chytřejší od ondra.novacisko.cz - A ještě k tomu LOCKu. Kdysi jsem se...

  • 10. 11. 2011 21:24

    ondra.novacisko.cz (neregistrovaný)

    A ještě k tomu LOCKu. Kdysi jsem se zabýval, prot Microsoft Windows používá volání Call InterlockedIn­crement 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 EnterCritical­Section 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