13amp
DESCRIPTION
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ů. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/1.jpg)
13AMP13AMP
5. 5. přednáškapřednáška
Ing. Martin Molhanec, CSc.Ing. Martin Molhanec, CSc.
![Page 2: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/2.jpg)
Co jsme se naučili Co jsme se naučili naposlednaposled Semafor Semafor – pokračování– pokračování Semafor – řešení (Dekker, Semafor – řešení (Dekker,
Djikstra)Djikstra) Pasivní a aktivní semaforPasivní a aktivní semafor Funkce Sleep, WakeUp, …Funkce Sleep, WakeUp, … DEADLOCKDEADLOCK Postupový prostorPostupový prostor
![Page 3: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/3.jpg)
Synchronizace procesůSynchronizace procesů
PROCESS APROCESS A
Wait(sem)Wait(sem);;
PROCESS BPROCESS B
Signal(sem);Signal(sem);
Proces Proces AA čeká na proces čeká na proces BB
Init(sem)=0Init(sem)=0;;
![Page 4: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/4.jpg)
Vzájemné čekáníVzájemné čekání
PROCES APROCES A
Signal(X);Signal(X);
Wait(Y);Wait(Y);
PROCES BPROCES B
Signal(Signal(YY));;
Wait(X);Wait(X);
Init(Y,0);Init(Y,0);
Init(X,0);Init(X,0);
Procesy Procesy AA a a BB na sebe vzájemně na sebe vzájemně čekají!čekají!
![Page 5: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/5.jpg)
KONKONZUMENTZUMENT
WaitWait(obsazeno);(obsazeno);
Get(buffer);Get(buffer);
Signal(volno);Signal(volno);
PRODUCENTPRODUCENT
Wait(volno);Wait(volno);
Put(buffer);Put(buffer);
Signal(obsazenoSignal(obsazeno););
3 2 1
bufferbufferInitInit(obsazeno,0)(obsazeno,0);;
InitInit(volno,3);(volno,3);
![Page 6: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/6.jpg)
Zasílání zprávZasílání zprávSend, ReceiveSend, Receive
PROCES APROCES A
Send(zprava);Send(zprava);
PROCES BPROCES B
Receive(zprava);Receive(zprava);
![Page 7: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/7.jpg)
Zasílání zprávZasílání zprávPozor na Pozor na
DEADLOCK!DEADLOCK!
PROCES APROCES A
ReceiveReceive(B);(B);
Send(Send(AA););
PROCES BPROCES B
Receive(Receive(AA););
Send(B);Send(B);
ŘEŠENÍ:ŘEŠENÍ: TIMOUTTIMOUTReceive čeká učenou dobu, pak se ukončí a Receive čeká učenou dobu, pak se ukončí a
uživatel uživatel musí tento stav ošetřit.musí tento stav ošetřit.
![Page 8: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/8.jpg)
MAILBOXMAILBOX
MAILBOXBA
SENDSEND RECVRECV..
MessageQueue
ProcesQueue
![Page 9: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/9.jpg)
MAILBOXMAILBOX
mailboxmailbox = record = recordMsgQ, ProcQ: queueMsgQ, ProcQ: queue;;
end;end;
Procedure send(var mbox: mailbox, msg: Procedure send(var mbox: mailbox, msg: pointer);pointer);
Function Receive(var mbox: mailbox): pointer;Function Receive(var mbox: mailbox): pointer;
![Page 10: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/10.jpg)
SENDSEND
Procedure Send(var mbox: mailbox, msg: Procedure Send(var mbox: mailbox, msg: pointer);pointer);
BeginBegin
MsgEnqueue(msg, mbox);MsgEnqueue(msg, mbox);
if not ProcQEmpty(mbox) thenif not ProcQEmpty(mbox) then
WakeUp(mbox.ProcQ);WakeUp(mbox.ProcQ);
elseelse
Sleep(ReadyQueue);Sleep(ReadyQueue);
End;End;
![Page 11: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/11.jpg)
RECEIVE RECEIVE (synchronní)(synchronní)
Function receive(var mbox: mailbox):pointer;Function receive(var mbox: mailbox):pointer;
BeginBegin
if not MsgQEmpty(mbox) thenif not MsgQEmpty(mbox) then
receive := MsgDequeue(mbox);receive := MsgDequeue(mbox);
elseelse
Sleep(mbox.ProcQ);Sleep(mbox.ProcQ);
end;end;
End;End;
![Page 12: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/12.jpg)
RECEIVE RECEIVE (asynchronní)(asynchronní)
Function receive(var mbox: mailbox):pointer;Function receive(var mbox: mailbox):pointer;
BeginBegin
if not MsgQEmpty(mbox) thenif not MsgQEmpty(mbox) then
receive := MsgDequeue(mbox);receive := MsgDequeue(mbox);
elseelse
receive := nilreceive := nil;;
end;end;
End;End;
![Page 13: 13AMP](https://reader036.vdocuments.pub/reader036/viewer/2022083006/56813f0f550346895da9941b/html5/thumbnails/13.jpg)
KONECKONEC
Dneska to Dneska to bylo nějak bylo nějak krátké krátké