Monitor (synchronizace)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 17. dubna 2021; kontroly vyžadují 3 úpravy .

Monitor  - v programovacích jazycích vysokoúrovňový mechanismus pro interakci a synchronizaci procesů, který poskytuje přístup ke sdíleným zdrojům. [1] Přístup k synchronizaci dvou nebo více počítačových úloh pomocí společného zdroje, obvykle hardwaru nebo sady proměnných .

Při multitaskingu založeném na monitoru kompilátor nebo interpret transparentně vloží kód zámku a odemknutí do vhodně formátovaných rutin, transparentně pro programátora, čímž programátora šetří explicitním voláním synchronizačních primitiv.

Historie

Per Brinch Hansen byl první, kdo popsal a implementoval monitory a založil je na myšlenkách Hoare . Následně Hoare rozvinul teoretický rámec a ukázal jeho ekvivalenci se semafory (s použitím původní sémantiky). Nejprve vtělený do jazyka Concurrent Pascal a použitý ke strukturování meziprocesové komunikace v operačním systému Solo .

Vzájemná exkluzivita

Monitor se skládá z:

Procedura monitoru získá mutex před zahájením práce a podrží jej buď do ukončení procedury, nebo dokud se neočekává podmínka (viz níže). Pokud každá procedura zaručuje, že invariant je pravdivý před uvolněním mutexu, pak žádná úloha nemůže získat zdroj ve sporu.

Jednoduchý příklad. Zvažte monitor, který provádí transakce na bankovních účtech.

sledovat účet { int zůstatek := 0 funkce vybrat( int částka) { pokud částka < 0 pak chyba "Účet nemůže být záporný" else if zůstatek < částka pak chyba "Nedostatek prostředků" else zůstatek := zůstatek - částka } funkce vklad( int částka) { pokud částka < 0 pak chyba "Částka nemůže být záporná" jinak zůstatek := zůstatek + částka } }

Invariant zde jednoduše říká, že zůstatek musí odrážet všechny minulé transakce, než začne nová transakce. Obvykle to není vyjádřeno v kódu, ale je to implikováno a může být uvedeno v komentářích . Existují však programovací jazyky, jako je Eiffel nebo D , které mohou kontrolovat invarianty. Zámek je přidán kompilátorem. Díky tomu jsou monitory bezpečnější a pohodlnější než jiné přístupy, které vyžadují, aby programátor ručně přidal operace uzamčení-odemknutí, protože programátor je může zapomenout přidat.

Podmíněné proměnné

Aby se předešlo stavu aktivního čekání , musí si procesy vzájemně signalizovat očekávané události. Monitory poskytují tuto schopnost prostřednictvím proměnných podmínek . Když procedura monitorování vyžaduje, aby byla splněna určitá podmínka, aby mohla pokračovat, čeká na přidruženou proměnnou podmínky. Během čekání dočasně uvolní mutex a vypadne ze seznamu běžících procesů. Každý proces, který následně způsobí splnění této podmínky, použije proměnnou podmínky k upozornění čekajícího procesu. Oznámený proces znovu získá mutex a může pokračovat.

Následující monitor používá proměnné podmínek k implementaci kanálu mezi procesy, které mohou uložit pouze jednu celočíselnou hodnotu.

monitor channel { int content boolean full := false condition snd condition rcv function send( int message) { while full do wait(rcv) // Mesa sémantika: viz níže obsah := zpráva plný := pravda oznámit (snd) } funkce příjem() { var int přijato while not full do wait(snd) // Mesa sémantika: viz níže přijato := obsah plný := nepravdivý oznámit (rcv) přijatá vratka } }

Všimněte si, že protože čekání na podmínku uvolňuje zámek, musí proces čekání zajistit, aby byl splněn invariant, než začne čekat. Ve výše uvedeném příkladu platí totéž pro výstrahu.

Sémantika Hoare a Mesa

V raných implementacích monitorování (známých jako Hoare sémantika ) oznámení proměnné podmínky okamžitě probudí čekající proces a znovu získá zámek, čímž zajistí, že podmínka je stále pravdivá.

Implementace tohoto chování je složitá a velmi nadbytečná. Také není kompatibilní s preemptivním multitaskingem , kde může být proces přerušen v libovolném okamžiku. Z těchto důvodů výzkumníci vyvinuli mnoho dalších sémantik pro podmínkové proměnné.

V nejmodernějších implementacích (známých jako Mesa sémantika ) oznámení nepřeruší běžící proces, ale jednoduše uvede některé čekající procesy do stavu připravenosti. Proces oznamování pokračuje v držení zámku, dokud neukončí proceduru monitoru. Vedlejším efektem tohoto přístupu je to, že proces oznamování nemusí sledovat invariant před oznámením, ale proces čekání musí znovu zkontrolovat stav, na který čeká. Konkrétně, pokud procedura monitorování obsahuje výraz , může do monitoru vstoupit jiný proces po okamžiku upozornění a změnit hodnotu, než bude proces čekání pokračovat. Výraz by měl být přepsán takto: aby byla podmínka po čekání znovu zkontrolována. if test then wait(cv)testwhile test do wait(cv)

Implementace také poskytují operaci „notifyAll“ nebo „broadcast“, která upozorní všechny procesy čekající na danou podmínku. Tato operace je užitečná například tehdy, když více procesů čeká na dostupnost různého množství paměti. Uvolnění paměti umožní jednomu z nich pokračovat v práci, ale plánovač nemůže vědět, který z nich.

Příklad implementace proměnné podmínky:

conditionVariable { int queueSize = 0; zámek mutex; semafor čekání; čekat() { lock.acquire(); queueSize++; lock.release(); čekání.dolů(); } signál() { lock.acquire(); while (velikost fronty > 0){ queueSize--; čekání.up(); } lock.release(); } }

Aplikace

Programovací jazyky, které podporují monitory:

Viz také

Poznámky

  1. Pershikov V.I., Savinkov V.M. Vysvětlující slovník informatiky / Recenzenti: Cand. Fyzikální matematika Sci. A. S. Markov a Dr. Phys.-Math. vědy I. V. Pottosin. - M. : Finance a statistika, 1991. - 543 s. — 50 000 výtisků.  - ISBN 5-279-00367-0 .
  2. Alan Burns, Andy Wellings. Souběžné programování a programování v reálném čase v Ada . - Cambridge University Press, 2007-07-05. - S. 44. - 476 s. — ISBN 9781139464352 .
  3. PJ Muller. Systém aktivních objektů. Návrh a multiprocesorová implementace. - ETH Curych, 2002

Literatura

Odkazy