Serializace tokenů - Serializing tokens
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto problémech na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
v počítačová věda, serializační tokeny jsou konceptem řízení souběžnosti vyplývajícím z pokračujícího vývoje DragonFly BSD. Podle Matthew Dillon, jsou si velmi blízcí SPL kromě toho, že token funguje napříč více CPU zatímco SPL fungují pouze v doméně jednoho CPU.
Serializační tokeny umožňují programátorům psát víceprocesorový -bezpečný kód bez sebe nebo subsystémů nižší úrovně, kteří potřebují znát každou entitu, která může také držet stejný token.
Srovnání se vzájemným vyloučením (mutex)
Žetony a vzájemné vyloučení (mutex) mechanismy jsou zámky. Na rozdíl od mutexů tokeny nevylučují jiná vlákna z přístupu k prostředku, když jsou blokována nebo spí. Prostředky sdílení vláken s jinými vlákny lze zastavit a spustit z různých důvodů:
- Timeslicing: plánovač uživatelského prostoru (USA) se snaží zajistit, aby všechna vlákna měla spravedlivou šanci na spuštění, takže každé vlákno spustí na krátkou dobu (časový úsek) a poté přepne na jiné vlákno.
- Souběžné provádění: v počítačích s více procesory může být vlákno spuštěno přesně ve stejnou dobu jako jiné vlákno na jiném CPU.
- Preemption: a thread may preempt a lower-priority thread, such as a hardware interrupt or lehká vlákna jádra.
- Dobrovolné blokování: vlákno může spát, pokud musí na něco čekat, nemá žádnou práci nebo volá funkci, která blokuje. Blokovat může i volání k získání zámku.
Následující tabulka shrnuje vlastnosti tokenů a mutexů.
Serializace tokenů | Mutexy | |
---|---|---|
Časový rozvrh | Funguje | Funguje |
Souběžné provádění | Funguje | Funguje |
Preempce | Funguje | Funguje |
Dobrovolné blokování | Selže | Funguje |
Zabraňuje zablokování | Ano | Ne |
Vyhne se prioritní inverzi | Ano | Ne |
Problémy jako zablokování a prioritní inverze může být velmi obtížné se vyhnout a vyžaduje koordinaci na mnoha úrovních jádra. Vzhledem k tomu, že uzamčení pomocí tokenů nezablokuje a získané tokeny nemusí být atomické při pozdějším blokování operací, umožňuje mnohem jednodušší kód než mutexes.
... Když se podíváte na FreeBSD-5, všimnete si, že FreeBSD-5 prochází držené mutexy dolů v podprogramovém zásobníku poměrně často, aby bylo možné na některé velmi hluboké procedurální úrovni dočasně uvolnit mutex za účelem přepnutí, blokování nebo řešení se zablokováním. Ve FreeBSD-5 proto dochází k velkému znečištění kódu (kde některým postupům musí být poskytnuta znalost mutexů držených jinými nesouvisejícími postupy, aby správně fungovaly).
— Matthew Dillon
Příklad
Následující pseudo kód a vysvětlení ukazují, jak fungují serializační tokeny.
Závit A | Závit B | Akce |
---|---|---|
lwkt_gettoken (T1); iter = list1.head; | ... lwkt_gettoken (T1); // blokuje // čeká na token T1 | A získá token T1 a použije ho k získání synchronizovaného přístupu k seznamu1, který je sdílen oběma vlákny. |
lwkt_gettoken (T2); // bloky | // čekání na token T1 | Volání A na lwkt_gettoken (T2) je blokovací funkcí, takže A přejde do režimu spánku a dočasně ztratí své tokeny. Probudí se, když plánovač uvidí, že jsou k dispozici jak T1, tak T2. |
// čekání na T1 a T2 | list1.head = list1.head.next; lwkt_releasetoken (T1); | B získá T1 a upraví list1. Všimněte si, že „iter“ A stále ukazuje na starou hlavu seznamu. |
// získejte novou verzi head: iter = list1.head; // vytvořit nový seznam: while (iter! = null) {list2.tail = iter; iter = iter.next;} lwkt_releasetoken (T1); lwkt_releasetoken (T2); | Plánovač vidí, že jsou k dispozici jak T1, tak T2, takže probudí vlákno A. Protože A bylo správně kódováno, obnoví svůj iterátor s novou hlavou seznamu1 a provede na něm několik neblokovacích operací. Všimněte si, že by bylo lepší formou, kdyby A na začátku jednoduše požádal o oba žetony. |
Dosavadní stav techniky v jádře Darwinu
Mac OS X je Darwine jádro používá podobnou techniku (tzv. a trychtýř ) k serializaci přístupu k BSD část jádra.