You are on page 1of 12

Ing.

Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

Programmazione concorrente

Si parla i programmazione !concorrente! "#an o $i realizzano programmi c%e e$eg#ono contemporaneamente e interagi$cono #rante la loro e$ec#zione. In "#e$to capitolo ill#$treremo i problemi c%e e&e a''rontare c%i $i occ#pa ella programmazioni i Si$temi Operati&i( o com#n"#e i altri c%e ebbano la&orare contemporaneamente a altri . )i* &err+ 'atto in generale( an an o in ettaglio $olo epi$o icamente. ,a programmazione concorrente - #na nece$$it+ in erogabile per i programmatori el Si$tema Operati&o. al contrario( i programmatori i applicazioni /#tente non $ono normalmente intere$$ati ai problemi i concorrenza( c%e &engono ri$olti in mo o tra$parente1 al S.O.. Il recente $&il#ppo ei $i$temi m#ltiproce$$ore e i "#elli i$trib#iti %a contrib#ito a portare anc%e agli alti li&elli i a$trazione la po$$ibilit+ i ri$ol&ere i problemi ella programmazione concorrente. 0#an o - #n"#e nece$$ario $cri&ere programmi c%e abbiano il ma$$imo ell/e''icienza( $opratt#tto "#an o e$tinati a $i$temi m#ltiproce$$ore( allora anc%e il programmatore i applicazioni o&r+ 'ar ricor$o alla programmazione concorrente. ,/a$petto pi1 i''icile ella programmazione concorrente - il eb#gging. In'atti i programmi c%e %anno acce$$o contemporaneo alle ri$or$e po$$ono '#nzionare bene per la gran parte el tempo e bloccar$i impro&&i$amente $olo "#an o accae #na $peci'ica( #nica( $e"#enza i e&enti( magari molto improbabile a &eri'icar$i. 0#e$to $igni'ica tro&ar$i i 'ronte a cra$% impro&&i$i e !mi$terio$i! elle applicazioni( molto i''icili a ripro #r$i 2. Gli errori ipen ono all/or ine( ca$#ale( con c#i $i pre$entano gli e&enti c%e eterminano i cambiamenti nelle ri$or$e con i&i$e. Se i programmi concorrenti non $ono $critti in mo o accorto anc%e #n piano i te$t molto acc#rato p#* ri$#ltare in#tile e i $i$temi po$$ono pre$entare errori $o'tware o&#ti a #na particolare $e"#enza i e&enti( c%e non $i - mai pre$entata #rante t#tta la 'a$e i te$t.

Concorrenza
2e'iniamo il concetto i concorrenza come3

)oncorrenza3 pre$enza i pi1 atti&it+ $im#ltanee.


In #n $i$tema m#ltiprogrammato i proce$$i c%e e&ono 'are #n #$o com#ne i alc#ne elle ri$or$e el $i$tema( $i icono !proce$$i concorrenti! 4 a !conc#rrent!( c%e $igni'ica !$im#ltaneo!5. Nel ca$o( t#tto $ommato raro( in c#i programmi concorrenti non interagi$cano( non ci $ono i''erenze $o$tanziali nella loro programmazione( ri$petto ai programmi or inari. in&ece t#tto cambia "#an o i programmi concorrenti $i in'l#enzano reciprocamente #rante la loro e$ec#zione( per e$empio mo i'ican o entrambi la $te$$a &ariabile. ,/in'l#enza reciproca 'ra #e programmi $i realizza attra&er$o la competizione o la cooperazione nell/#$o elle ri$or$e. )ome gi+ e'inito nel )apitolo !proce$$i!( #e proce$$i in competizione $i i$p#tano l/#$o ella ri$or$a( mentre #e proce$$i cooperanti la #$ano !in$ieme!. ,a pro$ec#zione ell/e$ec#zione i entrambi i tipi i programmi concorrenti - in'l#enzata alle interazioni 'ra i e$$i( perci* $e "#alco$a non '#nziona - in pericolo la po$$ibilit+ $te$$a c%e i programmi '#nzionino. Nel 'ar '#nzionare pi1 !atti&it+! contemporaneamente( $orgono tre tipi i problemi( c%e la programmazione concorrente e&e ri$ol&ere3 - pa$$aggio a #n proce$$o all/altro - protezione i #n proce$$o agli altri proce$$i - $incronizzazione elle atti&it+ ei proce$$i( per 'arli com#nicare e per e&itare errori i primi #e problemi $ono "#a$i $empre !a$$orbiti! al Si$tema Operati&o( c%e $i 'a carico ello $c%e #ling( e&ent#almente ella preemption e c%e realizza $pazi i memoria $eparati e protetti per i proce$$i 4non per i t%rea 65. ,/#ltimo problema e&e e$$ere la$ciato al programmatore( perc%7 ogni programma concorrente ric%ie e i trattare a $#o mo o la $incronizzazione ei proce$$i. 2etermini$mo 8n S.O. %a #n comportamento non etermini$tico9 perc%7 e&e 'ar 'ronte agli #tenti e ai loro programmi( c%e $i $#cceono in $e"#enze non note a priori. Peraltro i programmi e&ono $empre '#nzionare nello $te$$o mo o( non po$$ono are ri$#ltati i&er$i in ba$e all/or ine con c#i $ono $tati e$eg#iti. 2#n"#e i programmi in'ormatici e&ono e$$ere etermini$tici.

1 in In'ormatica( !tra$parente! - etto i "#alco$a c%e $&olge le $#e '#nzioni ! i na$co$to!( $enza a&ere alc#n e''etto &i$ibile 2 per poter !ri&e ere! la $e"#enza i e&enti c%e %a $catenato #n errore i programmazione concorrente potrebbe o&er e$$ere nece$$ario ricorrere a #n em#latore in circ#ito 4I):( &e i ;ol#me 15. 9 2etermini$tico3 <<

0= progr concorrente.o t

;er. 0.>.0 2012-0>-1?

p. 1 i 12

Ing. Gabriele MONTI

www.ingmonti.it

0#an o i programmi la&orano contemporaneamente p#* in&ece ar$i il ca$o( $pe$$o improbabile( c%e il ri$#ltato elle i$tr#zioni e$eg#ite po$$a ipen ere all/or ine con c#i le i$tr#zioni $on $tate e$eg#ite. 0#e$to p#* acca ere $e nei programmi e$i$tono elle con izioni i !cor$a!.

1.0.1

Corse

8na con izione molto pericolo$a c%e $i p#* $&il#ppare "#an o $i %anno ri$or$e con i&i$e 'ra proce$$i concorrenti - la !cor$a! o !cor$a critica! 4!race con ition!5. 8na cor$a $i p#* $&il#ppare $e i proce$$i mo i'icano in or ine arbitrario la ri$or$a con i&i$a. 0#an o in #no o pi1 programmi e$i$te #na cor$a critica( e$i$te #na probabilit+ i&er$a a zero c%e #na ri$or$a( mo i'icata ai programmi( i&enti !incon$i$tente!. Nella programmazione concorrente la ri$or$a con i&i$a - "#a$i $empre il &alore i #na &ariabile( ma potrebbe anc%e e$ $ere il motore i #n robot controllato a pi1 i #n proce$$o o #na $tampante conte$a 'ra pi1 #tenti. Se #na &ariabile i&enta !incon$i$tente! il $#o &alore non - coerente( non ci $i p#* 'i are e il programma pro #ce ri$#ltati $bagliati. Se il motore i #n robot &iene pilotato in maniera incon$i$tente( il robot pren er+ a bloccar$i perc%7 $#bi$ce coman i i a&anti-in ietro $#cce$$i&i a i&er$i a programmi( e com#n"#e mani'e$ter+ #n comportamento impre icibile. Il termine !consistente! $i #$a in "#e$to ca$o con #n $igni'icato i&er$o a "#ello com#ne nella ling#a italiana( perc%7 pro&iene irettamente all/aggetti&o Ingle$e !con$i$tent!( c%e $igni'ica !regolare!( !coerente! o !a''i abile!.

