Co je zámek paměti?

Historicky byly všechny počítačové programy napsány naprosto sekvenčním způsobem. To je snadné číst, psát a pochopit. Pro počítač je to také jednoduché a vyžaduje relativně jednoduchý hardware. S tímto návrhovým paradigmatem jsou jedinými dvěma způsoby, jak zvýšit výkon systému, psát efektivnější kód a zvýšit rychlost CPU. Zvýšení efektivity kódu je možné, ale obecně se jedná o složitý proces s často omezenými výsledky.

Po desetiletí se mohl výkon snižovat čekáním na nové, efektivnější CPU. Jak je popsáno v Moorově zákoně, výkon CPU se zhruba zdvojnásobí každé dva až tři roky. Bohužel většina těchto nárůstů výkonu pochází z používání stále menších výrobních uzlů. Moderní technologie se snaží zmenšit velikost uzlu historickým tempem, a to díky materiálovým obtížím pracujícím v měřítku nanometrů.

Aby to bylo možné obejít, moderní architekti CPU se rozhodli přidat k CPU více procesorových jader. Každé jádro procesoru může pracovat nezávisle na jiné úloze. I když nemohou kombinovat stejný problém, mohou pracovat na dvou problémech současně. Tato základní architektonická změna poskytuje spoustu dalšího výkonu, ale přímo neprospívá jednotlivým procesům, i když snižuje spor o čas procesoru.

Chcete-li využít výhod vícejádrových CPU, musí být kód napsán vícevláknovým způsobem. Každé vlákno pak může být spouštěno souběžně, škálovat přínos výkonu podle počtu dostupných vláken a jader CPU. Tím však narážíme na novou výzvu, „závodní podmínky“.

Poznámka: Některé úlohy nemohou být vícevláknové, zatímco jiné mohou být masivně vícevláknové. Možné výkonnostní výhody závisí na provedené práci.

Závodní podmínky

Vícevláknový software může využívat výhod více jader. V těchto vodách číhají nebezpečí, připraveni chytit nezkušeného programátora do pasti. Spor může nastat při interakci dvou různých vláken se stejným bitem paměti.

Jednoduchým příkladem mohou být dvě vlákna, která se pokoušejí kontrolovat a inkrementovat proměnnou současně. Řekněme, že a=0 . Dvě různá vlákna pak vykonávají své funkce a v určitém okamžiku zkontrolují a a zvýší je o jedno. Obecně byste očekávali, že výsledek dvou vláken přidaných jedna k nule bude dvě. Většinou by to tak mělo být. Můžete získat jiný výsledek, pokud obě vlákna projdou touto konkrétní funkcí přesně ve správný čas.

V tomto případě první vlákno čte hodnotu a . Než může první vlákno zvýšit hodnotu a ačkoli, druhé vlákno jej přečte. Nyní první vlákno přidá jedničku k nule, ale druhé vlákno již věří, že hodnota je nula, a přidá jedna k nule. Výsledkem je, že konečná hodnota a je 1, nikoli 2.

Závodění podle scénáře nejhoršího případu

I když výše uvedený příklad nemusí znít nijak zvlášť špatně, může mít dramatické účinky. Co když hodnota a určuje režim provozu stroje? Co když konkrétní režimy provozu tohoto stroje mohou být nebezpečné nebo dokonce život ohrožující?

Podmínky závodu také nemusí být tak jednoduché. Například může být možné, aby jedno vlákno četlo část paměti ve stejnou dobu, kdy do ní zapisuje jiné vlákno. V tomto případě může čtecí vlákno získat podivnou směs dat před a po. Řekněme, že kontrola je jednoduchá kontrola pravdivosti/nepravdy.

Pokud proměnná na začátku čtení uvedla true, ale byla v procesu přepisování na slovo false, výsledek operace čtení může být něco jako „trlse“. To není „pravda“ nebo „nepravda“. Nebýt jedné ze dvou možností v binárním výběru by téměř jistě vedlo k pádu aplikace. Toto poškození paměti může vést k mnoha bezpečnostním problémům, jako je odmítnutí služby a eskalace oprávnění.

Uzamčení závodu

Vědět, jaké bity paměti v programu jsou sdíleny mezi různými vlákny, je nezbytné, aby se zabránilo sporu. Pokud je proměnná řízena a přístupná pouze jedním vláknem, není třeba nic dělat. Pokud dvě nebo více vláken mohou přistupovat k proměnné, musíte zajistit, aby všechny operace na této části paměti byly dokončeny nezávisle na sobě.

Této nezávislosti je dosaženo díky zámku. Do kódu programu musíte při zápisu funkce, která funguje na sdílené části paměti, vložit zámek. Tento zámek blokuje přístup jiných vláken k této části paměti, dokud není zámek uvolněn.

