41
Docsity.com Семафори Семафори

Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Embed Size (px)

Citation preview

Page 1: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

СемафориСемафори

Page 2: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 2/41

СемафориСемафори

• Семафор је ненегативна целобројна променљива

на којој су дефинисане операције:• wait( s) испитује да ли вредност семафора sзадовољава услов s>0 и ако је услов задовољенонда се декрементира вредност семафора (s=s-1), а ако није, онда се чека док се тај услов неиспуни. Провера задовољености услова s>0 идекрементирање вредности семафора се

обављају атомски.• signal( s) инкрементира вредност семафора

(s=s+1). Инкрементирање вредности семафора сеобавља атомски.

• init( s, val) поставља почетну вредност (s= val)

Page 3: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 3/41

СемафориСемафори

wait(s)if s>0 then

s=s-1else beginЗаустави процес и стави га у стање чекања код ОС

Стави процес у ред чекања на семафору sОслободи процесор

end

Page 4: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 4/41

СемафориСемафори

signal(s)if ред чекања на семафору s празан (односно s==0) then

s=s+1else beginУклони први процес из реда чекања на семафору s

Активирај тај процес код ОС

end

Page 5: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

ЗадациЗадаци

Page 6: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 6/41

ReadersReaders –– WritersWriters pproblemroblem

program Readers_Writers;var mutex : semaphore;

db : semaphore; reader_count : integer;

procedure Reader(ID : integer );begin

while (true ) dobegin

wait (mutex); reader_count := reader_count + 1; if (reader_count = 1) then wait (db); signal (mutex); read_db; wait (mutex); reader_count := reader_count - 1; if (reader_count = 0) then signal(db);signal (mutex);

endend ;

Page 7: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 7/41

ReadersReaders –– WritersWriters pproblemroblem

procedure Writer(ID : integer );begin

while (true ) dobegin

create_data; wait (db); write_db; signal (db);

end;end;begin

init (mutex, 1); init (db, 1); reader_count := 0;cobegin

Writer(0);Writer(1);Reader(0);Reader(1);Reader(2);

coend;end.

Page 8: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 8/41

ProducerProducer –– ConsumerConsumer pproblemroblem

program Producer_Consumer;const BufferSize = 3;var mutex : semaphore ;

empty : semaphore ;full : semaphore ;

procedure Producer(ID : integer );var item : integer ;begin

while (true ) dobegin

make_new(item);wait (empty);wait (mutex);put_item(item);signal (mutex);signal (full);

end ;end ;

Page 9: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 9/41

ProducerProducer –– ConsumerConsumer pproblemroblem

procedure Consumer(ID : integer );var item : integer ;begin

while (true ) dobegin

wait (full);wait (mutex);remove_item(item); signal (mutex);signal (empty);consume_item(item);

end ;end ;

Page 10: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 10/41

ProducerProducer –– ConsumerConsumer pproblemroblem

begininit (mutex,1);init (empty, BufferSize);init (full, 0);cobegin

Producer(0);...Consumer(0);...

coend ;end .

Page 11: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 11/41

AtomicAtomic broadcastbroadcast problemproblem

Постоји један произвођач и N потрошача који делезаједнички једноелементни бафер. Произвођачубацује производ у бафер и чека док свих N потрошача не узму исти тај производ. Тадазапочиње нови циклус производње.

Page 12: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 12/41

AtomicAtomic broadcastbroadcast problemproblem

program AtomicBroadcast;const N = 5;var mutex : semaphore ;

empty : semaphore ;full : array [1..N] of semaphore ;num : integer ;index : integer ;

...procedure Producer;var item, index : integer ;begin

while (true ) dobegin

wait (empty);make_new(item);for index := 1 to N do signal (full[index]);

end ;end;

Page 13: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 13/41

AtomicAtomic broadcastbroadcast problemproblem

procedure Consumer(ID : integer );var item : integer ;begin

while (true ) dobegin

wait (full[ID]);wait (mutex);get_item(item); num := num + 1;if (num = N) thenbegin

signal (empty);num := 0;

end ;signal (mutex);consume_item(item);

end ;end;

Page 14: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 14/41

AtomicAtomic broadcastbroadcast problemproblem

begininit (mutex,1);init (empty, 1);for index := 1 to N do init (full[index], 0);num := 0;cobegin

Producer;Consumer(1);...Consumer(N);

coend;end.

Page 15: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 15/41

AtomicAtomic broadcastbroadcast problemproblem

Постоји један произвођач и N потрошача који делезаједнички бафер капацитета B. Произвођачубацује производ у бафер и то само у слободнеслотове на који чекају свих N потрошача. Свакипотрошач мора да прими производ у тачно ономредоследу у коме су произведени, мада различитипотрошачи могу у исто време да узимају различитеприозводе.

Page 16: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 16/41

AtomicAtomic broadcastbroadcast problemproblem

program AtomicBroadcastB;const N = 5;