:/ pre$ente #na !corsa" "#an o #e o pi1 programmi concorrono all/#$o ella $te$$a ri$or$a e esiste #na "#al$ia$i $e"#enza i i$tr#zioni ei #e programmi c%e p#* ren ere la ri$or$a incon$i$tente.
,a cor$a - #na con izione anomala c%e $i mani'e$ta a ca#$a i #na ipen enza ei programmi all/or ine e agli i$tanti in c#i acca ono certi e&enti. Se i programmi %anno #na cor$a( allora le ri$or$e po$$ono i&enire incon$i$tenti( anc%e $e la probabilit+ c%e ci* acca a $pe$$o molto ba$$a. Nella programmazione i #n Si$tema Operati&o il problema elle cor$e $i pre$enta pe$antemente( ato c%e e$i$tono #e con izioni c%e le ren ono pi1 probabili3 1. in #n $i$tema operati&o m#ltiprogrammato le IS@ ten ono a e$$ere pi1 l#ng%e( ato c%e( come abbiamo gi+ ill#$trato( e&ono 'are c%iamate al S.O. . 0#e$to 'atto p#* obbligare a abilitare il $i$tema /interr#zione #rante l/e$ec#zione elle IS@( per non la$ciare il comp#ter $enza interr#pt per troppo tempo. 2. #rante il cor$o ell/e$ec#zione ei proce$$i acca ono e&enti c%e( p#r non e$$en o irettamente collegati con interr#pt %ar ware( %anno elle caratteri$tic%e '#nzionali el t#tto $imili a e$$e 4e$. la !$o$pen$ione! i #n proce$$o( il $#o !ri$&eglio!5. 0#e$ti e&enti a&&engono $empre a interr#pt abilitati per c#i non &i - la !protezione! alle cor$e a$$ic#rata all/e$ec#zione elle IS@ a interr#pt i$abilita$ti. ;e iamo( con #n e$empio come po$$ono pre$entar$i problemi i cor$e.

1.0.2

Corse e consistenza delle variabili

8na prima co$a a notare - c%e #rante l/e$ec#zione i #n proce$$o le &ariabili el programma a$$#mono temporaneamente ei &alori non coerenti. Nella gran parte ei ca$i "#e$to 'atto non ca#$a a$$ol#tamente alc#n problema( ma e$i$tono rare occa$ioni nelle "#ali #n programma apparentemente ino''en$i&o na$con e errori $#b oli. Scri&iamo per e$empio #na linea i programma in )3
int contatore; .. contatore = contatore / 3; /* (1) */ ..

0#e$to ci ice c%e il &alore i contatore $#cce$$i&o all/i$tr#zione e&e e$$ere #n terzo el $#o &alore i prece ente. A prima &i$ta $embra c%e l/i$tr#zione ) &enga e$eg#ita t#tta !in$ieme!( in realt+ "#an o &err+ compilata $i tra$'ormer+ in i&er$e i$tr#zioni i macc%ina. In #na piatta'orma ?09?B( la tra #zione ella linea 415 $ar+ "#alco$a i $imile al $eg#ente3
.. MOV EDX, 0 MOV E"X, #contatore$ !D!V )O*D +,* 3 MOV #contatore$, E"X ; ; ; ; <1> <%> <3> <-> cancellazione della parte alta del di idendo (per !D!V) lett&ra della parte 'a((a di i(ione (critt&ra del ri(&ltato

..

p. 2 i 12

2012-0>-1?

0= progr concorrente.o t

Ing. Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

Nel programma in A$$emblC il conten#to ella &ariabile !contatore! non &iene aggiornato 'ino a DEF( mentre - gi+ calcolato in D9F. 2#n"#e 'ra D9F e DEF il conten#to i :A< e "#ello i !contatore! non $ono coerenti. Se !contatore! - #na &ariabile !locale!( e'inita nel proce$$o e c%e $olo al proce$$o p#* e$$ere mo i'icata( "#e$ta incoerenza non ar+ ne$$#n problema. In'atti( anc%e $e o&e$$e inter&enire #na preemption 'ra D9F e DEF( "#an o non c/ coerenza 'ra !contatore! e :A<( :A< non &err+ mo i'icato a altri e prima o poi &err+ ricopiato e$atto in !contatore!. Se in&ece !contatore! - #na &ariabile con i&i$a a #n altro proce$$o $im#ltaneo po$$ono $orgere ei problemi( in #n #nico ca$o !$'ort#nato!. Il ca$o - "#ello in c#i capita #na preemption proprio 'ra D9F e DEF( nel p#nto in c#i :A< e !contatore! non $ono coerenti. S#pponiamo ora c%e arri&i #n interr#pt %ar ware mentre il no$tro proce$$o $ta e$eg#en o l/i$tr#zione D9F . ,a IS@( c%e 'a parte el S.O.( &iene e$eg#ita e &iene lanciato il proce$$ $c%e #ler. S#pponiamo c%e e$$o eci a c%e il no$tro proce$$o non e&e pro$eg#ire e ia la )P8 a #n $econ o proce$$o( la$cian o il primo in atte$a. S#pponiamo in'ine c%e il $econ o proce$$o aggiorni #rante la $#a e$ec#zione il &alore i !contatore!. Al $#o $#cce$$i&o ri$&eglio il no$tro proce$$o e$eg#ir+ la DEF e $cri&er+ in !contatore! il &alore &ecc%io( c%e $i era calcolato prima c%e l/altro proce$$o aggiorna$$e !contatore! 4il &alore &ecc%io i :A< &iene ripri$tinato al e$crittore i proce$$o( in$ieme a t#tti gli altri regi$tri ella )P8( nel momento in c#i il no$tro proce$$o &iene n#o&amente e$eg#ito5. Il ri$#ltato - c%e l/aggiornamento el contatore 'atto al $econ o proce$$o - completamente per #to( - come $e non 'o$$e mai $tato 'atto. Siamo i 'ronte a #na cor$a. Si #$a ire c%e la &ariabile !contatore! non - pi1 !consistente!( con #n termine m#t#ato irettamente all/Ingle$e 4!con$i$tent!5( c%e $i p#* tra #rre( in #n migliore Italiano( come !coerente!. Si p#* notare c%e perc%7 $i &eri'ic%i "#e$to errore ebbono $#cce ere molte co$e( t#tto $ommato abba$tanza improbabili3 1. il S.O. e&e $po e$tare il no$tro proce$$o proprio 'ra D9F e DEF. 2. prima c%e il no$tro proce$$o e$eg#a i n#o&o e&e e$eg#ire #n proce$$o c%e p#* mo i'icare !contatore! 9. "#el proce$$o e&e mo i'icare !contatore! proprio ora. )ionon imeno non po$$iamo accettare c%e ci $ia #na probabilit+( $ia p#r ba$$a( c%e il programma non '#nzioni. )on$i eriamo c%e i programmi i oggi $i $cambiano la )P8 migliaia i &olte al $econ o( per c#i prima o poi la $e"#enza i e&enti $'ort#nati acca r+. 0#e$to &#ol ire c%e i programmi concorrenti o&ranno '#nzionare !$empre!( cio- in pre$enza i "#al$ia$i $e"#enza i e$ec#zione ei proce$$i. 2#n"#e3 Nella programmazione concorrente non $i p#* 'are alc#na ipote$i $#ll/or ine i e$ec#zione ei proce$$i. :$$i po$$ono e$$ere e$eg#iti in #n or ine "#al#n"#e( e $o$pe$i in ogni p#nto ella loro e$ec#zione( e - ci* c%e acca e e''etti&amente. )i c%ie iamo ora come $i p#* aggi#$tare il programma prece ente. ,/errore - o&#to al 'atto c%e #na $ingola i$tr#zione $critta in ) non &iene realizzata con #na $ola i$tr#zione i macc%ina( e - "#in i $#$cettibile i e$$ere interrotta in momenti inatte$i. Il programma in A$$emblC $arebbe $tato 'acilmente c#rabile in "#e$to mo o 4almeno in #n $i$tema a monoproce$$ore53
.. MOV E"X, #contatore$ ; ./! ; D!V )O*D +,* 3 ; MOV #contatore$, E"X ; 5,! ; ora c2e <%> lett&ra della parte 'a((a e ito l0interr&zione e 1&indi anc2e la pree3ption4 <3> di i(ione <-> (critt&ra del ri(&ltato la 3odi6ica a contatore 7 6inita, la(cio ancora interro3pere

