Upload
srdjan-smrkic
View
91
Download
3
Embed Size (px)
Citation preview
Docsity.com
СемафориСемафори
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)
Docsity.com
© ЕТФ 2008 3/41
СемафориСемафори
wait(s)if s>0 then
s=s-1else beginЗаустави процес и стави га у стање чекања код ОС
Стави процес у ред чекања на семафору sОслободи процесор
end
Docsity.com
© ЕТФ 2008 4/41
СемафориСемафори
signal(s)if ред чекања на семафору s празан (односно s==0) then
s=s+1else beginУклони први процес из реда чекања на семафору s
Активирај тај процес код ОС
end
Docsity.com
ЗадациЗадаци
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 ;
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.
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 ;
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 ;
Docsity.com
© ЕТФ 2008 10/41
ProducerProducer –– ConsumerConsumer pproblemroblem
begininit (mutex,1);init (empty, BufferSize);init (full, 0);cobegin
Producer(0);...Consumer(0);...
coend ;end .
Docsity.com
© ЕТФ 2008 11/41
AtomicAtomic broadcastbroadcast problemproblem
Постоји један произвођач и N потрошача који делезаједнички једноелементни бафер. Произвођачубацује производ у бафер и чека док свих N потрошача не узму исти тај производ. Тадазапочиње нови циклус производње.
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;
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;
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.
Docsity.com
© ЕТФ 2008 15/41
AtomicAtomic broadcastbroadcast problemproblem
Постоји један произвођач и N потрошача који делезаједнички бафер капацитета B. Произвођачубацује производ у бафер и то само у слободнеслотове на који чекају свих N потрошача. Свакипотрошач мора да прими производ у тачно ономредоследу у коме су произведени, мада различитипотрошачи могу у исто време да узимају различитеприозводе.
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 ;
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 ;
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 ;
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 .
Docsity.com
© ЕТФ 2008 20/41
DiningDining philosophersphilosophers problemproblem
Пет филозофа седи око стола. Сваки филозофнаизменично једе и размишља. Испред свакогфилозофа је тањир шпагета. Када филозофпожели да једе, он узима две виљушке које сеналазе уз његов тањир. На столу, међутим, имасамо пет виљушки. Значи, филозоф може да једесамо када ниједан од његових суседа не једе. Написати алгоритам за филозофа (0<=i<=4).
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 ;
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;
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.
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 ;
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;
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 .
Docsity.com
© ЕТФ 2008 27/41
The The diningdining savagessavages problemproblem
Племе људождера једе заједничку вечеру из казанакоји може да прими M порција куваних мисионара. Када људождер пожели да руча онда се он сампослужи из заједничког казана, уколико казан нијепразан. Уколико је казан празан људождер будикувара и сачека док кувар не напуни казан. Ниједозвољено будити кувара уколико се налази бармало хране у казану. Користећи семафоренаписати програм који симулира понашањељудождера и кувара.
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;
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;
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.
Docsity.com
© ЕТФ 2008 31/41
The H2O problemThe H2O problem
Постоје два типа атома, водоник и кисеоник, којидолазе до баријере. Да би се формирао молекулводе потребно је да се на баријери у истомтренутку нађу два атома водоника и један атомкисеоника. Уколико атом кисеоника дође добаријере на којој не чекају два атома водоникаонда он чека да се они сакупе. Уколико атомводоника дође до баријере на којој се не налазеједан кисеоник и један водоник он чека на њих. Баријеру треба да напусте два атома водоника иједан атом кисеоника. Користећи семафоренаписати програм који симулира понашањеводоника и кисеоника.
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 ;
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;
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.
Docsity.com
© ЕТФ 2008 35/41
The The childchild carecare problemproblem
У неком забавишту постоји правило које каже да сена свака три детета мора наћи барем једнаваспитачица . Родитељ доводи једно или вишедеце у забавиште. Уколико има места оставља их, уколико не одводи их. Васпитачица сме данапусти забавиште само уколико то не нарушаваправило. Написати процедуре, користећисемафоре, за родитеље који доводе и одводедецу и васпитачици и иницијализовати почетнеуслове.
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 ;
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;
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;
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;
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.
Docsity.com
ПитањаПитања??
Захарије Радивојевић
Електротехнички Факултет
Универзитет у Београду