B = 2;var mutex : semaphore ;

empty : semaphore ;full : array [1..N] of semaphore ;

buffer : array [1..B] of integer ;num : array [1..B] of integer ;readFromIndex : array [1..N] of integer;writeToIndex : integer;

index : integer ;

Page 17: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 17/41

AtomicAtomic broadcastbroadcast problemproblem

procedure put_item(var item : integer );begin

buffer[writeToIndex] := item;writeToIndex := (writeToIndex mod B) + 1;

end;procedure Producer;var item, index : integer;begin

while (true ) dobegin

wait (empty);make_new(item);put_item(data);for index := 1 to N do signal (full[index]);

end ;end ;

Page 18: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 18/41

AtomicAtomic broadcastbroadcast problemproblem

procedure Consumer(ID : integer );var item : integer;begin

while (true ) dobegin

wait (full[ID]);wait (mutex);

item := buffer[readFromIndex[ID]];get_item(item, ID);

num[readFromIndex[ID]] := num[readFromIndex[ID]] + 1;if (num[readFromIndex[ID]] = N) thenbegin

signal (empty);num[readFromIndex[ID]] := 0;

end;readFromIndex[ID]:= (readFromIndex[ID] mod B) + 1;signal (mutex);consume_item(item);

end ;end ;

Page 19: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 19/41

AtomicAtomic broadcastbroadcast problemproblem

begininit (mutex,1);init (empty, B);for index := 1 to N do init (full[index], 0);for index := 1 to N do readFromIndex[index] := 1;writeToIndex := 1;

cobeginProducer;Consumer(1);...Consumer(N);

coend ;end .

Page 20: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 20/41

DiningDining philosophersphilosophers problemproblem

Пет филозофа седи око стола. Сваки филозофнаизменично једе и размишља. Испред свакогфилозофа је тањир шпагета. Када филозофпожели да једе, он узима две виљушке које сеналазе уз његов тањир. На столу, међутим, имасамо пет виљушки. Значи, филозоф може да једесамо када ниједан од његових суседа не једе. Написати алгоритам за филозофа (0<=i<=4).

Page 21: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 21/41

DiningDining philosophersphilosophers problem problem -- 11

program Dining_philosophers;const n = 5;var ticket: semaphore;

fork: array [0..n-1] of semaphore ;I: integer;

procedure think; begin ... end ;procedure eat; begin ... end ;

Page 22: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 22/41

DiningDining philosophersphilosophers problem problem -- 11

procedure Philosopher(i : integer );var left, right: integer;begin

left := i;right := (i + 1) mod n;while (true) do

beginthink;wait (ticket);wait (fork[left]);wait (fork[right]);eat;signal (fork[right]);signal (fork[left]);signal (ticket)

endend;

Page 23: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 23/41

DiningDining philosophersphilosophers problem problem -- 11

begininit (ticket, n-1 );for i:=0 to n-1 do init (fork[i],1);cobegin

Philosopher(0);Philosopher(1);Philosopher(2);Philosopher(3);Philosopher(4);

coendend.

Page 24: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 24/41

DiningDining philosophersphilosophers problem problem -- 22

program Dining_philosophers;const n = 5;var ticket: semaphore ;

fork: array [0..n-1] of semaphore ;i: integer;

procedure think; begin ... end ;procedure eat; begin ... end ;

Page 25: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 25/41

DiningDining philosophersphilosophers problem problem -- 22

procedure Philosopher(i : integer );var firstodd, secondeven: 0..n-1;begin

if (i mod 2 = 1) then beginfirstodd := i;secondeven := (i+1) mod n

endelsebegin

firstodd := (i+1) mod n;secondeven := i

end;while (true) do begin

think;wait (fork[firstodd]);wait (fork[secondeven]);eat;signal (fork[firstodd]);signal (fork[secondeven])

endend;

Page 26: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 26/41

DiningDining philosophersphilosophers problem problem -- 22

beginfor i:=0 to n-1 do init (fork[i],1);cobegin

Philosopher(0);Philosopher(1);Philosopher(2);Philosopher(3);Philosopher(4)

coendend .

Page 27: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 27/41

The The diningdining savagessavages problemproblem

Племе људождера једе заједничку вечеру из казанакоји може да прими M порција куваних мисионара. Када људождер пожели да руча онда се он сампослужи из заједничког казана, уколико казан нијепразан. Уколико је казан празан људождер будикувара и сачека док кувар не напуни казан. Ниједозвољено будити кувара уколико се налази бармало хране у казану. Користећи семафоренаписати програм који симулира понашањељудождера и кувара.

Page 28: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 28/41

The The diningdining savagessavages problemproblem

program DiningSavages;const M =…;var cook: semaphore ;

savager: semaphore ;mutex: semaphore ;servings: shared integer;

procedure PrepareLunch; begin …endprocedure GetServingFromPot; begin …end

procedure SavageCook;begin

while (true) dobegin

