Sunteți pe pagina 1din 63

Programare n reea

Programare concurent

Interaciunea proceselor concurente


Catedra Automatic i Tehnologii Informaionale
Lector superior, magistru Antohi Ionel
Excluderea reciproc
Formularea problemei
Se dau n procese p1, p2, pn care trebuie executate
concurent, fiecare coninnd o seciune critic SCi i o
seciune necritic SNCi, care se succed la infinit:

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;

process P1; process P2;


begin begin
repeat repeat
while sel=2 do null; while sel=1 do null;
SC1; SC2;
sel:=2; sel:=1;
SNC1; SNC2;
forever forever
end; end;

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

P(Semaphore s) // proberen, passeer, pakken


{
wait until s > 0, then s := s-1;
}

V(Semaphore s) // verhogen
{
s := s+1;
}

Init(Semaphore s, Integer v)
{
s := v;
}
Semafor n C#

Semaphore Class ,http://msdn.microsoft.com


using System; using System.Threading;
public class Example
{
private static Semaphore _pool;
public static void Main()
{
_pool = new Semaphore(0, 3);
for(int i = 1; i <= 5; i++)
{
new Thread(new ParameterizedThreadStart(Worker)).Start(i);
}
Thread.Sleep(500);
Console.WriteLine("Main thread calls Release(3).");
_pool.Release(3);
Console.WriteLine("Main thread exits.");
}

private static void Worker(object num) {


Console.WriteLine("Thread {0} begins " +
"and waits for the semaphore.", num);
_pool.WaitOne();
Console.WriteLine("Thread {0} releases the semaphore.", num);
Console.WriteLine("Thread {0} previous semaphore count: {1}",
num, _pool.Release());
}
}
Problem
Jocul vieii (Conway's Game of Life) o variaie:
Un tabel dreptunghiular a cu m linii i n coloane
conine celule care pot fi vii sau moarte.
Fiind dat o configuraie a tabelului, se cere s se
calculeze configuraia generaiei urmtoare,
tiind c celulele moarte i pstreaz starea, iar o
celul vie moare dac i numai dac:
numrul celulelor vecine vii este mai mic dect
2 sau mai mare dect 4.
O celul are cel mult 8 vecini: pe orizontal, pe
vertical i pe diagonale.
Automate celulare: lupii i oile

Pascal BALLET, Sheep and Wolves [YouTube,


http://netbiodyn.tuxfamily.org/]
Jocul vieii
program Joc;
var m, n, nr, i, j: integer; mutex, sem: semaphore;
a: array[0...5,0..5] of integer;

process type Cell(i, j: integer);


var k:integer;
begin
if a[i,j]=1 then
k:=a[i,j+1] + a[i-1,j+1] + a[i-1,j] + a[i-1,j-1] + a[i,j-1] + a[i+1,j-1] + a[i+1,j] +
a[i+1,j+1];

wait(mutex); nr:=nr+1; signal(mutex);

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

peerApp#1 Sending peerApp#2

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;

process Producer; process Consumer;


var ch:char; var ch:char;
begin begin
for ch=a to z do repeat
begin
wait(disp); wait(prod);
wait(Mutex); wait(Mutex);
put(ch); get(ch);
write(P, ch, ); write(C, ch, );
signal(Mutex); signal(Mutex);
signal(prod); signal(disp);

end; until ch=z;


end; end;
Buffer size:1
Language: Java

Drop
Produce Consume
<<buffer>>
Producer-consumer (Java, oracle.com)
public class Drop {

private String message;


private boolean empty = true;

public synchronized String take() public synchronized void put(String m)


{ {
while (empty) { while (!empty) {
try { wait(); } try { wait(); }
catch catch (InterruptedException e) {}
(InterruptedException e) {} } }
empty = true; empty = false;
notifyAll(); this.message = m;
return message; notifyAll();
} }
}//class
Producer-consumer (Java, oracle.com)
public class Producer implements Runnable {
private Drop drop;

public Producer(Drop drop) {


this.drop = drop;
}

public void run() {


String importantInfo[] = { A", B, C", D };

for (int i = 0; i < importantInfo.length; i++) {


drop.put(importantInfo[i]);
}
drop.put("DONE");
}

}
Producer-consumer (Java, oracle.com)
public class Consumer implements Runnable {
private Drop drop;

public Consumer(Drop drop) {


this.drop = drop;
}

public void run() {


for ( String message = drop.take();
!message.equals("DONE");
message = drop.take()) {

System.out.format("MESSAGE RECEIVED: ", message);

}
}
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;

public void ReadValue() public void WriteValue(object value)


{ {
//Accquire Reader Lock. rwl.AcquireWriterLock(Timeout.Infinite);
rwl.AcquireReaderLock(Timeout.Infinite); Console.WriteLine("Writer start:" + Value);
Console.WriteLine("Read start:+ Value);
Value = (int) value; //Writing
Console.WriteLine("Read end); Console.WriteLine("Writer End:" + Value);

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

The Little Book of Semaphores by Allen B. Downey


Brbierul somnoros: sugestii

Barber
Customer

The Little Book of Semaphores by Allen B. Downey


Problema lui Santa
Formularea problemei
Undeva la Polul Nord se zice c triete Santa Claus.
Anul mprejur se odihnete (doarme). Se trezete cnd
toi cei 9 reni magici ai si revin de Crciun din tropice
sau careva din pitici ntimpin greuti la fabricarea
jucriilor. Piticii trebuie s pstreze odihna efului i
pot s-l trezeasc doar cnd sunt trei la numr.
Condiii adiionale
Renii vor fi nhmai doar dup ce Santa va pregti
sania
Dup sosirea celor trei pitici Santa, dei trezit de ei,
va fi cel care i va exprima primul dorina de a ajuta
Ali pitici ce se vor ajutai vor atepta revenirea
ultimului, din cei trei ajutai.
Problema lui Santa: sugestii

Santa

The Little Book of Semaphores by Allen B. Downey


Problema lui Santa: sugestii

Elves
Reindeer

The Little Book of Semaphores by Allen B. Downey


Problema fumtorilor
Formularea problemei
Se consider 3 fumtori, fiecare avnd n
cantitate nelimitat unul din produsele
necesare fabricrii unei igri: hrtie, tutun
i chibrituri. Un vnztor le pune la
dispoziie dou din produsele menionate.
Persoana care are produsul ce lipsete le
ia i fabric igara i o fumeaz. Abia apoi
vnztorul poate oferi alte dou dintre cele
trei obiecte.
Analizm problema fumtorilor
Problema Emitor-Receptori
Formularea problemei
Un emitor emite succesiv nEmi mesaje,
fiecare dintre ele care trebuind s fie
recepionat de toi cei nRec receptori
nainte ca emitorul s transmit mesajul
urmtor
Problema Emitor-Receptori

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()

S-ar putea să vă placă și