13amp

Post on 07-Jan-2016

39 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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 Presentation

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