..

2i$abilitan o il $i$tema elle interr#zioni abbiamo temporaneamente e&itato c%e altri proce$$i interrompe$$ero il no$tro( proprio nel momento critico in c#i e$$o 'a l/elaborazione e il $al&ataggio el &alore ella &ariabile com#ne. In "#e$to mo o in "#ella 'a$e critica ell/acce$$o a !contatore! i proce$$i o&ranno proce ere !#no alla &olta!. In "#alc%e mo o abbiamo re$o !in i&i$ibile! lett#ra( elaborazione e mo i'ica ella &ariabile !contatore!. Si p#* ire c%e abbiamo !sincronizzato! i proce$$i perc%7 abbiamo impe ito agli altri proce$$i i inter&enire al tempo $bagliato. Nat#ralmente l/inter&ento $#gli interr#pt( c%e ri$ol&e il problema in A$$emblC( - $como o programman o in )( e $pe$$o impo$$ibile negli altri ling#aggi. 2#n"#e $ono $tate in&entate tecnic%e pi1 a alto li&ello per i'en ere le ri$or$e con i&i$e all/inter&ento inopport#no i proce$$i concorrenti. Oltre al 'atto c%e non - realizzabile in ling#aggi a alto li&ello( c/- anc%e a notare c%e la $ol#zione i i$abilitare gli interr#pt - #n po/ troppo ra$tica( perc%7 impe i$ce la preemption non $olo ai proce$$i c%e tentano i mo i'icare !contatore! ma anc%e a t#tti gli altri( e anc%e alle IS@ ei i$po$iti&i6 8na b#ona $ol#zione al problema ella con$i$tenza ella &ariabili o&r+ pre&e ere c%e &enga impe ita la pro$ec#zione $olo a "#ei proce$$i c%e pro&ano a mo i'icare la &ariabile a ! i'en ere! e non a t#tti.

0= progr concorrente.o t

;er. 0.>.0 2012-0>-1?

p. 9 i 12

Ing. Gabriele MONTI

www.ingmonti.it

1.0.3

Operazioni atomiche

