GNU/Linux >> Znalost Linux >  >> Linux

Co je spinlock v Linuxu?

Spin lock je způsob, jak chránit sdílený prostředek před modifikací dvěma nebo více procesy současně. První proces, který se pokouší upravit prostředek, „získá“ zámek a pokračuje v cestě, přičemž se zdrojem dělá, co potřeboval. Všechny ostatní procesy, které se následně pokusí získat zámek, budou zastaveny; říká se o nich, že se "točí na místě" a čekají na zámek, aby byl uvolněn prvním procesem, proto se nazývá spin lock.

Linuxové jádro používá spin locky pro mnoho věcí, například při odesílání dat na konkrétní periferii. Většina hardwarových periferií není navržena tak, aby zpracovávala více současných aktualizací stavu. Pokud mají nastat dvě různé modifikace, jedna musí striktně následovat druhou, nemohou se překrývat. Zámek otáčení poskytuje nezbytnou ochranu a zajišťuje, že úpravy probíhají jedna po druhé.

Zámky otáčení jsou problémem, protože předení blokuje jádro CPU tohoto vlákna, aby nemohlo vykonávat žádnou jinou práci. Zatímco linuxové jádro poskytuje multitaskingové služby pro programy v uživatelském prostoru běžící pod ním, toto univerzální multitaskingové zařízení se nevztahuje na kód jádra.

Tato situace se mění a byla po většinu existence Linuxu. Až do Linuxu 2.0 bylo jádro téměř čistě jednoúlohový program:kdykoli CPU spouštěl kód jádra, bylo použito pouze jedno jádro CPU, protože existoval jediný spinový zámek chránící všechny sdílené zdroje, nazývaný Big Kernel Lock (BKL ). Počínaje Linuxem 2.2 se BKL pomalu rozděluje do mnoha nezávislých zámků, z nichž každý chrání více zaměřenou třídu zdrojů. Dnes, s jádrem 2.6, BKL stále existuje, ale používá ho pouze opravdu starý kód, který nelze snadno přesunout do nějakého podrobnějšího zámku. Nyní je docela možné, že vícejádrový box bude mít na každém CPU spuštěný užitečný kód jádra.

Užitnost rozbití BKL je omezená, protože linuxové jádro postrádá obecný multitasking. Pokud se jádro CPU zablokuje při roztočení jádra, nelze jej znovu zadat, aby šlo dělat něco jiného, ​​dokud se zámek neuvolní. Jen sedí a točí se, dokud se zámek neuvolní.

Spin locky dokážou efektivně proměnit monstrózní 16jádrový box na jednojádrový box, pokud je zátěž taková, že každé jádro vždy čeká na jediný spin lock. Toto je hlavní limit škálovatelnosti linuxového jádra:zdvojnásobení jader CPU ze 2 na 4 pravděpodobně téměř zdvojnásobí rychlost linuxového boxu, ale zdvojnásobení z 16 na 32 pravděpodobně ne, u většiny pracovních zátěží.


Otočný zámek je, když proces neustále požaduje zámek, který má být odstraněn. Je to považováno za špatné, protože proces spotřebovává (obvykle) zbytečně cykly. Není to specifické pro Linux, ale obecný programovací vzor. A i když je to obecně považováno za špatný postup, ve skutečnosti je to správné řešení; existují případy, kdy jsou náklady na použití plánovače vyšší (z hlediska cyklů CPU) než náklady na několik cyklů, u kterých se očekává, že spinlock vydrží.

Příklad spinlocku:

#!/bin/sh
#wait for some program to clear a lock before doing stuff
while [ -f /var/run/example.lock ]; do
  sleep 1
done
#do stuff

Často existuje způsob, jak se vyhnout zablokování otáčení. Pro tento konkrétní příklad existuje linuxový nástroj s názvem inotifywait (ve výchozím nastavení se obvykle neinstaluje). Pokud by byl napsán v C, jednoduše byste použili inotify API, které Linux poskytuje.

Stejný příklad s použitím inotifywait ukazuje, jak dosáhnout stejné věci bez zámku otáčení:

#/bin/sh
inotifywait -e delete_self /var/run/example.lock
#do stuff

Když se vlákno pokusí získat zámek, mohou se stát tři věci, pokud selže – může to zkusit a zablokovat, může to zkusit a pokračovat, může to zkusit a pak přejít do režimu spánku a říct OS, aby ho probudil, když dojde k nějaké události.

Nyní pokus a pokračování zabere mnohem méně času než pokus a blokování. Řekněme pro tuto chvíli, že „zkuste a pokračujte“ zabere jednotku času a „zkuste a zablokujte“ stovku.

Nyní předpokládejme, že v průměru vlákno zabere 4 jednotky času držení zámku. Je zbytečné čekat 100 jednotek. Takže místo toho napíšete smyčku „zkuste a pokračujete“. Na čtvrtý pokus obvykle zámek získáte. Toto je zámek otáčení. Říká se tomu tak, protože vlákno se stále točí na místě, dokud se nezablokuje.

Dalším bezpečnostním opatřením je omezení počtu spuštění smyčky. Takže například spustíte cyklus for-loop, řekněme šestkrát, a pokud selže, „zkusíte a zablokujete“.

Pokud víte, že vlákno vždy udrží zámek na, řekněme, 200 jednotek, pak ztrácíte čas počítače na každý pokus a pokračování.

Takže nakonec může být zámek otáčení velmi efektivní nebo plýtvání. Je plýtvání, když „typická“ doba držení zámku je delší než doba, kterou trvá „zkusit a zablokovat“. Je efektivní, když je typický čas držení zámku mnohem kratší než čas „zkusit a zablokovat“.

Ps:Kniha ke čtení na vláknech je "A Thread Primer", pokud ji stále můžete najít.


Linux
  1. Co je nového s rdiff-backup?

  2. Co je uživatel Linuxu?

  3. Co je Umask v Linuxu

  1. Migrace Unixu na Linux

  2. Co je číslo inodu v Linuxu?

  3. Linux – změnit oprávnění složky?

  1. Linux vs. Unix:Jaký je rozdíl?

  2. Co je Red Hat Linux?

  3. Co je JingOS Linux?