13amp
Post on 07-Jan-2016
39 Views
Preview:
DESCRIPTION
TRANSCRIPT
13AMP13AMP
5. 5. přednáškapřednáška
Ing. Martin Molhanec, CSc.Ing. Martin Molhanec, CSc.
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
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;;
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í!
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);
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);
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.
MAILBOXMAILBOX
MAILBOXBA
SENDSEND RECVRECV..
MessageQueue
ProcesQueue
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;
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;
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;
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;
KONECKONEC
Dneska to Dneska to bylo nějak bylo nějak krátké krátké
top related