Documente Academic
Documente Profesional
Documente Cultură
Sisteme de operare
Lect. Dr. Ozten CHELAI
Procesul A Procesul B
TRAP
SO
Read
Write
Procesul B
Procesul A
6 f6
IN=8 7 f7
8
Procesul B Procesul lp
(daemonul de
imprimare)
9
10
Exemplu de problema de partajare a memoriei
Procesul C
. . .
// Citeşte conŃinutul variabilei comune IN într-o variabilă locală procesului C, varC
varC = IN
Anterior zona comună fusese plină, ceea ce a determinat
if (varC == MAX) blocarea procesului P. Procesul C a eliberat o locaŃie din
SLEEP() zona comună deci trebuie lansat semnalul de deblocare.
else {
// consumă
if (varC == 0)
WAKEUP()
varC ++
IN = varC
}
Metode de realizare a excluderii mutuale - Fara aşteptare activă
Deoarece sistemul functionează în regim de timesharing, întreruperea generată de
încheierea unei cuante de timp poate să apară oriunde în logica proceselor.
Sa analizăm cazul în care întreruperea apare după ce procesul P a citit valoarea
variabilei IN şi aceasta a fost 0.
Urmărind codurile proceselor P şi C se obŃin următoarele rezultate:
. . .Proces P
// Citeşte conŃinutul variabilei comune IN într-o variabilă locală procesului P, varP
varP = IN
Dacă în acest moment apare întreruperea datorată expirării cuantei de timp alocată
procesului P, sistemul de operare va salva contextul procesului P, deci şi conŃinutul
variabilei locale varP = 0. La un moment ulterior va preda controlul procesului C care
va executa următoarea secvenŃă de cod :
. . .Proces C
// Citeşte conŃinutul variabilei comune IN care nu a fost încă modificat de procesul
P
varC = IN //varC=0
if (varC == MAX)
SLEEP()
else {// consumă
if (varC == 0)
WAKEUP() //Se lansează semnalul de deblocare fără ca în
prealabil procesul P să fi lansat semnalul de blocare.
varC ++
IN = varC }
La un moment dat şi procesului C îi expiră cuanta de timp.
Metode de realizare a excluderii mutuale - Fara aşteptare activă
După un oarecare timp procesul P va fi din nou planificat pentru execuŃie. În acest moment
sistemul de operare reface contextul procesului P, context care conŃine şi variabila varP = 0.
//Proces P
if (varP == 0)
SLEEP() ///varP = 0 deci P consideră că nu există locaŃie liberă în zona comună a.î.
se va bloca
else {// produce
varP--
if (varP == MAX-1)
WAKEUP()
IN = varP}
Ca rezultat al acestor operaŃii procesul P este blocat. Semnalul WAKEUP lansat anterior de către
procesul C s-a pierdut în sensul că nu a condus la deblocarea procesului P deaorece a fost lansat
înainte ca P să se blocheze. În continuare, la planificarea proceselor va participa doar C care va
consuma toate locaŃiile zonei comune până când IN = MAX.
//Proces C Citeşte conŃinutul variabilei comune IN asupra căreia procesul P, blocat, nu
mai poate acŃiona şi care, după MAX accese ale procesului C devine 0
varC = IN
if (varC == MAX)
SLEEP() //varC = MAX deci mai nu există locaŃie ocupată în zona comună a.î. C se
va bloca, nemaiavând informaŃii de “consumat
else {// consumă
if (varC == 0)
WAKEUP()
varC ++
IN = varC}
Când IN redevine MAX ambele procese sunt blocate, astfel încât nu există posibilitatea
lansării unui semnal WAKEUP care să le permită deblocarea. Problema a aparut pentru că
P nu a încheiat operaŃiile asupra variabilei comune IN (testare şi modificare) înainte ca
procesul C să fi preluat controlul procesorului. Aceasta a condus la pierderea semnalului
WAKEUP lansat de procesul C.
SoluŃia constă în a Ńine evidenŃa semnalelor SLEEP şi WAKEUP.
Metode de realizare a excluderii mutuale - Fara aşteptare activă
SEMAFORUL