06 - Procesy a vlákna - synchronizace
Níže je uveden pouze náhled materiálu. Kliknutím na tlačítko 'Stáhnout soubor' stáhnete kompletní formátovaný materiál ve formátu PDF.
boolean rv;
rv = *target;
*target = true;
return rv;
}
Funkce TSL přečte proměnnou target, nastaví ji na TRUE a vrátí původní
hodnotu.
Funkce je atomická, čtení a zápis se provádí jako jediná, nedělitelná,
nepřerušitelná operace!!!
A7B38UOS Úvod do operačních systémů 06 - Procesy a vlákna - synchronizace
Synchronizace – příklad TestAndSet
Použití funkce TestAndSet():
boolean TestAndSet(boolean *target);
boolean lock = false;
while (TestAndSet(&lock)) ;
critical section
lock = false;
remainder section
A7B38UOS Úvod do operačních systémů 06 - Procesy a vlákna - synchronizace
Aktivní a pasivní čekání
Aktivní čekání
Spin-lock = zámek s aktivním čekáním = proměnná + operace
lock/unlock
výsledek operace TestAndSet() se ukládá do proměnné
aktivní čekání (busy waiting) při zamčeném zámku (procesor je
„zbytečně“ vytěžován)
jeden proces/vlákno spinlock uzamkne a vstoupí do kritické sekce
další procesy/vlákna čekají ve smyčce a testují stav zámku nebo
vykonávají jinou činnost
po opuštění kritické sekce proces/vlákno zámek odemkne – tím se
uvolní vstup do KS pro další čekající proces/vlákno
A7B38UOS Úvod do operačních systémů 06 - Procesy a vlákna - synchronizace
Aktivní čekání - spinlock
Aktivní čekání
Použití spin-lock:
v případě, kdy se proces nesmí uspat (např. obsluha přerušení)
při zamykání na velmi krátkou dobu (nízká časová režie)
Spin-lock má smysl hlavně na víceprocesorovém počítači!!!
A7B38UOS Úvod do operačních systémů 06 - Procesy a vlákna - synchronizace
Pasivní čekání
Pasivní čekání
pokud je zámek uzamčen, proces/vlákno se „uspí“, přesune do
blokovaného stavu (blocked, sleeping, waiting)
změnu stavu (uspání/probuzení) řeší OS
OS poskytuje tzv. synchronizační primitiva = datová struktura +
synchronizační operace (semafor, mutex, monitor)
A7B38UOS Úvod do operačních systémů 06 - Procesy a vlákna - synchronizace
Semafor
synchronizační objekt obsahující čítač a frontu čekajících
procesů/vláken
hodnota semaforu se pohybuje od nuly do specifikované maximální
hodnoty
Poskytuje 3 atomicky prováděné operace:
Init(): Čítač se nastaví na zadané číslo (většinou 1) a fronta se
vyprázdní.