130 likes | 314 Views
13AMP. 5. přednáška Ing. Martin Molhanec, CSc. Co jsme se naučili naposled. Semafor – pokračování Semafor – řešení (Dekker, Djikstra) Pasivní a aktivní semafor Funkce Sleep, WakeUp, … DEADLOCK Postupový prostor. PROCESS A Wait(sem) ;. PROCESS B Signal(sem);. Synchronizace procesů.
E N D
13AMP 5. přednáška Ing. Martin Molhanec, CSc.
Co jsme se naučili naposled • Semafor – pokračování • Semafor – řešení (Dekker, Djikstra) • Pasivní a aktivní semafor • Funkce Sleep, WakeUp, … • DEADLOCK • Postupový prostor
PROCESS A Wait(sem); PROCESS B Signal(sem); Synchronizace procesů Init(sem)=0; Proces A čeká na proces B
PROCES A Signal(X); Wait(Y); PROCES B Signal(Y); Wait(X); Vzájemné čekání Init(Y,0); Init(X,0); Procesy A a B na sebe vzájemně čekají!
KONZUMENT Wait(obsazeno); Get(buffer); Signal(volno); PRODUCENT Wait(volno); Put(buffer); Signal(obsazeno); 3 2 1 Init(obsazeno,0); buffer Init(volno,3);
PROCES A Send(zprava); PROCES B Receive(zprava); Zasílání zprávSend, Receive
PROCES A Receive(B); Send(A); PROCES B Receive(A); Send(B); Zasílání zprávPozor na DEADLOCK! ŘEŠENÍ:TIMOUTReceive čeká učenou dobu, pak se ukončí a uživatel musí tento stav ošetřit.
MAILBOX A B MAILBOX SEND RECV. Message Queue Proces Queue
MAILBOX mailbox = record MsgQ, ProcQ: queue; end; Procedure send(var mbox: mailbox, msg: pointer); Function Receive(var mbox: mailbox): pointer;
SEND Procedure Send(var mbox: mailbox, msg: pointer); Begin MsgEnqueue(msg, mbox); if not ProcQEmpty(mbox) then WakeUp(mbox.ProcQ); else Sleep(ReadyQueue); End;
RECEIVE (synchronní) Function receive(var mbox: mailbox):pointer; Begin if not MsgQEmpty(mbox) then receive := MsgDequeue(mbox); else Sleep(mbox.ProcQ); end; End;
RECEIVE (asynchronní) Function receive(var mbox: mailbox):pointer; Begin if not MsgQEmpty(mbox) then receive := MsgDequeue(mbox); else receive := nil; end; End;
KONEC Dneska to bylo nějak krátké