Documente Academic
Documente Profesional
Documente Cultură
Programare concurent
Process pi;
Begin
repeat
SCi;
SNCi;
forever
End;
Excluderea reciproc
Trebuie ndeplinite urmtoarele condiii
Excluderea reciproc propriu-zis
La fiecare moment de timp cel mult un proces s se afle n
seciunea sa critic;
Competiia constructiv
Dac nici un proces nu este n seciunea sa critic i exist
procese care doresc s intre n seciunile lor critice, atunci unul
dintre ele va intra efectiv
procesele nu se mpiedic unul pe altul s intre n seciunile critice
(nu sunt prea egoiste);
procesele nu se invit la nesfrit unul pe altul s ntre n
seciunile lor critice (nu sunt prea altruiste);
Conexiunea liber
Dac un proces ntrzie n seciunea sa necritic, aceasta nu
trebuie s mpiedice alt proces s ntre n seciunea sa critic
dac dorete acest lucru.
Soluie utiliznd memoria comun
Avem nevoie de un set de instruciuni care ar
gestiona memoria comun la intrare i ieire din
seciune critic
Process pi;
Begin
repeat
protocol_de_intrare_i;
SCi;
protocol_de_ieire_i;
SNCi;
forever
End;
Prima ncercare Dijkstra
program Variant1;
var sel: integer;
BEGIN
sel:=1;
cobegin
P1; P2;
coend
END.
A doua ncercare Dijkstra
program Variant2;
var ind1, ind2: boolean;
process P1; process P2;
begin begin
repeat repeat
while ind2 do null; while ind1 do null;
ind1:=true; ind2:=true;
SC1; SC2;
ind1:=false; ind2:=false;
SNC1; SNC2;
forever forever
end; end;
BEGIN
ind1:=false; ind2:=true;
cobegin
P1; P2;
coend
END.
A treia ncercare Dijkstra
program Variant3;
var ind1, ind2: boolean;
process P1; process P2;
begin begin
repeat repeat
ind1:=true; ind2:=true;
while ind2 do null; while ind1 do null;
SC1; SC2;
ind1:=false; ind2:=false;
SNC1; SNC2;
forever forever
end; end;
BEGIN
ind1:=false; ind2:=false;
cobegin
P1; P2;
coend
END.
A patra ncercare Dijkstra
program Variant4;
var ind1, ind2: boolean;
process P1; process P2;
begin begin
repeat repeat
ind1:=true; ind2:=true;
while ind2 do while ind1 do
begin ind1:=false; ind1:=true; end; begin ind2:=false; ind2:=true; end;
SC1; SC2;
ind1:=false; ind2:=false;
SNC1; SNC2;
forever forever
end; end;
BEGIN
ind1:=false; ind2:=false;
cobegin
P1; P2;
coend
END.
SEMAFOARELE I TEHNICILE DE
SINCRONIZARE
Semafoare
Edsger Dijkstra
Metod clasic pentru restricionarea accesului la resursele
partajate
V(Semaphore s) // verhogen
{
s := s+1;
}
Init(Semaphore s, Integer v)
{
s := v;
}
Semafor n C#
wait(sem);
if a[i,j] = 1 then if (k<2) or (k>4) then a[i,j]:=0;
end;//end type Cell
BEGIN
for i:=0 to n+1 do a[0,i]:=0; for i:=0 to n+1 do a[m+1,i]:=0;
for i:=0 to m do a[i,0]:=0; for i:=0 to m do a[i,n+1]:=0;
process Control;
nr:=0; initial(mutex,1); initial(sem,0); var i: integer;
cobegin begin
for i:=1 to m do
for j:=1 to n do C[i,j](i,j);
while nr<n*m do null;
Control; for i:=1 to m*n do
coend; signal(sem)
END.
end; //end process
Sincronizarea activitilor
Semnalizare
Rendez-vous
Mutex
Multiplex
Bariera
Semnalizare
Semnalizare, signaling
este procedeul utilizat n cazul cnd dorim s asigurm o
execuie a unei secvene de instruciuni din diferite fire
concurente
Rendez-vous
Rendez-vous
este procedeul utilizat n cazul cnd dorim s ne asigurm
c la un moment dat de execuie un fir s atepte alt fir, i
viceversa.
Mutex
Excluderea reciproc, mutex
este procedeul utilizat n cazul cnd dorim s asigurm
excluderea reciproc
Multiplex
Multiplex
este procedeul utilizat n cazul cnd avem m fire de execuie
i dorim s permitem accesul n seciuni critice la un numr
mai mic sau egal de n fire, i n<m.
Bariera
Bariera
este procedeul care soluioneaz problema Rendez-vous
generalizat (n sens c numrul de fire este mai mare de 2).
U turnant,
turnstile
Unele structuri .Net de sincronizare
Construct Purpose Cross- Overhead*
process?
AutoResetEvent Allows a thread to Yes 1000ns
unblock once when
it receives a signal
from another
ManualResetEvent Allows a thread to Yes 1000ns
ManualResetEventSlim(introduced unblock indefinitely - 40ns
in Framework 4.0) when it receives a
signal from another
(until reset)
CountdownEvent (introduced in Allows a thread to - 40ns
Framework 4.0) unblock when it
receives a
predetermined
number of signals
Barrier (introduced in Framework Implements a - 80ns
4.0) thread execution
barrier
[source] http://www.albahari.com/threading
AutoResetEvent
[source] http://www.albahari.com/threading
ManualResetEvent
[source] http://www.albahari.com/threading
CountdownEvent
[source] http://www.albahari.com/threading
Barrier
Barrier
Thread Safety
[source] http://www.albahari.com/threading
Structuri .Net de sincronizare
Construct Purpose Cross- Overhead*
process?
AutoResetEvent Allows a thread to Yes 1000ns
unblock once when
it receives a signal
from another
ManualResetEvent Allows a thread to Yes 1000ns
ManualResetEventSlim(introduced unblock indefinitely - 40ns
in Framework 4.0) when it receives a
signal from another
(until reset)
CountdownEvent (introduced in Allows a thread to - 40ns
Framework 4.0) unblock when it
receives a
predetermined
number of signals
Barrier (introduced in Framework Implements a - 80ns
4.0) thread execution
barrier
[source] http://www.albahari.com/threading
PROBLEME CLASICE DE
CONCUREN
Problema Productor-consumator
Consum
Produce Buffer
e
Problema Productor-consumator
Productorul produce articole care sunt aezate pe o band.
Consumatorul ia de pe band articole i le consum.
Condiii adiionale:
productorul poate produce un articol la orice moment de timp;
consumtorul poate prelua un articol doar dac banda este nevid;
ordinea n care produsele sunt preluate de pe band de ctre
consumator coincide cu ordinea n care sunt aezate pe band de ctre
productor;
Analizm problema
in/out
[in]
procedure put(ch: char);
begin
buffer[in] := ch;
in := 1 + (in mod lung);
end;
[out]
procedure get(var ch:char);
begin
ch := buffer[out];
out := 1 + (out mod size);
end;
Analizm problema
Analizm problema
BEGIN
initial(disp, size);
initial(prod,0);
initial(Mutex,1);
out:=1; in:=1;
cobegin
Producer; Consumer
coend
END.
Productor-consumator (Pascal-FC)
program PC;
const size=4;
var buffer: array[1..size] of char; out, in: integer; prod, disp, Mutex : semaphore;
Drop
Produce Consume
<<buffer>>
Producer-consumer (Java, oracle.com)
public class Drop {
}
Producer-consumer (Java, oracle.com)
public class Consumer implements Runnable {
private Drop drop;
}
}
Thread-safe collections in .Net
[source] http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx
Problema filosofilor chinezi
Formularea problemei:
La o mas rotund stau 5 filozofi chinezi. Principala lor
activitate este cea de a gndi, dar evident din cnd n cnd
trebuie s mnnce, folosind pentru aceasta cte dou
beioare.
tiind c ntre oricare doi filozofi se afl un beior i c un
filozof poate mnc doar dac a ridicat de pe mas att
beiorul din stnga sa, ct i beiorul din dreapta sa, se
cere de simulat activitile filozofilor aezai la mas.
Problema filosofilor chinezi
Se menioneaz
Doar un filosof poate
lua beiorul ntr-un
moment de timp
Nici un filosof nu trebuie
s flmnzeasc
ateptnd beioarele
S fie posibil ca
numrul filosofilor ce
mnnc la un moment
de timp s fie mai mare
dect unu
Analizm problema
Problema filosofilor chinezi
program Filozofi; var Fil: array[1..nf] of filoszofi;
const nf=5;
var i:integer; BEGIN
b: array[1..nf] of semaphore; for i:=1 to nf do initial(b[i],1);
cobegin
process type filozofi(i: integer); for i:=1 to nf do Fil[i](i);
coend
begin
END.
repeat
sleep(random(2));
wait(b[i]);
wait(b[(i mod nf) + 1]);
sleep(random(1));
signal(b[i]);
signal(b[(i mod nf) + 1]);
forever
end;
Care-i problema?
Problema filosofilor chinezi
program Filozofi;
const nf=5; var Fil: array[1..nf] of filoszofi;
var i:integer;
b: array[1..nf] of semaphore; BEGIN
ScaunLiber: semafore; for i:=1 to nf do initial(b[i],1);
Initial(ScaunLiber,nf-1);
process type filozofi(i: integer); cobegin
begin for i:=1 to nf do Fil[i](i);
repeat coend
sleep(random(2)); END.
wait(ScaunLiber);
wait(b[i]);
wait(b[(i mod nf) + 1]);
sleep(random(1));
signal(b[i]);
signal(b[(i mod nf) + 1]);
signal(ScaunLiber);
forever
end;
Problema cititori-scriitori
Formularea problemei
Se consider o carte la care au acces mai muli cititori
i mai muli scriitori. Este permis ca mai muli cititori s
aib acces simultan la coninutul crii, dar dac un
scriitor opereaz asupra crii (completeaz, terge,
modific etc.) atunci nici un alt scriitor i nici un alt cititor
nu au acces la carte.
deci
un cititor poate ncepe operaia de citire dac i
numai dac nici un scriitor nu este n curs de a scrie
n carte;
un scriitor poate ncepe operaia de scriere dac i
numai dac nici un cititor i nici un alt scriitor nu
acces la carte.
Problema cititori-scriitori
Scriitor
Cititor
Cititori-scriitori (no-starve solution)
Cititor
Scriitor
ReaderWriterLock Class (C#)
ReaderWriterLock rwl = new ReaderWriterLock();
int Value= 0;
rwl.ReleaseReaderLock(); rwl.ReleaseWriterLock();
//Release Lock
}
}
Problema Brbierului Somnoros
Formularea problemei
Prvlia unui brbier este format din dou
camere: cea de la strad folosit ca sal de
ateptare i cea din spate n care se gsete
scaunul pe care se aeaz clienii pentru a fi
brbierii. Dac nu are clieni, brbierul
somnoros se culc...
Condiii adiionale
Dac la venirea unui client n sala de ateptare
nu sunt locuri libere, clientul pleac
Brbierul somnoros: sugestii
Barber
Customer
Santa
Elves
Reindeer
Emitter Receptor
BroadcastChannel.send() Receptor.wait()
Receptor.signal(nRec) BroadcastChannel.receive()
Problema Emitor-Receptori
Emitter Receptor
BroadcastChannel.send() Receptor.wait()
Receptor.signal(nRec) BroadcastChannel.receive()
Emitter.wait() Mutex.wait()
receptors+=1
if receptors == nRec:
Emitter.signal()
Mutex.signal()
Problema Emitor-Receptori
AllReceptors.wait()
Mutex.wait() Receptor
Emitter
receptors-=1
if receptors == 0
Emitter.signal()
else
AllReceptors.signal()
Emitter.wait() Mutex.signal()
BroadcastChannel.send() Receptor.wait()
Receptor.signal(nRec) BroadcastChannel.receive()
Mutex.wait()
receptors+=1
if receptors == nRec:
AllReceptors.signal()
Mutex.signal()