,/e$empio prece ente ci %a mo$trato come il ren ere !in i&i$ibile! #n/i$tr#zione %a c#rato #n errore i concorrenza. ,e tecnic%e c%e $i #$ano per proteggere l/#$o elle &ariabili com#ni 'anno $empre #$o i i$tr#zioni o i '#nzioni !in i&i$ibili!. )%iamiamo !istruzioni atomiche!E o !primitive! "#elle i$tr#zioni c%e non po$$ono e$$ere interrotte #rante la loro e$ec#zione. S#i $i$temi con #na $ola )P8 t#tte le i$tr#zioni i macc%ina $ono per loro nat#ra primiti&e( mentre le i$tr#zioni in ling#aggio a alto li&ello non lo $ono mai. 8tilizzan o piccoli programmi in A$$emblC( c%e e&ent#almente i$abilitano le interr#zioni( - po$$ibile co$tr#ire elle funzioni primitive 4meto i primiti&i5( $#lle "#ali po$$ono contare i ling#aggi a alto li&ello per raggi#ngere l/obbietti&o i $incronizzare i proce$$i. Oltre all/#$o i '#nzioni primiti&e( nelle )P8 mo erne $i p#* contare $# i$tr#zioni i macc%ina $peci'ic%e( in&entate proprio per la $incronizzazione ei proce$$i( c%e permettono i realizzare '#nzioni primiti&e $enza i$abilitare gli interr#pt. ,e '#nzioni primiti&e per la $incronizzazione permettono i ren ere or inato l/acce$o a #na ri$or$a( c%e non &err+ #$ata contemporaneamente ai proce$$i $im#ltanei c%e la &ogliono mo i'icare.
In sistemi multiprocessore le istruzioni di macchina non sono atomiche perch mentre una CPU esegue un'istruzione che prevede l'uso della memoria ci pu essere un'altra CPU che sta lavorando sulla stessa locazione. Per rendere atomiche le istruzioni di macchina bisogna che nessun'altra CPU abbia accesso simultaneo alla locazione che si sta modificando. Questo possibile aggiungendo una nuova linea al control !bus! del computer" che impedisca alle altre CPU di accedere alla memoria durante l'e#ecute di istruzione atomiche. $ell'architettura %&' esistono la linea ()C*+ ed il prefisso ,ssembl- ()C* .!blocca!/" che pu essere anteposto a certe istruzioni .es. ()C* 01C 2(ocazione3/. Quando un'istruzione preceduta dal prefisso ()C* durante tutta la sua fase di e#ecute il segnale ()C*+ viene tenuto alto e le altre CPU non possono accedere alla memoria. (a presenza di una linea ()C*+ alta pu" almeno in linea di principio" bloccare4 l'intera memoria" o il solo circuito integrato interessato dalla istruzione atomica oppure addirittura la sola" singola" locazione interessata. Ci dipende da come fatto l'hard5are del computer.

1.0.4

Sezioni critiche

Nel cor$o ella $toria ell/in'ormatica il problema ella realizzazione ell/acce$$o a ri$or$e in m#t#a e$cl#$ione %a tro&ato molte $ol#zioni intere$$anti( anc%e $e &ali e $olo parzialmente( $or&oliamo $# i e$$e e pa$$iamo a ill#$trare i concetti pi1 'econ i i3 !$ezione critica! e !$ema'oro!. Si c%iamano !sezioni critiche! le parti i co ice i #n programma c%e acce ono alla $te$$a ri$or$a a proce$$i i&er$i. Inten iamo per ri$or$a #na "#al$ia$i entit+ !c%e $er&e! al $i$tema. Po$$iamo 'ocalizzare meglio il concetto pen$an o a #na &ariabile con i&i$a. ,a !protezione! i #na $ezione critica e&e obbligare i proce$$i a acce ere in mo o or inato alle ri$or$e( eliminan o le cor$e critic%e e $al&ag#ar an o la con$i$tenza elle in'ormazioni. Nel ca$o ell/e$empio prece ente t#tta l/i$tr#zione in ling#aggio ) el p#nto 415 e&e e$$ere in$erita in #na $ezione critica( per proteggere la ri$or$a !contatore!. Gino a c%e t#tta l/i$tr#zione 415 non - $tata e$eg#ita e&e e$$ere impe ita l/e$ec#zione i t#tti gli altri proce$$i c%e &ogliono mo i'icare !contatore!. Peraltro( per non abba$$are l/e''icienza el comp#ter( $e #n proce$$o non tenta i mo i'icare !contatore! e&e poter e$eg#ire tran"#illamente. 0#in i #n proce$$o c%e entra #na $ezione critica p#* beni$$imo per ere la )P8 e e$$ere $o$pe$o( ba$ta c%e non lo 'accia a 'a&ore i proce$$i c%e tentano i mo i'icare !contatore!. Per entrare e #$cire a #na $ezione critica $ono $tate in&entate $peci'ic%e operazioni primiti&e. A ba$$o li&ello $i tratta i c%iamate al Si$tema Operati&o( mentre a alto li&ello $ono n#o&e i$tr#zioni e ic%iarazioni conten#te in #n ling#aggio i programmazione. 0#an o #n proce$$o &#ole entrare in #na $ezione critica c%ie e il perme$$o al S.O. con la c%iamata a #na i "#e$te '#nzioni primiti&e. alla 'ine ell/e$ec#zione ella $ezione critica il proce$$o e$eg#e #na i&er$a c%iamata per com#nicare al S.O. la concl#$ione. Se "#alc%e altro proce$$o $ta e$eg#en o la $ezione critica( il proce$$o c%e c%ie e i entrare &iene $o$pe$o e rimane in "#e$ta con izione 'ino a c%e l/altro proce$$o non com#nica c%e %a liberato la $ezione critica. Se in&ece la $ezione critica - libera il proce$$o p#* pro$eg#ire e e$eg#irla t#tta( poi com#nicare al S.O. la concl#$ione con la primiti&a i #$cita( in mo o c%e altri po$$ano entrare. Gig#ra 13
E ,etteralmente !atomico! 4 al greco5 $igni'ica !in i&i$ibile!

p. E i 12

2012-0>-1?

0= progr concorrente.o t

Ing. Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

Per e&itare "#e$ta e&enienza ba$ta c%e t#tti i proce$$i c%e #$ano !contatore! e'ini$cano elle $ezioni critic%e nei p#nti o&e inter&engono $#lla &ariabile.

1.0.5

Semafori

Il $ema'oro - #no $tr#mento per la realizzazione elle $ezioni critic%e. :/ #na &ariabile intera non negati&a( con i&i$a ai proce$$i intere$$ati( c%e e$$i mo i'icano con '#nzioni primiti&e( in mo o a $egnalare la loro pre$enza all/interno ella $ezione critica. Il nome !$ema'oro! pro&iene alla $egnalazione 'erro&iaria. S#pponiamo i a&ere #n ponte a binario #nico in #na linea a #e binari( come ill#$trato in Gig#ra 2. Per non ca#$are i$a$tri 'erro&iari l/acce$$o al ponte o&r+ e$$ere in m#t#a e$cl#$ione. Immaginiamo #na $it#azione in c#i #e treni( A e H $tiano approccian o l/acce$$o al ponte. Mentre $i a&&icinano il ponte - libero a altri treni e il $ema'oro - $pento. ,a $e"#enza egli e&enti c%e acca ono - la $eg#ente 1. A gi#nge all/imbocco el ponte e g#ar a il $ema'oro. - $pento 1.1. A accen e il $ema'oro 1.2. A entra nel ponte 2. H gi#nge all/imbocco el ponte e g#ar a il $ema'oro. - acce$o 2.1. H $i blocca 2.2. H contin#a a g#ar are il $ema'oro e rimane 'ermo 'ino a c%e e$$o non $i $pegne 9. A percorre il ponte 4$ezione critica5 E. A e$ce alla zona el ponte( 'ino a #na po$izione non pericolo$a E.1 A $pegne il $ema'oro >. H &e e il $ema'oro $pento >.1. H accen e il $ema'oro >.2. H entra nel ponte ..

Figura 2: mutua esclusione nell'accesso al ponte Si ice c%e l/acce$$o a #na ri$or$a con i&i$a a&&iene in !mutua esclusione! "#an o i proce$$i c%e po$$ono acce ere a "#ella ri$or$a lo po$$ono 'are $olo #no alla &olta 4i proce$$i $i e$cl# ono l/#n con l/altro 4m#t#amente5 nell/acce$$o alla ri$or$a5. ,e tecnic%e per l/a$$ic#razione ella m#t#a e$cl#$ione nell/acce$$o a #na ri$or$a &engono ette ! serializzazione! ell/acce$$o o anc%e !$e"#enzializzazione!. Analogo al $ema'oro 'erro&iario - il $ema'oro !in'ormatico!( c%e nat#ralmente a$$#mer+ la 'ig#ra i #n 'lag( o meglio i #n contatore( le c#i mo i'ic%e $ono e''ett#ate con operazioni primiti&e. 0= progr concorrente.o t ;er. 0.>.0 2012-0>-1? p. > i 12

Ing. Gabriele MONTI

www.ingmonti.it

,a $eg#ente e'inizione e$cri&e la 'orma pi1 $emplice i $ema'oro !in'ormatico!3 8n $ema'oro - #n contatore( con i&i$o in memoria 'ra i proce$$i c%e lo #tilizzano( c#i $i p#* a&ere acce$$o con #e $ole operazioni primiti&e( ette wait45 e $ignal45. 8n $ema'oro $er&e a $incronizzare l/e$ec#zione ei proce$$i c%e lo #tilizzano. wait() 4!atten i!5( in ica l/entrata nella $ezione critica e !signal()!( !$egnala!( etta anc%e !relea$e!( marca l/#$cita alla $ezione critica.

Funzionamento di un semaforo

2#n"#e #n $ema'oro - co$tit#ito a #na &ariabile intera non negati&a( con i&i$a( #$ata come #n contatore. Il &alore ella &ariabile el $ema'oro p#* e$$ere mo i'icato $olo tramite le '#nzioni primiti&e wait45 e $ignal45. 0#an o #n proce$$o e&e #$are #na ri$or$a protetta a #n $ema'oro a$petta $#l "#el $ema'oro( e$eg#en o la '#nzione wait45. ,a wait45 torna $olo "#an o la $ezione critica - libera. Altrimenti non torna( per #n tempo in eterminato. Al ritorno ella wait45 il proce$$o entra nella $ezione critica e la e$eg#e t#tta. Per !$egnalare! agli altri proce$$i c%e %a liberato la $ezione critica( e "#in i #no i e$$i p#* entrare( il proce$$o c%iama la '#nzione primiti&a $ignal45. wait45 e $ignal45 mo i'icano lo $tato ella &ariabile $ema'oro nel mo o in icato in Gig#ra 9( o&e - mo$trato #n co ice( e$pre$$o in p$e# o-)( c%e ill#$tra in linea i principio la realizzazione i wait45 e $ignal45.
int ( ; aria'ile (tatica del pro8ra33a, i(i'ile a t&tti i proce((i

oid .rea5e3a6oro (int () 9 // crea il (e3a6oro di no3e ( /* .. O+E*":!O;E +*!M!,!V" 1&i e(e8&e del codice c2e crea e inizializza la (tr&tt&ra dati del (e3a6oro, c2e co3prende al3eno la aria'ile ( (il <contatore< del (e3a6oro) oltre ad e ent&ali altri attri'&ti, c2e dipendono dall0i3ple3entazione e66etti a .. */ /* la > ( = 1; aria'ile (e3a6oro (() iene inizializzata a 1 ((e3a6oro 3&t&a3ente e(cl&(i o (3&te=, edi oltre)) */

>

oid ?ait(int () 9 // la ?ait opera (&l (e3a6oro c2e le iene pa((ato /* O+E*":!O;E +*!M!,!V" (e la (ezione critica 7 i3pe8nata il proce((o non procede nell0e(ec&zione in atte(a c2e e((a (i li'eri */ ?2ile (( == 0); // attesa attiva ./!; // il pro8ra33a e(cl&de 8li interr&pt, o 1&alco(a di e1&i alente (@@; 5,!; // il pro8ra33a a'ilita 8li interr&pt, o 1&alco(a di e1&i alente oid (i8nal(() 9 // la (i8nal opera (&l (e3a6oro c2e le iene pa((ato /* O+E*":!O;E +*!M!,!V" */ ./!; // il pro8ra33a e(cl&de 8li interr&pt, o 1&alco(a di e1&i alente (AA; /* B incre3entare la aria'ile (e3a6oro &ol dire a&3entare il n&3ero di proce((i c2e po((ono entrare nella (ezione critica */ 5,!; // il pro8ra33a a'ilita 8li interr&pt, o 1&alco(a di e1&i alente

>

Figura 3: implementazione di wait() e signal() su semafori In Gig#ra 9 !$! - la &ariabile $ema'oro. e$$a &iene e'inita in #na '#nzione )reaSema'oro45( c%e le a$$egna #n &alore iniziale i 1. )ome $i p#* &e ere wait45 $ottrae 1 al &alore el $ema'oro( ma lo 'a $olo "#an o p#*( cio- opo c%e il ciclo w%ile - 'inito e $i %a l/!a#torizzazione! all/ingre$$o nella $ezione critica. 2#n"#e la &ariabile $ non a$$#me mai &alori negati&i( perc%7 il proce$$o c%e pro&a a ecrementarla &iene bloccato "#ano il $ema'oro %a &alore zero( e ci* acca e 'ino a c%e il $ema'oro non &ale almeno #no. Il ciclo w%ile 4$ II 05 $embra non 'inire mai( perc%7 $e $ I 0 il programma gira nel ciclo e non ne p#* #$cire( ato c%e non mo i'ica $. Hi$ogna per* tener conto c%e $ p#* e$$ere mo i'icato a altri proce$$i concorrenti >( preci$amente al

>

,/interr#pt &iene i$abilitato 2OPO l/atte$a $#l $ema'oro

p. B i 12

2012-0>-1?

0= progr concorrente.o t

Ing. Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

primo c%e %a e$eg#ito la wait45( c%e %a tro&ato ancora $ II 1 e %a a&#to acce$$o alla $ezione critica. 0#e$to proce$$o pro$eg#ir+ 'ino alla $ignal45 e la e$eg#ir+. ,a $ignal45 a#menta il &alore i $( c%e i&enta 1. S#pponiamo c%e ci $iano altri proce$$i( 'ermi $#l ciclo w%ile 4$ II 05 ella loro wait45. Ora la &ariabile $ &ale #no per c#i il primo 'ra i proce$$i in atte$a c%e &iene $celto allo $c%e #ler p#* #$cire al $#o ciclo w%ile( e anc%e alla wait45( e acce ere alla $ezione critica. ;e iamo come $i p#* realizzare la $ezione critica $#l programma iniziale( #tilizzan o wait45 e $ignal45.
int contatore = CC; int (e3a6oro; .rea5e3a6oro ((e3a6oro); // DD // t&tte le olte c2e de o (cri // 3etto le operazioni relati e ?ait ((e3a6oro); // contatore = contatore / 3; // (i8nal((e3a6oro); // DD

<0> creazione del (e3a6oro (6&nzione pri3iti a (circa)) ere contatore, in (ezione critica <1> inizia la (ezione critica (3etodo pri3iti o) <%> e(ec&zione della (ezione critica <3> 6ini(ce la (ezione critica (3etodo pri3iti o)

;e iamo in ettaglio #na $e"#enza i e&enti nella "#ale #n proce$$o e&e atten ere $#lla wait45. S#pponiamo i a&ere #e proce$$i( PA e PH( e c%e entrambi i proce$$i e$eg#ano la $te$$a parte i co ice( "#ella in icata $opra B. S#pponiamo c%e la $ezione critica a e$eg#ire $i inizialmente libera e c%e il $ema'oro $ia m#t#amente e$cl#$i&o 4m#teJ5. 8na $e"#enza i e&enti potrebbe e$$ere la $eg#ente3 .. 0. Il &alore ella &ariabile $ema'oro - inizializzato a $ema'oro I 1 4p#nto D0F5. ;ale $ia per PA c%e per PH 1. ! gi#nge all/inizio ella $ezione critica e e$eg#e wait45 4p#nto D1F5. All/inizio ella wait il &alore ella &ariabile $ema'oro - $ #g#ale a 1 1.1. ".#. 4wait4$ema'oro5 i !5 controlla il &alore el $ema'oro. $ema'oro II 1 IF e$ce al ciclo i atte$a 1.2. ".#. 4wait4$ema'oro5 i !5 ecrementa il &alore i $ema'oro. $ema'oro II 0. la wait45 ritorna 1.9. ! entra nella $ezione critica 4p#nto D2F5 INT:@@8PT( preemption e proce$$ $witc% ! &iene $o$tit#ito a $ 4'#ori alla wait45 l/interr#pt p#* $cattare ma ormai $ema'oro - gi+ II 05 2. $ gi#nge all/imbocco ella $ezione critica e e$eg#e wait45( ora il &alore el $ema'oro II 0 2.1. ".#. 4wait4$ema'oro5 i PH5 blocca PH nella co a el $ema'oro( wait45 NON ritorna. $ @imane a e$eg#ire niente per t#tto il $#o time $lice. INT:@@8PT( preemption e proce$$ $witc% $ &iene $o$tit#ito a ! 9. ! percorre t#tta la $ezione critica E. ! $egnala l/#$cita alla $ezione critica con $ignal45 E.2. ".#. 4$ignal4$ema'oro5 i !5 incrementa il &alore i $. $ I 1. $ignal45 ritorna ora il $ema'oro - !&er e!( per gli altri INT:@@8PT( preemption e proce$$ $witc% ! &iene $o$tit#ito a $ >. $ riparte wait45 i $( prima bloccata nel ciclo i atte$a >.1. ".#. 4wait4$ema'oro5 i PH5 controlla il &alore el $ema'oro. ora $ema'oro I 1 allora e$ce al ciclo i atte$a >.2. ".#. 4wait4$ema'oro5 i PH5 ecrementa il &alore i $ema'oro. $ema'oro II 0. la wait45 ritorna >.9. $ entra nella $ezione critica 2a ora in poi PH e PA po$$ono e$$ere liberamente interrotti a t#tti. ,a cor$a non e$i$te pi16 .. ,/implementazione i wait45 e $ignal45 appena e$critta contiene #n loop i !atte$a atti&a! c%e $preca t#tto il time $lice ei proce$$i c%e atten ono $#lla wait45 a g#ar are il &alore i $. )i* &a a etrimento ell/e''icienza el comp#ter( c%e per e tempo per #n loop c%e i 'atto - in#tile. Si noti c%e in #n $i$tema monoproce$$ore ne$$#no p#* cambiare il &alore ella &ariabile S mentre gira il no$tro proce$$o( per c#i &a $precato $empre t#tto il time $lice a i$po$izione el proce$$o c%e atten e in #na wait45. I $ema'ori con atte$a atti&a &engono anc%e etti !spin loc%!. Sono #$ati p.e$. nel Kernel i ,in#J( per coor inare( 'ra le altre co$e( l/acce$$o m#t#amente e$cl#$i&o ai e&ice ri&er( nei $i$temi m#ltiproce$$ore SMP. Sono &eloci a e$eg#ire non ric%ie ono altre ri$or$e c%e 4molta65 )P8( per c#i $ono l/!eJtrema ratio! ella $icronizzazione( a #$are $olo $e non $i p#* 'are in altro mo o.

0#e$ta ipote$i - limitati&a( ma permette i capire meglio. In &erit+ la wait45 e la $ignal45 $# #n $ema'oro po$$ono e$$ere e$eg#ite a programmi totalmente i&er$i( per c#i non - a$$ol#tamente etto c%e $i tratti i #e !i$tanze! ello $te$$o co ice.

0= progr concorrente.o t

;er. 0.>.0 2012-0>-1?

p. = i 12

Ing. Gabriele MONTI

www.ingmonti.it

Semafori con coda

Per e&itare l/atte$a atti&a $i p#* mo i'icare la '#nzione wait45 in mo o c%e e$$a c%ie a al S.O. i mettere il proce$$o in $tato i !Lait! 4!$#$pen e !5. Si p#* anc%e aggi#ngere al $ema'oro #na co a i proce$$i( nella "#ale &engono ten#ti t#tti "#ei proce$$i c%e $ono in atte$a i poter entrare nelle $ezioni critic%e c%e $ono protette al $ema'oro. In "#e$to mo o i proce$$i c%e tro&ano il $ema'oro ro$$o $ono $o$pe$i( non &engono pi1 $celti al proce$$ $c%e #ler e non e$eg#ono pi1 l/atte$a atti&a. Nat#ralmente ora $orge il problema i !ri$&egliarli! perc%7 e$$i( non e$eg#en o( non po$$ono pi1 accorger$i a $oli c%e il $ema'oro - cambiato i !colore!. :/ logico c%e il compito i !ri$&egliare! i proce$$i $o$pe$i nella co a el $ema'oro $ia a$$egnato alla $ignal45. In'atti $ignal45 aggiorna il &alore ella &ariabile $ema'oro e mette in $tato i !@ea C! #no o pi1 ei proce$$i in co a $# "#el $ema'oro. In Gig#ra E - mo$trato in p$e# o-) il '#nzionamento i principio i wait45 e $ignal45 $# $ema'ori con co a.
oid .rea5e3a6oro ((); /* .. O+E*":!O;E +*!M!,!V" creazione la (tr&tt&ra dati del (e3a6oro, c2e co3prende anc2e &na coda per i proce((i in atte(a (& 1&e(to (e3a6oro .. */ ( = 1; // co3e pri3a ret&rn (); oid ?ait ((); /* O+E*":!O;E +*!M!,!V" (e la (ezione critica 7 i3pe8nata (o(pende il proce((o in atte(a c2e (i li'eri (la (&cce((i a (i8nal() ca3'ia la aria'ile (e3a6oro e ri( e8lia i proce((i c2e (ono in coda) */ i6(( == 0) 5o(pendi!l+roce((o (); (@@; // co3e pri3a ret&rn (); oid (i8nal((); /* O+E*":!O;E +*!M!,!V" */ (AA; // co3e pri3a 5c2ed&le+roce((i!n.oda ((); /* B ri( e8lia (rende <*eadE< al3eno &no dei proce((i in atte(a (&lla coda */ ret&rn ();

Figura &: funzionamento di wait() e signal() di semafori con coda In "#e$ta &er$ione la $ignal45 e''ett#a il !ri$&eglio! i almeno #no ei proce$$i in co a( tramite la '#nzione Sc%e #leProce$$iIn)o a45( "#i non #lteriormente $peci'icata. Il compito i eci ere "#ale 'ra i proce$$i in co a e&e e$$ere ri$&egliato p#* e$$ere $&olto alla $ignal45 $te$$a( opp#re la$ciato al S.O. . In "#e$t/#ltimo ca$o la $ignal45 mette in $tato i !@ea C! t#tti i proce$$i in atte$a $#lla co a. :ntrer+ nella $ezione critica "#ello c%e &err+ $celto per primo al proce$$ $c%e #ler. Peraltro n#lla impe i$ce i 'ar !$c%e #lare! il proce$$o a ri$&egliare irettamente alla $ignal45( e&ent#almente realizzan o meccani$mi a priorit+. 2i $olito per* &iene $celta #na politica GIGO per e&itare c%e #n proce$$o con ba$$a priorit+ &enga $empre $calzato a altri pi1 importanti e non rie$ca pi1 a #$cire alla co a. 0#e$to 'enomeno &iene etto !in&er$ione ella priorit+! e - cla$$i'icabile 'ra i 'enomeni i ! starvation! 4morte per 'ame65 o !li&elocK!( in contrappo$izione al ea locK( c%e &e remo $#cce$$i&amente.

Realizzazione di un semaforo

In "#e$to paragra'o ci occ#peremo ella realizzazione a ba$$o li&ello i #n $ema'oro con atte$a atti&a. In linea i principio l/implementazione - $emplice e p#* a$$omigliare al co ice i Gig#ra >( c%e - la tra #zione in p$e# o-A$$emblC ello p$e# oco ice in Gig#ra 9
?aitF .M+ #5$, 0 G: ?ait DE. #5$ *E, (i8nalF !;. #5$ *E, ; <1> 8&ardo il colore del (e3a6oro ; <%> a(petto (e 7 ro((o ; <3> rendo ro((o il (e3a6oro

; <-> rendo

erde il (e3a6oro

Figura ': implementazione di wait() e signal() di semafori senza coda (la wait ( s)agliata*) 0#e$to co ice contiene #na cor$a. In'atti $e il proce$$o c%e e$eg#e "#e$to co ice $#bi$ce #na preemption 'ra D2F e D9F( il &alore ella &ariabile S p#* i&enire incon$i$tente. Per ri$ol&ere $i p#* 'are come gi+ etto( e$eg#en o la wait45 a interr#pt i$abilitati. :/ $pe$$o po$$ibile( per*( #tilizzan o i$tr#zioni i macc%ina $peciali( e&itare i e$cl# ere gli interr#pt. p. ? i 12 2012-0>-1? 0= progr concorrente.o t

Ing. Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

,e )P8 c%e $#pportano i $i$temi m#ltiprogrammati( $in al tempo ei main'rame( %anno i$tr#zioni i macc%ina i tipo !Te$tMSet!( pen$ate proprio per lo $copo( c%e e$eg#ono #n te$t in #na locazione i memoria e la mo i'ica el $#o conten#to nella stessa i$tr#zione. 2ato c%e le i$tr#zioni i macc%ina $ono !per e'inizione! primiti&e( almeno in $i$temi monoproce$$ore( le i$tr#zioni i tipo Te$tMSet $ono l/i eale per realizzare primiti&e i $incronizzazione. 8n/i$tr#zione $imile alla Te$tMSet nelle )P8 <?B - l/i$tr#zione HT@ 4Hit Te$t an @e$et5( c%e e$i$te al 9?B in poi. HT@ '#nziona in "#e$to mo o3 BTR <operando>, <numero del bit su cui lavorare> Doperan oF p#* e$$ere a 1B o a 92 bit( Dn#mero el bit $# c#i la&orareF &a a 0 a 91 e - il n#mero i bit ell/operan o a an are a &e ere. ,/i$tr#zione HT@3 1. ,egge nel 'lag i carrC il &alore el bit Dn#mero el bit $# c#i la&orareF i Doperan oF 2. Scri&e il &alore 0 nel bit Dn#mero el bit $# c#i la&orareF i Doperan oF :$eg#en o "#e$ta i$tr#zione il &alore i DlocazioneF non rimane mai incon$i$tente perc%7 la lett#ra e l/aggiornamento &engono 'atte nella $te$$a i$tr#zione( in mo o primiti&o. Altre i$tr#zioni c%e $ono primiti&e per nat#ra $ono le i$tr#zioni i $cambio c%e leggono #n n#mero alla memoria e( nella $te$$a i$tr#zione atomica( lo $cri&ono anc%e. Nell/ articolo i LiKipe ia $#llo $pinlocK $i p#* tro&are #n e$empio i realizzazione i #no $pin locK con l/i$tr#zione <)NG e $enza i$abilitare le interr#zioni 4%ttp3OOen.wiKipe ia.orgOwiKiOSpinlocK5.

Semafori binari e generalizzati

Se #n $ema'oro &iene inizializzato a 1 al momento ella $#a creazione( e$$o permette a #n $olo proce$$o alla &olta i pa$$are( realizzan o #na $ezione critica all/acce$$o m#t#amente e$cl#$i&o. I $ema'ori i "#e$to tipo &engono etti !mute+!. I &alori a$$#nti alla &ariabile $ema'oro i #n m#teJ po$$ono e$$ere $olo 1 e 0. Per "#e$to il m#teJ &iene anc%e c%iamato !semaforo )inario!. Se $i analizza il '#nzionamento i wait45 e $ignal45 $i p#* capire c%e il &alore con c#i $i inizializza la &ariabile $ema'oro al momento ella $#a creazione - il n#mero i proce$$i c%e il $ema'oro accetta contemporaneamente nella $ezione critica. ,/e$ec#zione !regolare! i wait45 e $ignal45 a parte ei proce$$i + il perme$$o i entrare nella $ezione critica a N proce$$i $e il &alore iniziale ella &ariabile $ema'oro - N. $e N I 1 $i %a #n $ema'oro m#teJ. 8n $ema'oro c%e &iene inizializzato a #n &alore maggiore i #no &iene etto ! semaforo generalizzato!. In'atti ogni wait45 c%e rie$ce a pa$$are ecrementa il &alore ella &ariabile $ema'oro. $e e$$a - inizializzata a N i&iene zero "#an o ci $ono N proce$$i entro la $ezione critica. 0#an o la &ariabile $ema'oro i&iene 0 i proce$$i cominciano a bloccar$i in co a( non pa$$ano e non ecrementano #lteriormente il &alore ella &ariabile $ema'oro( c%e rimane 0. Non appena #n proce$$o e$eg#e $ignal45 la &ariabile $ema'oro &iene incrementata e #n altro proce$$o p#* entrare nella $ezione critica.
oid .rea5e3a6oro ((); /* la aria'ile (e3a6oro (() iene inizializzata a ;, n&3ero di proce((i c2e (ono a33e((i conte3poranea3ente entro la (ezione critica */ ( = ;; ret&rn ();

Figura ,: modifiche ai semafori per semafori generalizzati Nell/e$empio el ponte $i p#* immaginare c%e M binari portino a #n ponte $#l "#ale po$$ono pa$$are contemporaneamente N treni.

Considerazioni sull'uso dei semafori

Il meccani$mo ei $ema'ori( p#r '#nzionale e e''iciente( - pi#tto$to !pericolo$o! nella programmazione( perc%7 - i''icile a tenere $otto controllo( per c#i - 'acile $bagliare. Ogni acce$$o al $ema'oro e&e e$$ere e''ett#ato correttamente a t#tti i proce$$i c%e con i&i ono la ri$or$a( $ia nella 'a$e ella $#a ac"#i$izione 4wait455( $ia nella 'a$e el rila$cio 4$ignal455. Ha$ta( per e$empio( c%e #n proce$$o termini la $ezione critica $enza emettere #na $ignal45( o c%e non la termini mai 4p.e$. perc%7 $i blocca per errore al $#o interno5( per bloccare per $empre in co a t#tti gli altri proce$$i c%e &i $ono entrati e c%e &i entreranno. Per o&&iare a "#e$to problema $ono $tati in&entati ei meccani$mi i pi1 alto li&ello per la $incronizzazione ei proce$$i( pi1 a''i abili e $emplici a #$are. 8n altro problema nell/#$o ei $ema'ori - il 'atto c%e $e #n proce$$o mo i'ica la &ariabile $ema'oro $enza entrare !#''icialmente! nella $ezione critica( cio- $enza 'are #na wait45( non p#* e$$ere $o$pe$o e p#* 'ar anni $enza c%e ne$$#no po$$a inter&enire. 0= progr concorrente.o t ;er. 0.>.0 2012-0>-1? p. 9 i 12

Ing. Gabriele MONTI

www.ingmonti.it

)/- a rile&are il 'atto c%e #n $ingolo $ema'oro p#* proteggere pi1 i #na ri$or$a. Ha$ta c%e ogni proce$$o c%e #$a "#elle ri$or$e e$eg#a #na wait45 e #na $ignal45 $#l $ema'oro a ogni acce$$o a cia$c#na elle ri$or$e protette. 0#e$to - po$$ibile( ma potrebbe limitare il grado di concorrenza ei proce$$i e "#in i l/e''icienza el $i$tema comple$$i&o.

1.0.6

Monitor

)ome abbiamo &i$to - !pericolo$o! $cri&ere programmi concorrenti con i $ema'ori. Per imin#ire i ri$c%i ella programmazione concorrente - $tato intro otto il concetto i !monitor!. 8n monitor - #n in$ieme i ati a con i&i ere in mo o $incronizzato 'ra &ari proce$$i e i proce #re c%e permettono i #tilizzare "#ei ati. I ati $ono i $olito el t#tto na$co$ti alle parti i programma c%e $tanno '#ori al monitor e $ono acce$$ibili $olo c%iaman o le '#nzioni 4proce #re5 el monitor. 0#e$ta e'inizione - el t#tto $imile a "#ella i tipo i ato a$tratto( o i !oggetto! nella programmazione a oggetti. i ati $ono na$co$ti all/#tente 4 ata %i ing5 e $ono acce$$ibili $olo in irettamente( tramite l/#$o i '#nzioni 4o( nella programmazione a oggetti( !meto i!5. ,a i''erenza 'on amentale 'ra oggetti e monitor - c%e nei monitor - a$$ic#rata !a#tomaticamente! l/e$ec#zione in m#t#a e$cl#$ione i t#tte le '#nzioni. In pratica( t#tti i !meto i! i #n monitor $ono $ezioni critic%e i "#el monitor. Il compilatore el ling#aggio 4o la macc%ina &irt#ale nel ca$o i Pa&a e )Q5 $i occ#pa i in$erire t#tte le primiti&e i $incronizzazione nece$$arie per a$$ic#rare la m#t#a e$cl#$ione= 'ra le '#nzioni 4meto i5 el monitor. I monitor !incap$#lano! al loro interno le &ariabili con i&i$e ai proce$$i concorrenti e 'anno in mo o c%e il loro #$o $ia controllato e realizzato e$cl#$i&amente attra&er$o le proce #re el monitor( per le "#ali la corretta $incronizzazione pi1 'acilmente &eri'icabile. ,a programmazione con i monitor permette i $cri&ere programmi in c#i la parte el co ice c%e e''ett#a la $incronizzazione - con'inata nella $te$$a !zona!. Al contrario l/#$o ei $ema'ori implica la ge$tione ella $incronizzazione in p#nti el co ice lontani 'ra loro( e e&ent#almente $otto il controllo i per$one i&er$e( con t#tti i problemi c%e a ci* po$$ono eri&are. 8n monitor controlla #na ri$or$a( o #n piccolo gr#ppo i ri$or$e( 'acen o in mo o c%e l/acce$$o a e$$e $ia m#t#amente e$cl#$i&o. I proce$$i c%e entrano in #n monitor po$$ono e$$ere $o$pe$i e entrare in #na co a a$$ociata al monitor. In alc#ni ca$i - po$$ibile 'ar $o$pen ere il proce$$o $# #na con izione.

1.0.

!l problema prod"ttori # cons"matori

8n problema tipico( c%e incorre in molti ca$i pratici( - "#ello in c#i #no o pi1 proce$$i e&ono #tilizzare ati pro otti a altri proce$$i. Sia i proce$$i c%e !pro #cono! i ati( c%e "#elli c%e li #tilizzano( e$eg#ono $eparatamente e la&orano a "#al$ia$i &elocit+. per "#e$to - in i$pen$abile tro&are #n meccani$mo per $incronizzarli. Il problema e$critto &iene $olitamente c%iamato !problema pro #ttore R con$#matore!. In #n problema pro #ttore R con$#matore l/or ine con c#i &engono !con$#mati! i ati - lo $te$$o con c#i e$$i $ono $tati pro otti. Per 'ar $S c%e i proce$$i po$$ano pro$eg#ire nel loro la&oro( bloccan o$i $olo "#an o non ci $ono ati i$ponibili - nece$$ario intro #rre #na $tr#tt#ra ati i tran$ito( nella "#ale memorizzare temporaneamente i ati 'orniti ai pro #ttori( in atte$a c%e ci $iano con$#matori i$ponibili per #tilizzarli. 0#e$ta $tr#tt#ra ati &iene etta !b#''er! e - in gra o i i$accoppiare le i&er$e &elocit+ ei pro #ttori e ei con$#matori( memorizzan o le in'ormazioni pro otte nei momenti in c#i non ci $ono con$#matori pronti a #tilizzarle. Nei ca$i pi1 $emplici $i p#* con$i erare c%e la imen$ione el b#''er &enga $empre $celta con tale abbon anza a e$$er $ic#ri c%e non $i e$a#rir+ mai( "#e$to e"#i&ale a con$i erare il b#''er !in'inito!. 0#an o in&ece $i e&e tener conto el 'atto c%e il b#''er po$$a e$a#rir$i( allora $olitamente $i #$a #n !b#''er circolare!.

Buffer circolare

Si p#* pen$are a #n b#''er circolare come a #n arraC nel "#ale $i rincorrono #e p#ntatori 4in ici nell/arraC5( #no ei "#ali in ica la po$izione el pro$$imo elemento c%e $i p#* $cri&ere nel b#''er( mentre l/altro p#nta al pro$$imo elemento a leggere. In Gig#ra = - mo$trata( al p#nto 0( la $it#azione ei p#ntatori nel momento ella creazione el b#''er( mentre il p#nto 1 mo$tra la $it#azione opo la prima $critt#ra nel b#''er a parte i #n pro #ttore. A ogni $critt#ra o lett#ra nel b#''er il relati&o p#ntatore &iene incrementato. 0#an o #no ei #e p#ntatori raggi#nge l/#ltimo elemento ell/arraC 4p#nto 2 in Gig#ra =5 &iene 'atto tornare all/inizio 4p#nto 95. 2a ci* il nome i b#''er !circolare!.

= ,a m#t#a e$cl#$ione - e''etti&amente a$$ic#rata3 con c%iamate al S.O.( al compilatore $te$$o( opp#re alla !macc%ina &irt#ale! 4Pa&a o ling#aggi .N:T5

p. 10 i 12

2012-0>-1?

0= progr concorrente.o t

Ing. Gabriele MONTI 1999 - 2012

Programmazione concorrente

www.ingmonti.it

Figura -: )uffer circolare ,/acce$$o al b#''er circolare - concorrente( per c#i $i e&ono in i&i #are operazioni primiti&e c%e lo ge$ti$cano. )%iamiamo !p#t! l/operazione c%e immette nel b#''er #n n#o&o elemento( e !get! l/operazione c%e toglie #n elemento al b#''er e lo re$tit#i$ce al programma c%e ne %a 'atto ric%ie$ta. Sia !get! c%e !p#t! po$$ono e$$ere e$eg#ite a "#al$ia$i proce$$o intere$$ato al b#''er circolare. 0#an o #n proce$$o e$eg#e la !p#t! $cri&e nel b#''er all/in ice !$critt#ra!( poi aggiorna l/in ice( a#mentan olo. Se il &alore otten#to ecce e la imen$ione el b#''er lo !riporta a capo!( per e$empio in "#e$to mo o3
6&nction p&t(ele3ento) 9 // i proce((i la e(e8&ono in 3odo 3&t&a3ente e(cl&(i o .. H&66er#(critt&ra$= ele3ento; (critt&ra = ((critt&ra A 1) I nEle3entiH&66er; // a88iorna3ento conte88io de8li ele3enti nel '&66erF n;elH&66erAA; .. >

// (1)

Il ri$#ltato ell/i$tr#zione 415 - il re$to ella i&i$ione intera 4T( !mo #lo!5( c%e - $empre #g#ale a 4$critt#ra U 15 tranne "#an o 4$critt#ra U 15 &ale n:lementiH#''er. In "#e$to ca$o la i&i$ione + ri$#ltato 1 con re$to i 0( perci* $critt#ra &iene riportato a 0. In mo o el t#tto analogo $i comporta il p#ntatore i lett#ra( mo$$o alla primiti&a !get!3
6&nction 8et() 9 // i proce((i la e(e8&ono in 3odo 3&t&a3ente e(cl&(i o .. te3p = H&66er#lett&ra$; lett&ra = (lett&ra A 1) I nEle3entiH&66er; // a88iorna3ento conte88io de8li ele3enti nel '&66erF c@@; .. >

Se per l#ngo tempo non $i e''ett#ano operazioni i lett#ra al b#''er il p#ntatore i $critt#ra potrebbe raggi#ngere "#ello i lett#ra ! oppian olo! 4$it#azione el p#nto 4E5 425 in Gig#ra =5. In "#e$ta con izione( "#an o i p#ntatori $ono #g#ali( il b#''er - pieno e $i pongono #e alternati&e( 'ra le "#ali $cegliere in ba$e alle caratteri$tic%e ell/applicazione3 1. ignorare l/errore e $o&ra$cri&ere il conten#to el b#''er( per en o i ati pi1 &ecc%i 4in "#e$to ca$o anc%e il p#ntatore i lett#ra e&e e$$ere incrementato5 2. bloccare i pro #ttori( atten en o c%e #n con$#matore $po$ti in a&anti il p#ntatore i lett#ra. 0= progr concorrente.o t ;er. 0.>.0 2012-0>-1? p. 11 i 12

Ing. Gabriele MONTI

www.ingmonti.it

0#an o( al contrario( non a&&engono $critt#re per l#ngo tempo il b#''er $i $&#ota. Se #n con$#matore c%ie e #n ato al b#''er e$$o $i e&e $empre bloccare in atte$a c%e #n pro #ttore lo intro #ca nel b#''er 4$it#azione el p#nto 4E5415 in Gig#ra =5. :/ c%iaro c%e le &ariabili !lett#ra!( !$critt#ra! e !nNelH#''er! ello p$e# oco ice prece ente e&ono e$$ere protette all/acce$$o contemporaneo. 8n mo o per 'arlo potrebbe e$$ere realizzare le #e proce #re p#t45 e get45 come proce #re i #n monitor( c%e %anno $empre acce$$o m#t#amente e$cl#$i&o 4per #n e$empio pratico i problema pro #ttore - con$#matore( &e ere il capitolo $# Pa&a o $# .N:T5.

1.0.$
TO2O

!l problema lettori # scrittori &eadloc'

1.0.%

!blocco critico! o !$tallo! TO2O

p. 12 i 12

2012-0>-1?

0= progr concorrente.o t