Documente Academic
Documente Profesional
Documente Cultură
Probleme clasice.
Ciprian Dobre
ciprian.dobre@cs.pub.ro
Semafoare
V (verhogen = to increment)
semnaleaz apariia unui eveniment (incrementeaz
semaforul)
P (proberen = to test)
ntrzie un proces pn la producerea unui eveniment
(decrementeaz semaforul)
Seciuni critice
Problema
Fiecare proces P(i) al unei colecii de procese P(i:1..n) execut ciclic o
seciune critic n care are acces exclusiv la anumite resurse partajate
urmat de o seciune necritic n care folosete doar resurse locale.
Soluie
var mutex: sem := 1;
co P(i:1..n)::
do true ->
P(mutex); /* acaparare seciune critic */
Seciune critic;
V(mutex); /* eliberare seciune critic */
Seciune necritic
od
oc
Exemplu executie
Sectiune
critica
time
Productori i consumatori
Problema
Se consider M productori i N consumatori care comunic printr-un singur
tampon partajat.
T
Am loc?
T
Am ce prelua?
Productori i consumatori
Soluia
var buf: T; /* T tipul datelor */
var gol: sem := 1, plin: sem := 0; /* sem binare */
co Productor (i: 1..M)::
var v: T;
var w: T;
do true ->
do true ->
v := produce();
P(plin);
P(gol);
w := buf;
buf := v;
V(gol);
V(plin);
semnalizare
od;
oc
consum(w);
od;
oc
/* semafoare generale */
kxT
Am loc?
T
Am ce prelua?
var
var
var
var
sectiune critica
co Productor(i:1..M)::
var v: T;
do true ->
v := produce();
P(gol);
P(mutexP);
buf[ultim] := v;
ultim := ultim mod k + 1;
V(mutexP);
V(plin);
od;
oc
Problema filozofilor
Socrate
co Filozof (i:1..5)::
do true ->
ia beioare;
mnnc;
elibereaz beioare;
gndete;
od
oc
Descartes
Confucius
4
3
3
Platon
Eliade
2
DEADLOCK
Socrate
Confucius
4
3
3
Eliade
2
zona de memorie
(resursa critica)
sectiune critica
zona de memorie
(resursa critica)
nr = 0
nr = 1
nr = 2
Proces Writer:
Incrementarea nw e condiionat de (nr == 0 && nw == 0)
/*
/*
/*
/*
/*
/*
/*
Problema brbierului
Problema:
O frizerie cu un brbier, un
scaun de brbier, n scaune
de ateptare.
Cnd nu sunt clieni,
brbierul doarme.
Cnd sosete un client fie
trezete brbierul, fie
ateapt dac acesta e
ocupat.
Dac toate scaunele sunt
ocupate, clientul pleac.
https://www.youtube.com/watch?v=APfn72TeUkA
Pas 1
clienti
BarbierGata
Pas 2
clienti
BarbierGata
Pas 3
clienti
BarbierGata
Pas 4
clienti
BarbierGata
atomicitate
co Brbier::
do true ->
P(Clieni);
co
sincronizare cu Client
/* se caut un client;
dac exist, este chemat */
P(Scaune);
/* are client, va modifica
NumrScauneLibere */
NumrScauneLibere++; /* se elibereaz un scaun */
V(BrbierGata);
/* brbierul e gata s tund */
V(Scaune);
/* a terminat de modificat
NumrScauneLibere */
/* Brbierul tunde... */
od
atomicitate
co Client(i:1..m)
do true ->
P(Scaune);
oc
sincronizare cu Barbier
/* clientul ncearc s obin
un scaun liber */
if NumrScauneLibere > 0 -> /* exist un scaun disponibil? */
NumrScauneLibere--;
/* clientul se aaz */
V(Clieni);
/* se anun brbierul c s-a
ocupat un scaun */
V(Scaune);
/* se renun la accesul asupra
NumrScauneLibere */
P(BrbierGata);
/* clientul ateapt pentru a
fi tuns */
/* Clientul e tuns... */
[] NumrScauneLibere == 0 ->/* nu sunt scaune libere */
V(Scaune);
/* elibereaz mutexul */
/* Clientul pleac netuns... */
fi
od
Sumar
Dezvoltarea algoritmilor folosind variabile
partajate (MIMD)
Semafoare
Seciuni critice
Probleme:
Productori i consumatori
Problema filozofilor
Problema cititorilor i scriitorilor
Problema brbierului
Quiz
Cum ati implementa o bariera folosind semafoare?
Ex. (suma elementelor unui vector):
var a: array [1:n] of int;
co suma (k:1..n)::
fa j := 1 to sup(log 2 ) ->
if k mod 2j = 0 ->
a[k] := a[k-2j-1] + a[k]
fi
barrier
af
oc
Nu dati inca lucrarea ...
Functioneaza ???
DEADLOCK!
P(paper)
P(match)
P(tobacco)
P(paper)
Quiz
Ganditi-va la o solutie pentru evitarea
deadlock-ului
ntrebri?