Zámek není nejelegantnější řešení. Jednak má paměťovou režii. Může také přinutit vlákno k zavěšení a čeká na uvolnění zámku. V závislosti na situaci se zámek nemusí uvolnit po velmi dlouhou dobu nebo se nemusí uvolnit vůbec. V nejhorším případě může odemknutí zámku záviset na tom, že se něco stane v jiném zablokovaném vláknu, což povede k uváznutí.

Je nezbytné optimalizovat použití zámků. Můžete ovládat, jak zrnitý je zámek. Pokud například upravujete data v tabulce, můžete zamknout celou tabulku nebo zamknout pouze upravený řádek. Uzamčení celého stolu by znamenalo zámek hrubé granularity. Minimalizuje režii z implementace příliš mnoha zámků, ale zvyšuje šanci, že zámek zablokuje další vlákno. Uzamčení pouze řádku by znamenalo zámek jemné granularity. To je mnohem méně pravděpodobné, že bude narušovat ostatní vlákna, ale znamená to, že budou potřeba roztrhané zámky, což zvýší celkovou režii.

Závěr

Zámek paměti je kódový nástroj, který se používá k zajištění atomických operací v paměti ve vícevláknovém prostředí. Uzamčením části paměti před operací s ní si můžete být jisti, že kvůli sporu nemůže dojít k žádnému neočekávanému chování. Zámky paměti přicházejí s režií paměti, ale mohou také způsobit zablokování.

Blokování je místo, kde se jiné vlákno pokouší pracovat na uzamčeném pemory. Nit tam sedí, zablokovaná, dokud se zámek neuvolní. To může způsobit problémy, pokud uvolnění zámku vyžaduje, aby něco provedlo jiné vlákno, protože se může zablokovat dříve, než dokončí předpoklad pro uvolnění zámku, který jej blokuje. Zámkům paměti se lze vyhnout zápisem neblokovacích kódů. To však může být složité a méně výkonné než použití zámků. Nezapomeňte níže zanechat své komentáře.


Jak klonovat pevný disk

Jak klonovat pevný disk

V moderním digitálním věku, kde jsou data cenným aktivem, může být klonování pevného disku v systému Windows pro mnohé zásadním procesem. Tento komplexní průvodce

Jak opravit selhání načtení ovladače WUDFRd v systému Windows 10?

Jak opravit selhání načtení ovladače WUDFRd v systému Windows 10?

Setkáváte se při spouštění počítače s chybovou zprávou, která říká, že se nepodařilo načíst ovladač WUDFRd do vašeho počítače?

Jak opravit kód chyby NVIDIA GeForce Experience 0x0003

Jak opravit kód chyby NVIDIA GeForce Experience 0x0003

Máte na ploše zkušenosti s chybovým kódem 0x0003 NVIDIA GeForce? Pokud ano, přečtěte si blog a zjistěte, jak tuto chybu rychle a snadno opravit.

Co je SMPS?

Co je SMPS?

Než si vyberete SMPS pro svůj počítač, zjistěte si, co je SMPS, a význam různých hodnocení účinnosti.

Proč se můj Chromebook nezapne

Proč se můj Chromebook nezapne

Získejte odpovědi na otázku Proč se můj Chromebook nezapíná? V této užitečné příručce pro uživatele Chromebooků.

Jak nahlásit phishingové podvody společnosti Google

Jak nahlásit phishingové podvody společnosti Google

V této příručce se dozvíte, jak nahlásit podvodníka společnosti Google a zabránit mu v podvádění ostatních.

Roomba se zastaví, přilepí a otočí – oprava

Roomba se zastaví, přilepí a otočí – oprava

Vyřešte problém, kdy se váš robotický vysavač Roomba zastaví, zasekne a stále se otáčí.

Jak změnit nastavení grafiky na Steam Deck

Jak změnit nastavení grafiky na Steam Deck

Steam Deck nabízí robustní a všestranný herní zážitek přímo na dosah ruky. Chcete-li však optimalizovat své hraní a zajistit to nejlepší možné

Co je zabezpečení založené na izolaci?

Co je zabezpečení založené na izolaci?

Chtěli jsme se ponořit do tématu, které je ve světě kybernetické bezpečnosti stále důležitější: zabezpečení založené na izolaci. Tento přístup k

Jak používat Auto Clicker pro Chromebook

Jak používat Auto Clicker pro Chromebook

Dnes jsme se chtěli ponořit do nástroje, který dokáže automatizovat opakované klikání na vašem Chromebooku: Auto Clicker. Tento nástroj vám může ušetřit čas a