wait (cook);PrepareLunch;signal (savager)

end;end;

Page 29: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 29/41

The The diningdining savagessavages problemproblem

procedure Savage(i : integer );begin

while (true) dobegin

wait (mutex);if (servings = 0) thenbegin

signal (cook);wait (savager);servings := M;

end;servings := servings - 1;GetServingFromPot ;signal (mutex);

end;eat;

end;

Page 30: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 30/41

The The diningdining savagessavages problemproblem

beginservings := 0;init (cook, 0);init (savager, 0);init (mutex, 1);cobegin

SavageCook();Savage(1);Savage(2);...

coend;end.

Page 31: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 31/41

The H2O problemThe H2O problem

Постоје два типа атома, водоник и кисеоник, којидолазе до баријере. Да би се формирао молекулводе потребно је да се на баријери у истомтренутку нађу два атома водоника и један атомкисеоника. Уколико атом кисеоника дође добаријере на којој не чекају два атома водоникаонда он чека да се они сакупе. Уколико атомводоника дође до баријере на којој се не налазеједан кисеоник и један водоник он чека на њих. Баријеру треба да напусте два атома водоника иједан атом кисеоника. Користећи семафоренаписати програм који симулира понашањеводоника и кисеоника.

Page 32: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 32/41

The H2O problemThe H2O problem

program H2O;var

hydroSem : Semaphore ;hydroSem2 : Semaphore ;hydroMutex : Semaphore ;oxySem : Semaphore ;oxyMutex : Semaphore ;count : integer;

procedure Oxygen(i : integer );begin

signal (hydroSem);signal (hydroSem);wait (oxyMutex);wait (oxySem);bond (i);signal (oxyMutex);

end ;

Page 33: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 33/41

The H2O problemThe H2O problem

procedure Hydrogen(i : integer );begin

wait (hydroSem);wait (hydroMutex);count := count + 1;if (count = 2) thenbegin

signal (oxySem);signal (hydroSem2);signal (hydroSem2);count := 0

end;signal (hydroMutex);wait (hydroSem2);bond (i)

end;

Page 34: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 34/41

The H2O problemThe H2O problem

begininit (hydroSem, 0);init (hydroSem2, 0);init (hydroMutex, 1);init (oxySem, 0);init (oxyMutex, 1);count := 0;cobegin

Oxygen(1);Oxygen(2);...Hydrogen(1);Hydrogen(2);...

coend;end.

Page 35: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 35/41

The The childchild carecare problemproblem

У неком забавишту постоји правило које каже да сена свака три детета мора наћи барем једнаваспитачица . Родитељ доводи једно или вишедеце у забавиште. Уколико има места оставља их, уколико не одводи их. Васпитачица сме данапусти забавиште само уколико то не нарушаваправило. Написати процедуре, користећисемафоре, за родитеље који доводе и одводедецу и васпитачици и иницијализовати почетнеуслове.

Page 36: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 36/41

The The childchild carecare problemproblem

program ChildCare;const C = 3;var numChild : integer ;

numNann : integer ;numWaiting : integer ;mutex : semaphore;confirm : semaphore;toLeave : semaphore;

function bringUpChildren ( num : integer ) : boolean ;begin

wait (mutex);if ((numChild + num) <= C * numNann) thenbegin

numChild := numChild + num;bringUpChildren := true ;

endelse

bringUpChildren := false ;signal (mutex);

end ;

Page 37: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 37/41

The The childchild carecare problemproblem

procedure bringBackChildren ( num : integer );

var out, i : integer;begin

wait (mutex);

numChild := numChild - num;

out : = numNann - (numChild + C - 1) / C;if (out > numWaiting) then out := numwaiting;

for i := 0 to out dobegin

signal (toLeave);wait (confirm);

endsignal (mutex);

end;

Page 38: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 38/41

The The childchild carecare problemproblem

procedure nannEnter();begin

wait (mutex);numNann := numNann + 1;if (numWaiting > 0) thenbegin

signal (toLeave);wait (confirm);

endsignal (mutex);

end;

Page 39: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 39/41

The The childchild carecare problemproblem

procedure nannExit();begin

wait (mutex);if (numChild <= C * (numNann - 1)) thenbegin

numNann := numNann - 1;signal (mutex);

endelsebegin

numWaiting := numWaiting + 1signal (mutex);wait (toLeave);numNann := numNann - 1;numWaiting := numWaiting - 1signal (confirm);

endend;

Page 40: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

© ЕТФ 2008 40/41

The The childchild carecare problemproblem

beginnumChild := 0;numNann := 0;numWaiting := 0;init(mutex, 1);init(confirm, 0);init(toLeave, 0);cobegin...coend ;

end.

Page 41: Semafori Konkurentno i Distribuirano Programiranje Slajdovi Racunarska Tehinka i Informatika

Docsity.com

ПитањаПитања??

Захарије Радивојевић

Електротехнички Факултет

Универзитет у Београду

[email protected]