Esercizi di mutua esclusione e sincronizzazione (2) Alessandro A. Nacci [email protected] ACSO 2014/2014 1 2 Esercizio 13 Il !"#$%&'/)*&()-(,12&)3(%#+#3( problema dei cinque filosofi ! 6(,12&)3(%#+#3( 0/++/,#)%/)7(4/)0&,+/,*#) &)'/,5(/,*#8)/44#",#)/*)2,/)4/7#%/) "#4#,*/9)):%) -&,4"#))*&%%/))4/7#%/) 7());) 2,/)).200(&"/)))*() "(+#) &))%/))4/7#%/);) /00/"&--<(/4/)-#,)-(,12&)$/--<&44&9 ! =2/,*#) 2,)3(%#+#3#))0&,+/),#,) (,4&"/5(+-& -#,)() -#%%&5<(9)=2/,*#)5%()) 7(&,& 3/'&) 4&,4/ *())('0#++&++/"+()) *&%%&)$/--<&44&))-<&)+4/,,#)/%%/)+2/) *&+4"/)&*)/%%/)+2/)+(,(+4"/9)>%)3(%#+#3#) 02?)0"&,*&"&)2,/)+#%/)$/--<&44/)0&") 7#%4/9 ! =2/,*#)2,) 3(%#+#3#)/33/'/4#)0#++(&*&) *2&)$/--<&44&)-#,4&'0#"/,&/'&,4&8) '/,5(/9) &"'(,/4#)(%)0/+4#8)/00#55(/)%&) $/--<&44&)&)"(-#'(,-(/)/)0&,+/"&9 7bis. Esercitazione su sincronizzazione di processi marco lapegna 2 3 Esercizio 13 !"#$%&'/)*&()-(,12&)3(%#+#3( Il problema dei cinque filosofi " !( 02?))))"/00"&+&,4/"&))))-(/+-2,/)$/--<&44/)-#,)2,) +&'/3#"#9 " "5,( 3(%#+#3#))4&,4/)*()/33&""/"& 2,/)$/--<&44/))-#,)) 2,##0&"/.(#,&))*())$/(4 &))%/)))"(%/+-(/ &+&52&,*#))post +(5,/% $/--<&44/%(&'())*&+4"/* !() $/--<&44/%(())+(,(+4"/* 7bis. Esercitazione su sincronizzazione di processi 4 3 marco lapegna 7bis. Esercitazione su sincronizzazione di processi marco lapegna 2 Il problema dei cinque filosofi Soluzione 1 !"#$%&'/)*&()-(,12&)3(%#+#3()+)+#%2.(#,&)' ! ,/"(/$(%()-#,*(7(+&+ +&'/0<#"&)$/--<&44/%)-)(. //)4244()5%()&%&'&,4()(,(.(/%(../4( /)' ! 0(%#+#3# ()+ *#)1 $/(4)$/--<&44/% ()(* $/(4)$/--<&44/%)(&'*)2)-(* 3 '/,5(/ !&.(#,&)-"(4(-/ 3 +(5,/%)$/--<&44/% ()(*. post +(5,/%)$/--<&44/%)(&'*)2)-(*. post 3 0&,+/ 3 4)$<(%&))'*. 7bis. Esercitazione su sincronizzazione di processi !"&,*&)$/--<9)+(,(+4"/ !"&,*&)$/--<9)*&+4"/ %/+-(/)$/--<9)+(,(+4"/ %/+-(/)$/--<9)*&+4"/ marco lapegna 4 5 Il problema dei cinque filosofi Soluzione 1: deadlock !"#$%&"'()'+)56.57"18 3( 4$44&) &))5&#"3"5&)67''"))578())9"'4(8:";7'(78('4( () :;('<"'" #7 =7996(447)7##7)#";")3&'&34;7)'(33$'"):$"#):;('<(;() #7)=7996(447)7##7)3$7)<(34;7 )56.57"18* A"33&=&#()3"#$%&"'( "B'&))5&#"3"5"C)<":")7D(;):;(3")#7):;&87)5";96(447C) D(;&5&97)3()#7)3(9"'<7)(#)<&3:"'&=&#(E)F')973") 9"'4;7;&"):"37)7'96())#7):;&87 6 Il problema dei cinque filosofi Soluzione 2 3"#$%&"'()9+ Dato l’i-esimo filosofo… <")1 Nel caso del filosofo #5, con %5 prendo la prima forchetta (è una tavola rotonda!) In questo esercizio la notazione per i mutex è differente: lock -> wait unlock -> post D"&<):;('<&)&'4)&*1) $7&4))=8$4(>)*. $7&4))==7996(447%)&)()* =%)&)()??. 3&B'7#))=8$4(>*. 4 $6&#()'"4E('4;78=(*1 :;('<&))&)*. &5))=%)&&'*)2)-():);*)1 :;('<&)))&&'*)2)-)*. ('4;78=()<)4;$( 4)(#3(1 :"37))&)*. 4 4 3 87'B&7 3 D"&<):"37)&'4)&*1 $7&4))=8$4(>)*. =%)&)()&&. 3&B'7#))==7996(447%)&)()*. post 3&B'7#))=8$4(>)*. post 4 :"37))&)*. :"37)))&&'*)2)-)*. ('4;78=()<)57#3(. 3 :('37 3 4)$6&#())'*. 7bis. Esercitazione su sincronizzazione di processi =%-()7;;7@)<&))&'4(;&)9"'<&D&3" 96()A;(:#&97B)&#)9"'4('$4")<& =7996(447%-( 7 6 marco lapegna Il problema dei cinque filosofi Soluzione 2: starvation 3"#$%&"'()9+)! .C,. F"D 9#()&#);&396&")96()4$44&)&)5&#"3"5&)):;('<"'")#7)=7996(447)3&'&34;7C) D(<"'")96()#7)<(34;7)(#)"99$:747)():"37'")<&)'$"D")#7)3&'&34;7E )! .C,. F"D* A"33&=&#()3"#$%&"'( "B'&))5&#"3"5"C):;&87)<&)87'B&7;()3&)733&9$;7)<&)7D(;) :;(3")('4;78=()#()=7996(44( 8 Il problema dei cinque filosofi 5(7<#"9E)()347;D74&"' Deadlock & Starvation 5(7<#"9E+)&'3&(8()<&):;"9(33& =#"9974&))3$)$'7)&34;$%&"'() $7&4*C)"B'$'")<(&)`$7#&))&')744(37)96()3&)#&=(;7)$'7));&3";37) 733(B'747)&')$3")(39#$3&D")<&)$')7#4;"):;"9(33" !47;D74&"'+)&'3&(8()<&):;"9(33&)&')(3(9$%&"'( 96()4('47'") ;&:(4$478('4()3('%7)3$99(33")<&)799(<(;()7<)$'7);&3";37) 733(B'747)&')$3")(39#$3&D")<&)$')7#4;"):;"9(33" 9 Il problema dei cinque filosofi Soluzione 3: inefficiente !"#$%&"'()F+),D600,0,6D 6 2")1 3 5('67 3 $7&9)=<$9(>*. $7&9)@7AAB(997%)&)(* $7&9)@7AAB(997%)&&'*)2)-(* 3 <7'I&7 3 6&I'7#)@7AAB(997%)&)(*. post 6&I'7#)@7AAB(997%)&&'*)2)-(*. post post 6&I'7#)=<$9(>*. 3 5('67 3 4)$B&#())'*. 7bis. Esercitazione su sincronizzazione di processi KL"9(II(L()#( A&69L$%&"'&)AL&9&AB(B ')6"#")O&#"6"O")7##7) P"#97)5$"#)<7'I&7L(GG marco lapegna 9 10 Il problema dei cinque filosofi Soluzione 4 !"#$%&"'()H Stato di un generico filosofo (si poteva fare con una enum) 7bis. Esercitazione su sincronizzazione di processi 10 11 marco lapegna 7bis. Esercitazione su sincronizzazione di processi marco lapegna 9 Il problema dei cinque filosofi Soluzione 4 !"#$%&"'()F))A"'9T*+)"8) P"&2)9(69)&'9)&*)1 &O)6979(%&(<<IJDKCL)==)6979(%760 (G<6^ ,DK)==)6979(%C,KI (G<6^ ,DK*1 6979(%&()<)6^ ,DK. //)A"<$'&A")7I#&)7#9L&)AB()&'&%&")7)<7'I&7L( post 6&I'7#))=6%&()*. //)5"66")<7'I&7L(+)6(<7O"L")&' 4 4 P"&2)97E(MO"LE6)&'9)&*)1 $7&9))=<$9(>)*. 6979(%)&)(<IJDKCL. 9(69)&*. post 6&I'7#))=<$9(>)*. $7&9))=6%)&)()*.) 4 //)69")5(L)5L('2(L()#()O"LAB(99( //)&'&%&")7)<7'I&7L(T) P"&2 5$9MO"LE6)&'9)&*)1 $7&9))=<$9(>)*. 6979(%)&()<) I,D8,DK. 9(69)760 *. 9(69)C,KI *. 6&I'7#))=<$9(>)*. post 4 7bis. Esercitazione su sincronizzazione di processi //)A"<$'&A")AB()B")O&'&9")2&)<7'I&7L( //)6(<7O"L")7)6&'&69L7)&' //)6(<7O"L")7)2(69L7)&' 11 12 marco lapegna 7bis. Esercitazione su sincronizzazione di processi 10 marco lapegna Il problema dei cinque filosofi Soluzione 4: osservazioni "66(LP7%&"'& ! 6979(%&(<;)))&<;cTTcH)))))))6%&(<;)&<;cTTcH ! ,#)6(<7O"L")(#)L(#79&P")7#)O&#"6"O")()'"')7##7)O"LAB(997 ! 77)O$'%&"'()9(69)P(2()6()&)P&A&'&)697''")<7'I&7'2"T),')A76") A"'9L7L&")2&AB&7L7)AB()&'&%&7)7)<7'I&7L()()7#%7)&#)6(<7O"L"))7@&#&97) &#)O&#"6"O")7)<7'I&7L(* ! J')O&#"6"O")&')799(67)6$##7))$7&9)&')97E(MO"LE6c)67L7#)6@#"AA79" 27) $')O&#"6"O")P&A&'")AB()(6(I$()9(69)&')5$9MO"LE6 Tratto da: http://wpage.unina.it/lapegna/lucidi/SOmodA/lezione7-bis.pdf 7bis. Esercitazione su sincronizzazione di processi 13 12 marco lapegna Esercizio 14 Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Trova l’errore ł¼Ĕ 4üĔà z Ŀċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ 4üĔà ääċ ×üł¼Ĕ Úó ĔĬĩ¼Ê Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ 4üĔà ääċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 14 Esercizio 14 Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Trova l’errore ł¼Ĕ 4üĔà z Ŀċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ 4üĔà ääċ ×üł¼Ĕ Úó ĔĬĩ¼Ê Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ 4üĔà ääċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ Il problema consiste nel fa1o che i due thread operano sulla variabile conto con una sequenza le1ura/scri1ura (operatore ++) che può rendere inconsistente lo stato della variabile stessa. ! ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ COME SI RISOLVE? ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 14 ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ Esercizio 14 üpĔĩü¼ Ŀċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Trova l’errore ł¼Ĕ 4üĔà z Ŀċ ×ĔüpSĬ²ĩĔpĸĬĔ ¨Ã4¦ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ł¼Ĕ Ĕp²× Jłċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼Ê H ć¨Sà Sp¨ 4üĔà ×üł² Sp¨ Sp×ÃćłĔà H Üł¼óJ 4üĔà Ûċ 4üĔà ääċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼Ê Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ Ĕp²× Jłċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼ĥ H ć¨Sà Sp¨ 4üĔà ×üł² Sp¨ Sp×ÃćłĔà H Üł¼óJ 4üĔà Ûċ 4üĔà ääċ ×üł¼Ĕ Ú ó ĔĬĩ¼ĥ Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ¨Ã4¦Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 15 ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ Esercizio 14 üpĔĩü¼ Ŀċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Trova l’errore ł¼Ĕ 4üĔà z Ŀċ ×ĔüpSĬ²ĩĔpĸĬĔ ¨Ã4¦ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ł¼Ĕ Ĕp²× Jłċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼Ê H ć¨Sà Sp¨ 4üĔà ×üł² Sp¨ Sp×ÃćłĔà H Üł¼óJ 4üĔà Ûċ 4üĔà ääċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼Ê Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ Ĕp²× Jłċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ¨Ã4¦Ûċ ×üł¼Ĕ Ú ó ĔĬĩ¼ĥ H ć¨Sà Sp¨ 4üĔà ×üł² Sp¨ Sp×ÃćłĔà H Üł¼óJ 4üĔà Ûċ 4üĔà ääċ ×üł¼Ĕ Ú ó ĔĬĩ¼ĥ Sp×ÃćłĔĔà ćĩ¨ 4üĔà ć¨Sà H ÜS¼óJ 4üĔà Ûċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ¨Ã4¦Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 15 I O N A Z Z I L I T U I S ! X E T MU üpĔĩü¼ Ŀċ Esercizio 15 Trova l’errore (2) Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý 4ü 4üĔĔpüp z öĸĿ öċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×üł¼Ĕ Úó§pĔĔà Ü4¼óJ 4üĔĔpüp Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ łċ 4üĔĔpüp z Úü¼S ÚÛ Ü¾ĘÛ äĘĘċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 16 üpĔĩü¼ Ŀċ Esercizio 15 Trova l’errore (2) Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Il problema sta nel fa1o che th_fun2 dovrebbe essere eseguita sempre prima di th_fun1 in modo tale da leggere un cara1ere valido dal buffer. 4ü 4üĔĔpüp z öĸĿ öċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×üł¼Ĕ Úó§pĔĔà Ü4¼óJ 4üĔĔpüp Ûċ üpĔĩü¼ »Ĩ§§ċ ! COME SI RISOLVE? ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ łċ 4üĔĔpüp z Úü¼S ÚÛ Ü¾ĘÛ äĘĘċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 16 ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ Á ł¼4¨ĩSp Á ł¼4¨ĩSp Á ł¼4¨ĩSp Á ł¼4¨ĩSp «ćĔS¨ł Ý «ćĔSłÃ Ý «×ĔüpS Ý «ćp²×Ãüp Ý Esercizio 15 Trova l’errore (2) 4ü 4üĔĔpüp z öĸĿ öċ ćp²ĬĔ ćp²Ãüà ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ł¼Ĕ łċ ćp²ĬĵłĔ Ú ćp²Ãüà Ûċ ×üł¼Ĕ Úó§pĔĔà Ü4¼óJ 4üĔĔpüp Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ łċ 4üĔĔpüp z Úü¼S ÚÛ Ü¾ĘÛ äĘĘċ ćp²Ĭ×ÃćĔ Ú ćp²Ãüà Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ćü¼S Ú Ĕł²pÚ »Ĩ§§ Û Ûċ ćp²Ĭł¼łĔ Ú ćp²Ãüà J ĿJ ĿÛċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 17 ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ Á ł¼4¨ĩSp Á ł¼4¨ĩSp Á ł¼4¨ĩSp Á ł¼4¨ĩSp «ćĔS¨ł Ý «ćĔSłÃ Ý «×ĔüpS Ý «ćp²×Ãüp Ý Esercizio 15 Trova l’errore (2) 4ü 4üĔĔpüp z öĸĿ öċ I O N A Z Z I L I T U SI ! I R O F A M E S ćp²ĬĔ ćp²Ãüà ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ł¼Ĕ łċ ćp²ĬĵłĔ Ú ćp²Ãüà Ûċ ×üł¼Ĕ Úó§pĔĔà Ü4¼óJ 4üĔĔpüp Ûċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ł¼Ĕ łċ 4üĔĔpüp z Úü¼S ÚÛ Ü¾ĘÛ äĘĘċ ćp²Ĭ×ÃćĔ Ú ćp²Ãüà Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ćü¼S Ú Ĕł²pÚ »Ĩ§§ Û Ûċ ćp²Ĭł¼łĔ Ú ćp²Ãüà J ĿJ ĿÛċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 17 Esercizio 16 Dal barbiere Negozio del barbiere: il barbiere dorme fino a che non ci sono clienti: all’arrivo di un cliente esso può: ! 1. svegliare il barbiere (nel caso stesse dormendo) 2. sedersi ed aspe1are che il barbiere abbia finito con il cliente che sta radendo al momento 3. se tu1e le sedie della sala di a1esa sono occupate, il cliente se ne va POLTRONA ! BARBIERE C1 B C3 SEDIA 2 C4 SEDIA 3 ! Implementare un programma che simula il comportamento appena descri1o. ! Si fa l’ipotesi che la particolare implementazione dei semafori sblocchi i thread secondo l’ordine di chiamata della sem_wait. 18 C2 SEDIA 1 C5 SEDIA 4 STANZA Esercizio 16 Dal barbiere Ci è utile avere due tipi di notifiche: ! ! POLTRONA ! BARBIERE 1. Quando un cliente arriva 2. Quando il barbiere è disponibile C1 B Inoltre ci serve avere: ! ! 1. Sapere quante sedie abbiamo 2. Sapere il numero di clienti nella nostra simulazione 3. Sapere quante sedie sono disponibili Infine, dobbiamo tener presente che la stanza è una risorsa condivisa tra più a1ori. 19 C2 SEDIA 1 C3 SEDIA 2 C4 SEDIA 3 C5 SEDIA 4 STANZA üpĔĩü¼ Ŀċ Esercizio 16 Dal barbiere Ci è utile avere due tipi di notifiche: ! ! POLTRONA ! BARBIERE 1. Quando un cliente arriva 2. Quando il barbiere è disponibile C1 B Inoltre ci serve avere: ! 1. Sapere quante sedie abbiamo 2. Sapere il numero di clienti nella nostra simulazione Á ł¼4¨ĩSp «ćĔS¨ł Ý 3. Sapere quante sedie sono disponibili Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Infine, dobbiamo tener presente che la stanza è una risorsa Á ł¼4¨ĩSp «ćp²×Ãüp Ý condivisa tra più a1ori. ! C3 SEDIA 2 C4 SEDIA 3 C5 SEDIA 4 STANZA Á Spł¼p »Ĩ±oûÂĬR ĬĆoR o Á Spł¼p »Ĩ±oûÂĬR Ĭ3§ o»ē ĥĿ ćp²ĬĔ ćp²ĬüłpüpĬSłć×üłł¨p J ćp²Ĭ4¨łp¼ĔpĬüüłıĔà ċ ×ĔüpSĬ²ĩĔpĸĬĔ ćĔ¼ľ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ł¼Ĕ ćpSłpĬSłć×üłł¨ł z »Ĩ±oûÂĬR ĬĆoR o ċ 19 ıÃłS üłpüp Ú ıÃłS ü Û C2 SEDIA 1 Á ł¼4¨ĩSp «ćp²×Ãüp Ý Á Spł¼p »Ĩ±oûÂĬR ĬĆoR o Á Spł¼p »Ĩ±oûÂĬR Ĭ3§ o»ē ĥĿ Dal barbiere Il barbiere ćp²ĬĔ ćp²ĬüłpüpĬSłć×üłł¨p J ćp²Ĭ4¨łp¼ĔpĬüüłıĔà ċ ×ĔüpSĬ²ĩĔpĸĬĔ ćĔ¼ľ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ł¼Ĕ ćpSłpĬSłć×üłł¨ł z »Ĩ±oûÂĬR ĬĆoR o ċ ıÃłS üłpüp Ú ıÃłS ü Û ĵł¨p Ú Ê Û ĐĐŁ¨ ûŁpûp SÂû±p ĆÖpēē»S ¨õûûŁİ SŁ Ĩ» 4¨Łp»ēp ćp²ĬĵłĔ Ú ćp²Ĭ4¨łp¼ĔpĬüüłıĔà Ûċ ĐĐŁ¨ ûŁpûp ĆŁ Ćİp¨Ł p 44±ÂSûp Ł¨ 4¨Łp»ēp ć¨pp× ÚÊÛ Đ Ēo°ÕÁ R ąoúį ļ Á Đ ćp²Ĭ×ÃćĔ Ú ćp²ĬüłpüpĬSłć×üłł¨p Ûċ ĐĐŁ¨ ûŁpûp põ Öû»ē ûp ¨ û üpĔĩü¼ »Ĩ§§ċ ıÃłS 4¨łp¼Ĕp Ú ıÃłS ü Û 20 ĐĐŁ¨ ûŁpûp SÂû±p ĆÖpēē»S ¨õûûŁİ SŁ Ĩ» 4¨Łp»ēp ćp²ĬĵłĔ Ú ćp²Ĭ4¨łp¼ĔpĬüüłıĔà Ûċ ĐĐŁ¨ ûŁpûp ĆŁ Ćİp¨Ł p 44±ÂSûp Ł¨ 4¨Łp»ēp ć¨pp× ÚÊÛ Đ Ēo°ÕÁ R ąoúį ļ Á Đ ćp²Ĭ×ÃćĔ Ú ćp²ĬüłpüpĬSłć×üłł¨p Ûċ ĐĐŁ¨ ûŁpûp põ Öû»ē ûp ¨ û Dal barbiere üpĔĩü¼ »Ĩ§§ċ Il cliente ıÃłS 4¨łp¼Ĕp Ú ıÃłS ü Û ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ćĔ¼ľ Ûċ łÚ ćpSłpĬSłć×üłł¨ł Ŀ Û ĐĐ Ł¨ 4¨Łp»ēp ĆŁ ĆŁpSp Ł» ƨ SõēēpĆ ćpSłpĬSłć×üłł¨ł ċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ćĔ¼ľ Ûċ ĐĐ Ł¨ 4¨Łp»ēp İİŁĆ Ł¨ ûŁpûp Sp¨¨ ĆĨ ÖûpĆp»Ľ ćp²Ĭ×ÃćĔ Ú ćp²Ĭ4¨łp¼ĔpĬüüłıĔà Ûċ ĐĐ Ł¨ 4¨Łp»ēp ĆÖpēē 4p Ł¨ ûŁpûp ĆŁ SŁĆÖ»ŁŁ¨p ćp²ĬĵłĔ Ú ćp²ĬüłpüpĬSłć×üłł¨p Ûċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ćĔ¼ľ Ûċ ĐĐ Ł¨ 4¨Łp»ēp ĆŁ ¨Ľ S¨¨ ĆpSŁ p ĆŁ 44±ÂS ĆĨ¨¨ Ö¨ēû» Sp¨ ûŁpûp ćpSłpĬSłć×üłł¨ł ääċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ćĔ¼ľ Ûċ ĐĐ Ł»¨±p»ēp Ł¨ 4¨Łp»ēp ûŁpĆ4p ûĆŁ ¨ û p¨ćp ĐĐ Ł¨ 4¨Łp»ēp pĆ4p S¨ »pÂĽŁÂ Sp¨ ûŁpûp ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ćĔ¼ľ Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Ú ł¼Ĕ ü4 J 4ü üı Û 21 ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ćĔ¼ľ Ûċ ĐĐ Ł»¨±p»ēp Ł¨ 4¨Łp»ēp ûŁpĆ4p ûĆŁ ¨ û p¨ćp Dal barbiere ĐĐŁ¨ 4¨Łp»ēp pĆ4p S¨ »pÂĽŁÂ Sp¨ ûŁpûp ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ćĔ¼ľ Ûċ üpĔĩü¼ »Ĩ§§ċ Il main() ł¼Ĕ ²ł¼Ú ł¼Ĕ ü4 J 4ü üı Û ×ĔüpSĬĔ ĔĬ4¨łp¼Ĕł ! »Ĩ±oûÂĬR Ĭ3§ o»ē "ċ ×ĔüpSĬĔ ĔĬüłpüp ċ ł¼Ĕ łċ ćp²Ĭł¼łĔ Ú ćp²ĬüłpüpĬSłć×üłł¨p J ĿJ Ŀ Ûċ ćp²Ĭł¼łĔ Ú ćp²Ĭ4¨łp¼ĔpĬüüłıĔà J ĿJ Ŀ Ûċ ×ĔüpSĬ4üpĔp Ú ĔĬüłpüp J »Ĩ§§ J üłpüp J »Ĩ§§ Ûċ ÃüÚ ł z Ŀċ ł « »Ĩ±oûÂĬR Ĭ3§ o»ē ċ łää Û ×ĔüpSĬ4üpĔp Ú ĔĬ4¨łp¼Ĕł ! ł "J »Ĩ§§ J 4¨łp¼Ĕp J »Ĩ§§ Ûċ ÃüÚ ł z Ŀċ ł « »Ĩ±oûÂĬR Ĭ3§ o»ē ċ łää Û ×ĔüpSĬńÃł¼ Ú ĔĬ4¨łp¼Ĕł ! ł "J »Ĩ§§ Ûċ ×ĔüpSĬńÃł¼ Ú ĔĬüłpüp J »Ĩ§§ Ûċ üpĔĩü¼ Ŀċ 22 üpĔĩü¼ Ŀċ Esercizio 17 Sequenze di esecuzione ×üł¼Ĕ ×üł¼Ĕ ×üł¼Ĕ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ʼóÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ĥ¼óÛċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ʼóÛċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ĥ¼óÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 23 üpĔĩü¼ Ŀċ Esercizio 17 Sequenze di esecuzione ×üł¼Ĕ ×üł¼Ĕ ×üł¼Ĕ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý Dato il programma, stampare tu1e i possibili output, supponendo che l’istruzione printf di stampa a schermo sia atomica (ciò supponendo che una volta iniziata la stampa dell’argomento di una printf) essa termini prima che nel sistema venga eseguita un’altra dire1iva printf. ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ʼóÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ĥ¼óÛċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ʼóÛċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ĥ¼óÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 23 üpĔĩü¼ Ŀċ Esercizio 17 Sequenze di esecuzione ×üł¼Ĕ ×üł¼Ĕ ×üł¼Ĕ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ²ĩĔpĸ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ʼóÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ĥ¼óÛċ üpĔĩü¼ »Ĩ§§ċ ²ĩĔpĸ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ʼóÛċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ĥ¼óÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ ²ĩĔpĸ üpĔĩü¼ Ŀċ 24 üpĔĩü¼ Ŀċ ²ĩĔpĸ Esercizio 17 ²ĩĔpĸ Sequenze di esecuzione ×üł¼Ĕ ×üł¼Ĕ ×üł¼Ĕ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «×ĔüpS Ý ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ıÃłS ĔĬĩ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ʼóÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼Ê ĥ¼óÛċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ĔĬĩ¼ĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ʼóÛċ ×üł¼Ĕ Úó ĔĬĩ¼ĥ ĥ¼óÛċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ üpĔĩü¼ »Ĩ§§ċ ²ĩĔpĸ ²ĩĔpĸ ²ĩĔpĸ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ĔĬĩ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ĔĬĩ¼ĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 25 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ mutexB 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ mutexB 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ mutexB 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp Ý Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ mutexB 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ ł¼Ĕ 4üĔÃĥ ÊĿĿċ z ÊĿĿċ ł¼Ĕ z4üĔÃĥ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ıÃłS ×püćüĥÚ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 ¨Ã4¦ ĩ¼¨Ã4¦ Á ł¼4¨ĩSp «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý Á ł¼4¨ĩSp «×ĔüpS Ý Esercizio 18 ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ Race conditions ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ Á ł¼4¨ĩSp «ćĔS¨ł Ý ÁÁ ł¼4¨ĩSp ł¼4¨ĩSp «ćĔSłÃÝ Á ł¼4¨ĩSp «ćĔS¨ł Ý «ćĔS¨ł Ý Á ł¼4¨ĩSp «ćĔSłÃ Ý ÁÁ ł¼4¨ĩSp ł¼4¨ĩSp «×ĔüpS Ý «ćĔSłÃÝ ¨Ã4¦ ĩ¼¨Ã4¦ ¨Ã4¦ ĩ¼¨Ã4¦ ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ üpĔĩü¼ »Ĩ§§ċ ıÃłS ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ mutexB Á ł¼4¨ĩSp Ý 4üĔÃĥ äz ĥĿċ Á ł¼4¨ĩSp «×ĔüpS«×ĔüpS Ý Ú ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ ²ĩĔpĸ z²ĩĔpĸ ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ ×ĔüpSĬ²ĩĔpĸĬĔ z ÖēûoRĬ±ĨēoķĬ » ē § Ľoû ċ 4üĔÃÊ äz Ŀċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA üpĔĩü¼ »Ĩ§§ċ ł¼Ĕ 4üĔÃÊ ÊĿĿċ ł¼Ĕ 4üĔÃÊ z ÊĿĿċ ł¼Ĕ z4üĔÃÊ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ ÊĿĿċ ł¼Ĕ z4üĔÃĥ z ÊĿĿċ ł¼Ĕ 4üĔÃĥ z ÊĿĿċ ł¼Ĕ ²ł¼Úł¼Ĕ ü4 J 4ü üı !"Û ×ĔüpSĬĔ ĔÊ J Ĕĥċ ıÃłS ıÃłS ×püćÃ¼Ê ÚıÃłS üÛ ×püćÃ¼Ê ÚıÃłS üÛ ıÃłS×ĔüpSĬ²ĩĔpĸĬ ×püćüÊêÚ ÚıÃłS üÛ mutexA ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ²ĩĔpĸ Ûċ 4üĔÃÊ äz ÊĿċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexA 4üĔÃÊ×ĔüpSĬ²ĩĔpĸĬ äz ÊĿċ êÚ ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ mutexB ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ z ĥĿċ 4üĔÃĥ êÚ z ĬĬĬĬÛċ ĥĿċ Ú ²ĩĔpĸ Ûċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ ×ĔüpSĬ²ĩĔpĸĬ mutexB ×ĔüpSĬ²ĩĔpĸĬ êÚ ĬĬĬĬÛċ 4üĔÃĥ»Ĩ§§ċ z ĥĿċ üpĔĩü¼ üpĔĩü¼ »Ĩ§§ċ ×ĔüpSĬ²ĩĔpĸĬĩ¼¨Ã4¦ Ú ²ĩĔpĸ Ûċ ıÃłS ×püćüĥ ÚıÃłS üÛ üpĔĩü¼ ıÃłS »Ĩ§§ċ ×püćüĥ ÚıÃłS üÛ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ ×ĔüpSĬ²ĩĔpĸĬ¨Ã4¦ Ú ĬĬĬĬÛċ 4üĔÃĥ äz ĥĿċ ×ĔüpSĬ4üpĔp ÚĔÊ J »Ĩ§§ J ×püćÃ¼Ê J »Ĩ§§Ûċ ×ĔüpSĬ4üpĔp ÚĔĥ J »Ĩ§§ J ×püćüĥ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔÊ J »Ĩ§§Ûċ ×ĔüpSĬńÃł¼ ÚĔĥ J »Ĩ§§Ûċ üpĔĩü¼ Ŀċ 26 Temi di Esame 27 ATTENZIONE!! Il testo degli esercizi sarà poco visibile SCARICALO ORA! ! ! ! ! ! ! http://goo.gl/sBdVTT Temi d’Esame 1 marzo 2011 29 ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 30 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo /∗ funzione di thread printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): Cognome __________________________ Nomequi ___________________ Si completi la tabella predisposta so1o sem_post (&inside); served = served + 1; /∗ variabili globali ∗/ indicando lo stato di esistenza della variabile pthread_mutex_lock (&door); pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); locale, così: Matricola __________________________ Firma ___________________ sem_t inside; served = served + 1; • se la variabile certamente esiste, si scriva int served = 0; pthread_mutex_unlock (&door); ESISTE; printf (“Service finished.\n”); Istruzioni • se certamente non esiste, si scriva NON ESISTE; return NULL; void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. • e se può essere esistente o inesistente, si } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato • scriva PUÒ ESISTERE. possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ – vedrà annullata la propria prova. ! void ∗ visitor (void ∗ bag) { sem_post (&inside); Non è possibile lasciare l’aula conservando il tema della prova in corso. Ogni casella della tabella va riempita in uno dei served = served + 1; tre modi (non va lasciata vuota). pthread_mutex_lock (&door); con subito Si badi bene alla colonna condizione: sem_post (&inside); punteggio Si completi la tabella predisposta qui sotto indicando loI parte stato di esistenza dopo statement X si chiede lo stato che la variabile II partedella variabile completolocale approssimativo nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva served =lo served + 1;eX assume tra esiste, e essere lo esistente statement ESISTE; se certamente non si statement scriva NON ESISTE; se può o inesistente, si esercizio 1 scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&door); immediatamente successivo del thread indicato. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). esercizio 2 assume tra lo statement X e lo statement immediatamente successivo del thread indicato. printf (“Service finished.\n”); esercizio 3 return NULL; variabile locale esercizio 4 condizione luggage in V1 luggage in V2 PUÒ ESISTERE PUÒ ESISTERE } /∗ gatekeeper ∗/ esercizio 5 subito dopo stat. C esercizio 6 void ∗voto visitor (void ∗ bag) { finale subito dopo stat. D in V2 int subito dopo luggage stat. E PUÒ ESISTERE = NON 0; ESISTE ATTENZIONE: alcuni esercizi sono suddivisi in parti. • luggage = (int) bag; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la pthread_mutex_unlock (&door); /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; } /∗ visitor ∗/ int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; NULL, /∗pthread_create variabile (&v1, locale = o(int) bag; il semaforo puòluggage avere valore positivo nullo (non valore negativo) /∗ statement C ∗/ /∗ statement C ∗/ PUÒ ESISTERE pthread_mutex_lock (&door); sem_wait intero, carattere, stringa, quando la (&inside); variabile ha un valore definito; oppure X quando è indefinita /∗ statement B ∗/ pthread_mutex_lock (&door); sem_wait (&inside); /∗sem_init funzione di thread (&inside, 0, 0); • se la variabile può avere due o più valori, li si riporti tutti quanti • int luggage = 0; /∗ statement B ∗/ ESISTE Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: /∗ statement A ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ ∗/ esame di martedì 1 marzo 2011 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_t inside; int served = 0; CON SOLUZIONI void ∗ gatekeeper (void ∗ arg) { ∗/ 31 AXO – Architettura dei Calcolatori e Sistemi Operativi esercizio n. 1 – thread e parallelismo printf (“Service started.\n”); Si consideri il programma C seguente (gli “#include” sono omessi): sem_post (&inside); Si completi la tabella predisposta qui so1o, Nome ___________________ served = served + 1; indicando i valori delle variabili globali (sempre /∗ variabili globali Si completi la tabella predisposta qui sotto indicando lo stato di esistenza della variabile locale pthread_mutex_lock (&door); esistenti) pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; nell’istante di tempo specificato da ciascuna door condizione,=così: se la variabile certamente esiste, si scriva Cognome __________________________ ! sem_t inside; Si badi bene alla served colonna condizione: con subito dopo statement X si chiede lo stato che la variabile Il valore della variabile va indicato così: int = 0; ESISTE; Matricola se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si __________________________ Firma ___________________ scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). assume tra lo statement X e lo statement immediatamente successivo del thread indicato. /∗ funzione di thread ∗/ printf (“Service finished.\n”); return NULL; Si badi bene alla colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo3statement immediatamente successivo del thread indicato. esercizio esercizio condizione esercizio 4 } /∗ gatekeeper ∗/ 5 variabili globali inside served subito dopo stat. A 0 0 subito dopo stat. B 0/1 1 esercizio 6 void ∗voto visitor (void ∗ bag) { finale int luggage = 0; ATTENZIONE: alcuni esercizi sono suddivisi in parti. subito dopo stat. C 1/2 2 pthread_mutex_lock (&door); 0 / 1 / 2 0/1 sem_wait (&inside); subito dopo stat. D in V1 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): luggage = (int) bag; pthread_mutex_unlock (&door); GK V1 V2 /∗ statement B ∗/ sem_post (&inside); served = served + 1; /∗ statement C ∗/ pthread_mutex_unlock (&door); printf (“Service finished.\n”); return NULL; intero,cara1ere,stringa, quando la variabile ha void ∗ gatekeeper (voidvariabile ∗ arg)locale { /∗ funzione di thread ∗/ un valore definito; oppure X quando è Scrivere solo sui fogli distribuiti. Non separare questi fogli. condizione } /∗ ingatekeeper ∗/ luggage in V1 luggage in V2 È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato indefinita possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte printf (“Service started.\n”); /∗ statement A ∗/ –• vedrà annullata propria se la variabile può avere due o più valori, li si PUÒ ESISTERE subito dopo la stat. C prova. PUÒ ESISTERE void ∗ visitor (void ∗ bag) { Non è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post riporti tu1i quindi PUÒ3h:00m ESISTERE ESISTE int luggage = 0; subito adopo stat. D 1h:30m in V2 (una parte) Tempo disposizione: (completo). • il semaforo può avere valore positivo o nullo served = served + 1; /∗ statement B ∗/ pthread_mutex_lock (&door); NON ESISTE PUÒ ESISTERE subito dopo stat. E (non negativo) pthread_mutex_lock (&door); sem_wait (&inside); Si badi bene alla colonna condizione: con subito Si completi la tabella predisposta qui (&inside); sotto, indicando i valori delle variabili globali (sempre esistenti) sem_post luggage = (int) bag; punteggio nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: I parte II parte completo approssimativo dopo statement X si chiede il valore (o i valori) che pthread_mutex_unlock (&door); • intero, carattere, stringa, quando ha un valore definito; oppure X quando è indefinita served =la variabile served + 1; /∗ statement C ∗/ return NULL; 1 valori, li si riporti tutti quanti • se la variabile può esercizio avere due o più la variabile ha tra lo statement X e lo statement (&door); • il semaforo puòpthread_mutex_unlock avere valore positivo o nullo (non valore negativo) esercizio 2 } /∗ visitor ∗/ immediatamente successivo del thread indicato. • Istruzioni /∗ statement A ∗/ int main (int argc, char ∗ argv [ ]) { /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; /∗sem_init funzione di thread (&inside, 0, 0); ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ PUÒ ESISTERE inside positivo o nullo (non valore negativo) served dizione: con subito dopo statement X si chiede il valore (o i valori) che la AXO immediatamente –globali Architettura dei Calcolatori e Sistemi Operativi 32 variabili delle esistenti) e lo statement successivo subito(sempre dopo stat. A del thread indicato.0 della variabile va indicato così: esame di martedì 1 marzo 2011 to; oppure X quando è indefinita subito dopo stat. B globali variabili CON SOLUZIONI e 0/1 esercizio n. 1 – thread e parallelismo subito dopo stat.CC 1 / 2 sono omessi): Si consideri ilinside programma seguente (gliserved “#include” o) ent X si chiede il valore (o i valori) che la Cognome thread __________________________ indicato. t.cessivo A del 0 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; 0 sem_t inside; int served = 0; 1 void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread printf 2 (“Service started.\n”); Nome ___________________ Istruzioni D in V1 GK 0/1 V1 0/1/2 V2 NULL; /∗return funzione di thread printf 1 (“Service started.\n”); /∗ statement A ∗/ void ∗ visitor (void ∗ bag) { int luggage = 0; 2 /∗ statement B ∗/ V2 e termina; V2 effettua ilpthread_mutex_lock Andamento: GK V1 esegue sem_post; V1 esegue sem_wait lock di door si blocca(&door); su pthread_mutex_lock (&door); sem_wait (&inside); sem_wait; 0GK/ si 1 blocca / 2 sul lock di door; ora V2 e GK sono in stallo; si possono scambiare i ruoli di V1 e V2. Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). served = served + 1; sem_post (&inside); punteggio approssimativo terminato served = served gli statement dove si bloccano i thread in-+ esercizio 1 I parte II parte completo 1;sem_wait (&inside) pthread_mutex_unlock (&door); esercizio 2 printf (“Service finished.\n”); AXO – esame di giovedì 2010 - CON SOLUZIONI V24 3marzo post; V1 esegue esercizio sem_wait e termina; V2 effettua il lock di door si blocca su k di door; ora V2return e GK sonoNULL; in stallo; si possono scambiare i ruoli di V1 e V2. esercizio 4 } /∗ gatekeeper ∗/ 6 void ∗voto visitor (void ∗ bag) { finale - CON SOLUZIONI a; V2 effettua il lock di door si blocca su intalcuni luggage 0; si possono scambiare i ruoli di V1 e= V2. ATTENZIONE: esercizi sono suddivisi in parti. pthread_mutex_lock (&door); sem_wait (&inside); luggage = (int) bag; pagina 3 di 18 pthread_mutex_unlock (&door); /∗ statement B ∗/ /∗ statement C ∗/ luggage = (int) bag; /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; /∗ statement C ∗/ } /∗ visitor ∗/ pagina 3 di 18 int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; esercizio(&inside) 5 sem_wait esercizio /∗ statement A ∗/ ∗/ } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock terminato sem_wait (&inside) – vedrà annullata la propria prova. (&door) stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread inNon è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post mente tutti): /∗sem_init funzione di thread (&inside, 0, 0); pagina 3 di 18 ∗/ sem_post (&inside); served = served + 1; 0 0/1 /∗ variabili globali ∗/ subito dopo stat. D in V1 0/1/2 pthread_mutex_lock (&door); Il sistema può andare in stallo (deadlock). Qui si pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); abili indichino gli statement dove si bloccano i thread t. B Ilglobali 0 / 1 1 Matricola __________________________ Firma ___________________ sem_t sistema inside; può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread served = served + 1;inincorsi in stallo (non necessariamente tu1i): corsi in stallo (non necessariamente tutti): int served = 0; pthread_mutex_unlock (&door); served t. C 1/2 2 printf (“Service finished.\n”); void ∗ gatekeeper (void ∗ arg) { Scrivere solo sui 0 fogli distribuiti. Non separare questi fogli. ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ PUÒ ESISTERE inside positivo o nullo (non valore negativo) served dizione: con subito dopo statement X si chiede il valore (o i valori) che la AXO immediatamente –globali Architettura dei Calcolatori e Sistemi Operativi 32 variabili delle esistenti) e lo statement successivo subito(sempre dopo stat. A del thread indicato.0 della variabile va indicato così: esame di martedì 1 marzo 2011 to; oppure X quando è indefinita subito dopo stat. B globali variabili CON SOLUZIONI e 0/1 esercizio n. 1 – thread e parallelismo subito dopo stat.CC 1 / 2 sono omessi): Si consideri ilinside programma seguente (gliserved “#include” o) ent X si chiede il valore (o i valori) che la Cognome thread __________________________ indicato. t.cessivo A del 0 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; 0 sem_t inside; int served = 0; 1 void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread printf 2 (“Service started.\n”); Nome ___________________ Istruzioni D in V1 GK 0/1 V1 0/1/2 V2 NULL; /∗return funzione di thread printf 1 (“Service started.\n”); /∗ statement A ∗/ void ∗ visitor (void ∗ bag) { int luggage = 0; 2 /∗ statement B ∗/ V2 e termina; V2 effettua ilpthread_mutex_lock Andamento: GK V1 esegue sem_post; V1 esegue sem_wait lock di door si blocca(&door); su pthread_mutex_lock (&door); sem_wait (&inside); sem_wait; 0GK/ si 1 blocca / 2 sul lock di door; ora V2 e GK sono in stallo; si possono scambiare i ruoli di V1 e V2. Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). served = served + 1; sem_post (&inside); punteggio approssimativo terminato served = served gli statement dove si bloccano i thread in-+ esercizio 1 I parte II parte completo 1;sem_wait (&inside) pthread_mutex_unlock (&door); esercizio 2 printf (“Service finished.\n”); AXO – esame di giovedì 2010 - CON SOLUZIONI V24 3marzo post; V1 esegue esercizio sem_wait e termina; V2 effettua il lock di door si blocca su k di door; ora V2return e GK sonoNULL; in stallo; si possono scambiare i ruoli di V1 e V2. esercizio 4 } /∗ gatekeeper ∗/ 6 void ∗voto visitor (void ∗ bag) { finale - CON SOLUZIONI a; V2 effettua il lock di door si blocca su intalcuni luggage 0; si possono scambiare i ruoli di V1 e= V2. ATTENZIONE: esercizi sono suddivisi in parti. pthread_mutex_lock (&door); sem_wait (&inside); luggage = (int) bag; pagina 3 di 18 pthread_mutex_unlock (&door); /∗ statement B ∗/ /∗ statement C ∗/ luggage = (int) bag; /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; /∗ statement C ∗/ } /∗ visitor ∗/ pagina 3 di 18 int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; esercizio(&inside) 5 sem_wait esercizio /∗ statement A ∗/ ∗/ } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock terminato sem_wait (&inside) – vedrà annullata la propria prova. (&door) stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread inNon è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post mente tutti): /∗sem_init funzione di thread (&inside, 0, 0); pagina 3 di 18 ∗/ sem_post (&inside); served = served + 1; 0 0/1 /∗ variabili globali ∗/ subito dopo stat. D in V1 0/1/2 pthread_mutex_lock (&door); Il sistema può andare in stallo (deadlock). Qui si pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); abili indichino gli statement dove si bloccano i thread t. B Ilglobali 0 / 1 1 Matricola __________________________ Firma ___________________ sem_t sistema inside; può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread served = served + 1;inincorsi in stallo (non necessariamente tu1i): corsi in stallo (non necessariamente tutti): int served = 0; pthread_mutex_unlock (&door); served t. C 1/2 2 printf (“Service finished.\n”); void ∗ gatekeeper (void ∗ arg) { Scrivere solo sui 0 fogli distribuiti. Non separare questi fogli. ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ PUÒ ESISTERE inside positivo o nullo (non valore negativo) served dizione: con subito dopo statement X si chiede il valore (o i valori) che la AXO immediatamente –globali Architettura dei Calcolatori e Sistemi Operativi 32 variabili delle esistenti) e lo statement successivo subito(sempre dopo stat. A del thread indicato.0 della variabile va indicato così: esame di martedì 1 marzo 2011 to; oppure X quando è indefinita subito dopo stat. B globali variabili CON SOLUZIONI e 0/1 esercizio n. 1 – thread e parallelismo subito dopo stat.CC 1 / 2 sono omessi): Si consideri ilinside programma seguente (gliserved “#include” o) ent X si chiede il valore (o i valori) che la Cognome thread __________________________ indicato. t.cessivo A del 0 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; 0 sem_t inside; int served = 0; 1 void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread printf 2 (“Service started.\n”); Nome ___________________ Istruzioni D in V1 GK 0/1 V1 0/1/2 V2 NULL; /∗return funzione di thread printf 1 (“Service started.\n”); /∗ statement A ∗/ void ∗ visitor (void ∗ bag) { int luggage = 0; 2 /∗ statement B ∗/ V2 e termina; V2 effettua ilpthread_mutex_lock Andamento: GK V1 esegue sem_post; V1 esegue sem_wait lock di door si blocca(&door); su pthread_mutex_lock (&door); sem_wait (&inside); sem_wait; 0GK/ si 1 blocca / 2 sul lock di door; ora V2 e GK sono in stallo; si possono scambiare i ruoli di V1 e V2. Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). served = served + 1; sem_post (&inside); punteggio approssimativo terminato served = served gli statement dove si bloccano i thread in-+ esercizio 1 I parte II parte completo 1;sem_wait (&inside) pthread_mutex_unlock (&door); esercizio 2 printf (“Service finished.\n”); AXO – esame di giovedì 2010 - CON SOLUZIONI V24 3marzo post; V1 esegue esercizio sem_wait e termina; V2 effettua il lock di door si blocca su k di door; ora V2return e GK sonoNULL; in stallo; si possono scambiare i ruoli di V1 e V2. esercizio 4 } /∗ gatekeeper ∗/ 6 void ∗voto visitor (void ∗ bag) { finale - CON SOLUZIONI a; V2 effettua il lock di door si blocca su intalcuni luggage 0; si possono scambiare i ruoli di V1 e= V2. ATTENZIONE: esercizi sono suddivisi in parti. pthread_mutex_lock (&door); sem_wait (&inside); luggage = (int) bag; pagina 3 di 18 pthread_mutex_unlock (&door); /∗ statement B ∗/ /∗ statement C ∗/ luggage = (int) bag; /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; /∗ statement C ∗/ } /∗ visitor ∗/ pagina 3 di 18 int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; esercizio(&inside) 5 sem_wait esercizio /∗ statement A ∗/ ∗/ } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock terminato sem_wait (&inside) – vedrà annullata la propria prova. (&door) stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread inNon è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post mente tutti): /∗sem_init funzione di thread (&inside, 0, 0); pagina 3 di 18 ∗/ sem_post (&inside); served = served + 1; 0 0/1 /∗ variabili globali ∗/ subito dopo stat. D in V1 0/1/2 pthread_mutex_lock (&door); Il sistema può andare in stallo (deadlock). Qui si pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); abili indichino gli statement dove si bloccano i thread t. B Ilglobali 0 / 1 1 Matricola __________________________ Firma ___________________ sem_t sistema inside; può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread served = served + 1;inincorsi in stallo (non necessariamente tu1i): corsi in stallo (non necessariamente tutti): int served = 0; pthread_mutex_unlock (&door); served t. C 1/2 2 printf (“Service finished.\n”); void ∗ gatekeeper (void ∗ arg) { Scrivere solo sui 0 fogli distribuiti. Non separare questi fogli. ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ PUÒ ESISTERE inside positivo o nullo (non valore negativo) served dizione: con subito dopo statement X si chiede il valore (o i valori) che la AXO immediatamente –globali Architettura dei Calcolatori e Sistemi Operativi 32 variabili delle esistenti) e lo statement successivo subito(sempre dopo stat. A del thread indicato.0 della variabile va indicato così: esame di martedì 1 marzo 2011 to; oppure X quando è indefinita subito dopo stat. B globali variabili CON SOLUZIONI e 0/1 esercizio n. 1 – thread e parallelismo subito dopo stat.CC 1 / 2 sono omessi): Si consideri ilinside programma seguente (gliserved “#include” o) ent X si chiede il valore (o i valori) che la Cognome thread __________________________ indicato. t.cessivo A del 0 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; 0 sem_t inside; int served = 0; 1 void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread printf 2 (“Service started.\n”); Nome ___________________ Istruzioni D in V1 GK 0/1 V1 0/1/2 V2 NULL; /∗return funzione di thread printf 1 (“Service started.\n”); /∗ statement A ∗/ void ∗ visitor (void ∗ bag) { int luggage = 0; 2 /∗ statement B ∗/ V2 e termina; V2 effettua ilpthread_mutex_lock Andamento: GK V1 esegue sem_post; V1 esegue sem_wait lock di door si blocca(&door); su pthread_mutex_lock (&door); sem_wait (&inside); sem_wait; 0GK/ si 1 blocca / 2 sul lock di door; ora V2 e GK sono in stallo; si possono scambiare i ruoli di V1 e V2. Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). served = served + 1; sem_post (&inside); punteggio approssimativo terminato served = served gli statement dove si bloccano i thread in-+ esercizio 1 I parte II parte completo 1;sem_wait (&inside) pthread_mutex_unlock (&door); esercizio 2 printf (“Service finished.\n”); AXO – esame di giovedì 2010 - CON SOLUZIONI V24 3marzo post; V1 esegue esercizio sem_wait e termina; V2 effettua il lock di door si blocca su k di door; ora V2return e GK sonoNULL; in stallo; si possono scambiare i ruoli di V1 e V2. esercizio 4 } /∗ gatekeeper ∗/ 6 void ∗voto visitor (void ∗ bag) { finale - CON SOLUZIONI a; V2 effettua il lock di door si blocca su intalcuni luggage 0; si possono scambiare i ruoli di V1 e= V2. ATTENZIONE: esercizi sono suddivisi in parti. pthread_mutex_lock (&door); sem_wait (&inside); luggage = (int) bag; pagina 3 di 18 pthread_mutex_unlock (&door); /∗ statement B ∗/ /∗ statement C ∗/ luggage = (int) bag; /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; /∗ statement C ∗/ } /∗ visitor ∗/ pagina 3 di 18 int main (int argc, char ∗ argv [ ]) { /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; esercizio(&inside) 5 sem_wait esercizio /∗ statement A ∗/ ∗/ } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock terminato sem_wait (&inside) – vedrà annullata la propria prova. (&door) stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread inNon è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post mente tutti): /∗sem_init funzione di thread (&inside, 0, 0); pagina 3 di 18 ∗/ sem_post (&inside); served = served + 1; 0 0/1 /∗ variabili globali ∗/ subito dopo stat. D in V1 0/1/2 pthread_mutex_lock (&door); Il sistema può andare in stallo (deadlock). Qui si pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); abili indichino gli statement dove si bloccano i thread t. B Ilglobali 0 / 1 1 Matricola __________________________ Firma ___________________ sem_t sistema inside; può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread served = served + 1;inincorsi in stallo (non necessariamente tu1i): corsi in stallo (non necessariamente tutti): int served = 0; pthread_mutex_unlock (&door); served t. C 1/2 2 printf (“Service finished.\n”); void ∗ gatekeeper (void ∗ arg) { Scrivere solo sui 0 fogli distribuiti. Non separare questi fogli. ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ PUÒ ESISTERE inside positivo o nullo (non valore negativo) served dizione: con subito dopo statement X si chiede il valore (o i valori) che la AXO immediatamente –globali Architettura dei Calcolatori e Sistemi Operativi 32 variabili delle esistenti) e lo statement successivo subito(sempre dopo stat. A del thread indicato.0 della variabile va indicato così: esame di martedì 1 marzo 2011 to; oppure X quando è indefinita subito dopo stat. B globali variabili CON SOLUZIONI e 0/1 esercizio n. 1 – thread e parallelismo subito dopo stat.CC 1 / 2 sono omessi): Si consideri ilinside programma seguente (gliserved “#include” o) ent X si chiede il valore (o i valori) che la Cognome thread __________________________ indicato. t.cessivo A del 0 /∗ variabili globali pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; 0 sem_t inside; int served = 0; 1 void ∗ gatekeeper (void ∗ arg) { /∗ funzione di thread printf 2 (“Service started.\n”); Nome ___________________ Istruzioni D in V1 GK 0/1 V1 0/1/2 V2 NULL; /∗return funzione di thread printf 1 (“Service started.\n”); /∗ statement A ∗/ void ∗ visitor (void ∗ bag) { int luggage = 0; 2 /∗ statement B ∗/ V2 e termina; V2 effettua ilpthread_mutex_lock Andamento: GK V1 esegue sem_post; V1 esegue sem_wait lock di door si blocca(&door); su pthread_mutex_lock (&door); sem_wait (&inside); sem_wait; 0GK/ si 1 blocca / 2 sul lock di door; ora V2 e GK sono in stallo; si possono scambiare i ruoli di V1 e V2. Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). served = served + 1; sem_post (&inside); punteggio approssimativo terminato served = served gli statement dove si bloccano i thread in-+ esercizio 1 I parte II parte completo 1;sem_wait (&inside) pthread_mutex_unlock (&door); esercizio 2 printf (“Service finished.\n”); AXO – esame di giovedì 2010 - CON SOLUZIONI V24 3marzo post; V1 esegue esercizio sem_wait e termina; V2 effettua il lock di door si blocca su k di door; ora V2return e GK sonoNULL; in stallo; si possono scambiare i ruoli di V1 e V2. esercizio 4 } /∗ gatekeeper ∗/ 6 void ∗voto visitor (void ∗ bag) { finale - CON SOLUZIONI a; V2Andamento: effettua il lock di door si bloccasem_post; su GK esegue int luggage = 0; si possono scambiare i ruoli di V1 e V2. ATTENZIONE: alcuni esercizi sono suddivisi in parti. luggage = (int) bag; /∗ statement C ∗/ /∗ funzione di thread ∗/ /∗ variabile locale ∗/ /∗ statement D ∗/ pthread_mutex_unlock (&door); return NULL; /∗ statement C ∗/ } /∗ visitor ∗/ pagina 3 di 18 int main (int argc, char ∗ argv [ ]) { /∗sem_init funzione di thread (&inside, 0, 0); pagina 3 di 18 V1 esegue sem_wait e termina; V2 effettua il lock di door si pthread_mutex_lock (&door); blocca su sem_wait; GK si blocca sul lock di door; (&inside); ora V2 esem_wait GK sono in stallo; si possono scambiare i (int) bag; ruoli di luggage V1 e V2. = pagina 3 di 18 pthread_mutex_unlock (&door); /∗ statement B ∗/ /∗ thread principale pthread_t gk, v1, v2; int bag1 = 4; int bag2 = 8; esercizio(&inside) 5 sem_wait esercizio /∗ statement A ∗/ ∗/ } /∗ ingatekeeper ∗/ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock terminato sem_wait (&inside) – vedrà annullata la propria prova. (&door) stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread inNon è possibile lasciare l’aula (&inside); conservando il tema della prova in corso. sem_post mente tutti): ∗/ sem_post (&inside); served = served + 1; 0 0/1 /∗ variabili globali ∗/ subito dopo stat. D in V1 0/1/2 pthread_mutex_lock (&door); Il sistema può andare in stallo (deadlock). Qui si pthread_mutex_t door = PTHREAD_MUTEX_INITIALIZER; sem_post (&inside); abili indichino gli statement dove si bloccano i thread t. B Ilglobali 0 / 1 1 Matricola __________________________ Firma ___________________ sem_t sistema inside; può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread served = served + 1;inincorsi in stallo (non necessariamente tu1i): corsi in stallo (non necessariamente tutti): int served = 0; pthread_mutex_unlock (&door); served t. C 1/2 2 printf (“Service finished.\n”); void ∗ gatekeeper (void ∗ arg) { Scrivere solo sui 0 fogli distribuiti. Non separare questi fogli. ∗/ ∗/ pthread_create (&gk, NULL, &gatekeeper, NULL); NULL, /∗pthread_create variabile (&v1, locale &visitor, (void ∗) bag1); ∗/ pthread_create (&v2, NULL, &visitor, (void ∗) bag2); pthread_join (gk); pthread_join (v1); pthread_join (v2); /∗ statement D ∗/ } /∗ main ∗/ /∗ statement E ∗/ ∗/ Temi d’Esame 3 settembre 2010 33 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 34 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ Si consideri il programma C seguente (gli “#include” sono omessi): Si completino le tabelle, indicando gli state delle /∗ global mutex /∗ constants sem_t Cognome __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può #define DATA_SIZE 2 pthread_mutex_t essere: and semaphore variables ∗/ sems [DATA_SIZE]; mutex = PTHREAD_MUTEX_INITIALIZER; !Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ void ∗ th_fun (void ∗ arg) { (quando il valore è ∗/ ∗/ ∗/ intero, stringa char p =cara1ere, 0; /∗ local variable ∗/ definito) int data_in [DATA_SIZE] = { 3, 7 }; int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici variables e telefoni cellulari. Chiunque fosseif trovato •È/∗ NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t • p++; Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). ! /∗ thread function Si presti colonna "ʺcondizione"ʺ. In tutte esiSi completino le a1enzione tabelle riportate sotto,alla indicando gli stati delle variabili GLOBALI (ovviamente stenti) e LOCALI, negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: void ∗ th_fun (void ∗ dopo arg) statement { particolare, con "ʺsubito X"ʺ si • intero, carattere, stringa, quando la variabile ha valore definito punteggio /∗ stat. C ∗/ /∗ stat. D ∗/ pthread_mutex_unlock (&mutex); sem_wait (&sems [r]); ∗/ return 0; /∗ local variable ∗/ I parte II parte completo intendono richiedere i valori che le variabili possono } /∗ th_fun ∗/ =non(int) arg; •assumere NE, se int la variabilerpuò esistere tra lo statement X e lo statement esercizio 1 5 /∗ main thread • se la variabile si può trovare in due o più stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella /∗ esercizio data_out is updated to the rotated contents of data_in ∗/ 2 6 Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendo-int main (int argc, char ∗∗ argv) { condizione stessa. no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente if esercizio (r indicato == 3nella 0)condizione data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 stessa. successivo del thread int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 • X, quando la variabile non è stataapprossimativo ancora inizializzata variabili globali del programma condizione pthread_mutex_lock (&mutex); esercizio 5 6 data_out [0] p++; esercizio subito dopo le statement del thread th [0] 6 A data_out [1] p X/3 0/1 3 0/1 5 7 sem_wait B (&semsX / 7[r]); subito dopo le statement del thread th [1] ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return le statement C }subito /∗dopoth_fun ∗/ del thread th [0] 7 X/3 /∗ main thread variabili locali dei thread int condizione main (int argc, char ∗∗ argv) { 1/2 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C pthread_mutex_unlock (&mutex); voto finale ∗/ ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 35 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ consideri ille programma seguente (gligli“#include” sono omessi): SiSicompletino tabelle riportateC sotto, indicando stati delle variabili GLOBALI (ovviamente tutte esistenti) e LOCALI, negli le istanti di tempo specificati. Lo stato variabile può essere come: Si completino tabelle, indicando gli di una state delle /∗indicato global mutex and semaphore variables ∗/ /∗ constants ∗/ sem_t sems [DATA_SIZE]; __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può •Cognome intero, carattere, stringa, quando la variabile ha valore definito #define DATA_SIZE 2 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; essere: • X, quando la variabile non è stata ancora inizializzata NE, se la variabile può non esistere !•Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ • se la variabilecara1ere, si può trovare in due o più stati, li si riporti il tutti valore quanti void ∗ th_fun (void ∗ arg) { • intero, stringa (quando è ∗/ ∗/ char p = 0; /∗ local variable ∗/ definito) Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendoint data_in [DATA_SIZE] = { 3, 7 }; no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata successivo del thread indicato nella condizione stessa. int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosseif trovato •È/∗ variabilivariables globali del programma NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte condizione else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; data_out [0] data_out [1] p pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Tempo a disposizione: 1h:30m A (una parte) 3h:00m (completo). subito dopo le statement ! del thread thread th [0] function 7 X/3 p++; 0/1 pthread_mutex_unlock (&mutex); /∗presti a1enzione alla colonna "ʺcondizione"ʺ. In Si sem_wait (&sems void ∗ th_fun (void ∗ arg) { particolare, con "ʺsubito dopo statement X"ʺ si return 0; subito dopo le statement Bpunteggio X / 7 3 0/1 /∗ local variable I parte II parte completo intendono richiedere i valori che le variabili possono del thread th [1] approssimativo } /∗ th_fun ∗/ intesercizio r tra = (int) arg; assumere lo statement X e lo statement 1 5 [r]); ∗/ /∗ stat. C ∗/ /∗ stat. D ∗/ ∗/ /∗ main thread ∗/ subito le statement Cis updated to the rotated contents of data_in immediatamente successivo del thread indicato nella /∗dopo data_out ∗/ { 7 X/3 1 / 2 (int argc, char ∗∗ argv) esercizio 2 6 int main del thread th [0] condizione stessa. if esercizio (r == 30) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 variabili locali dei thread pthread_mutex_lock (&mutex); condizione esercizio 5 6 p++; esercizio 6 5 r in th [0] r in th [1] pthread_mutex_unlock (&mutex); subito dopo statement D votolofinale O / NE del thread th [1] sem_wait (&sems [r]); ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return subito dopo lo statement E nella prima iterazione del ciclo for } /∗ delth_fun ∗/ thread main /∗ main thread int main (int argc, char ∗∗ argv) { 1 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 35 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ consideri ille programma seguente (gligli“#include” sono omessi): SiSicompletino tabelle riportateC sotto, indicando stati delle variabili GLOBALI (ovviamente tutte esistenti) e LOCALI, negli le istanti di tempo specificati. Lo stato variabile può essere come: Si completino tabelle, indicando gli di una state delle /∗indicato global mutex and semaphore variables ∗/ /∗ constants ∗/ sem_t sems [DATA_SIZE]; __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può •Cognome intero, carattere, stringa, quando la variabile ha valore definito #define DATA_SIZE 2 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; essere: • X, quando la variabile non è stata ancora inizializzata NE, se la variabile può non esistere !•Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ • se la variabilecara1ere, si può trovare in due o più stati, li si riporti il tutti valore quanti void ∗ th_fun (void ∗ arg) { • intero, stringa (quando è ∗/ ∗/ char p = 0; /∗ local variable ∗/ definito) Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendoint data_in [DATA_SIZE] = { 3, 7 }; no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata successivo del thread indicato nella condizione stessa. int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosseif trovato •È/∗ variabilivariables globali del programma NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte condizione else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; data_out [0] data_out [1] p pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Tempo a disposizione: 1h:30m A (una parte) 3h:00m (completo). subito dopo le statement ! del thread thread th [0] function 7 X/3 p++; 0/1 pthread_mutex_unlock (&mutex); /∗presti a1enzione alla colonna "ʺcondizione"ʺ. In Si sem_wait (&sems void ∗ th_fun (void ∗ arg) { particolare, con "ʺsubito dopo statement X"ʺ si return 0; subito dopo le statement Bpunteggio X / 7 3 0/1 /∗ local variable I parte II parte completo intendono richiedere i valori che le variabili possono del thread th [1] approssimativo } /∗ th_fun ∗/ intesercizio r tra = (int) arg; assumere lo statement X e lo statement 1 5 [r]); ∗/ /∗ stat. C ∗/ /∗ stat. D ∗/ ∗/ /∗ main thread ∗/ subito le statement Cis updated to the rotated contents of data_in immediatamente successivo del thread indicato nella /∗dopo data_out ∗/ { 7 X/3 1 / 2 (int argc, char ∗∗ argv) esercizio 2 6 int main del thread th [0] condizione stessa. if esercizio (r == 30) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 variabili locali dei thread pthread_mutex_lock (&mutex); condizione esercizio 5 6 p++; esercizio 6 5 r in th [0] r in th [1] pthread_mutex_unlock (&mutex); subito dopo statement D votolofinale O / NE del thread th [1] sem_wait (&sems [r]); ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return subito dopo lo statement E nella prima iterazione del ciclo for } /∗ delth_fun ∗/ thread main /∗ main thread int main (int argc, char ∗∗ argv) { 1 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ 35 AXO – Architettura dei Calcolatori e Sistemi Operativi esame di venerdì 3 settembre 2010 CON SOLUZIONI esercizio n. 1 – thread e parallelismo /∗ constants #define DATA_SIZE 2 ∗/ /∗ global variables char p = 0; int data_in [DATA_SIZE] = { 3, 7 }; int data_out [DATA_SIZE]; ∗/ consideri ille programma seguente (gligli“#include” sono omessi): SiSicompletino tabelle riportateC sotto, indicando stati delle variabili GLOBALI (ovviamente tutte esistenti) e LOCALI, negli le istanti di tempo specificati. Lo stato variabile può essere come: Si completino tabelle, indicando gli di una state delle /∗indicato global mutex and semaphore variables ∗/ /∗ constants ∗/ sem_t sems [DATA_SIZE]; __________________________ Nome ___________________ variabili globali e locali. Lo stato di una variabile può •Cognome intero, carattere, stringa, quando la variabile ha valore definito #define DATA_SIZE 2 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; essere: • X, quando la variabile non è stata ancora inizializzata NE, se la variabile può non esistere !•Matricola /∗ global variables __________________________ /∗ thread function Firma ___________________ • se la variabilecara1ere, si può trovare in due o più stati, li si riporti il tutti valore quanti void ∗ th_fun (void ∗ arg) { • intero, stringa (quando è ∗/ ∗/ char p = 0; /∗ local variable ∗/ definito) Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intendoint data_in [DATA_SIZE] = { 3, 7 }; no richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente int r = (int) arg; •Istruzioni X, quando la variabile non è ancora stata successivo del thread indicato nella condizione stessa. int data_out [DATA_SIZE]; /∗ data_out is updated to the rotated contents of data_in ∗/ Scrivere solo sui fogli distribuiti. Non separare questi fogli. inizializzata (r in== 0) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosseif trovato •È/∗ variabilivariables globali del programma NE, se la variabile può non esistere global mutex and semaphore ∗/ possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte condizione else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ vedrà annullata la propria prova. •–sem_t se la variabile si può trovare in due o più stati, li si sems [DATA_SIZE]; data_out [0] data_out [1] p pthread_mutex_lock (&mutex); Non è possibile lasciare l’aula conservando il tema della prova in corso. riporti tu1i quanti mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Tempo a disposizione: 1h:30m A (una parte) 3h:00m (completo). subito dopo le statement ! del thread thread th [0] function 7 X/3 p++; 0/1 pthread_mutex_unlock (&mutex); /∗presti a1enzione alla colonna "ʺcondizione"ʺ. In Si sem_wait (&sems void ∗ th_fun (void ∗ arg) { particolare, con "ʺsubito dopo statement X"ʺ si return 0; subito dopo le statement Bpunteggio X / 7 3 0/1 /∗ local variable I parte II parte completo intendono richiedere i valori che le variabili possono del thread th [1] approssimativo } /∗ th_fun ∗/ intesercizio r tra = (int) arg; assumere lo statement X e lo statement 1 5 [r]); ∗/ /∗ stat. C ∗/ /∗ stat. D ∗/ ∗/ /∗ main thread ∗/ subito le statement Cis updated to the rotated contents of data_in immediatamente successivo del thread indicato nella /∗dopo data_out ∗/ { 7 X/3 1 / 2 (int argc, char ∗∗ argv) esercizio 2 6 int main del thread th [0] condizione stessa. if esercizio (r == 30) data_out [0] = data_in [DATA_SIZE – 1]; /∗ stat. A ∗/ /∗ local variable 5 int i; else data_out [r] = data_in [r – 1]; /∗ stat. B ∗/ esercizio 4 5 variabili locali dei thread pthread_mutex_lock (&mutex); condizione esercizio 5 6 p++; esercizio 6 5 r in th [0] r in th [1] pthread_mutex_unlock (&mutex); subito dopo statement D votolofinale O / NE del thread th [1] sem_wait (&sems [r]); ATTENZIONE: alcuni0; esercizi sono suddivisi in parti. return subito dopo lo statement E nella prima iterazione del ciclo for } /∗ delth_fun ∗/ thread main /∗ main thread int main (int argc, char ∗∗ argv) { 1 ∗/ /∗ local thread id variable pthread_t th [DATA_SIZE]; /∗ stat. C ∗/ ∗/ for (i = 0; i < DATA_SIZE; i++) { sem_init (&sems [i], 0, 0); pthread_create (&th [i], NULL, th_fun, (void ∗) i); /∗ stat. D ∗/ } /∗ end for ∗/ /∗ wait cycle while (p < DATA_SIZE); for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); ∗/ /∗ stat. E ∗/ for (i = 0; i < DATA_SIZE; i++) ∗/ pthread_join (th [i], NULL); } /∗ main ∗/ Temi d’Esame 19 novembre 2010 36 int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 37 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void toss (void arg) { int coin = (int) arg; Si consideri il programma C seguente (gli “#include” sono omessi): pthread_mutex_lock (&cover); Cognome ________________________ Nome _______________________ Si intcompletino well = 0; le tabelle, indicando gli state delle well = well + coin; variabili globali e locali. Lo stato di una variabile può pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_unlock essere: Matricola _____________________Firma ___________________________ sem_t sem; ! / statement A / / statement B / statement C / (&cover); coin = 0; (void •void intero, toss cara1ere, sem_post (&sem); arg) { (quando il valore è stringa return NULL; int coin = (int) arg; definito) Istruzioni } / end toss / pthread_mutex_lock (&cover); • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. void fish (void arg) Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata well = well + coin; / statement A /{ È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; • inNE, se la variabile può non esistere possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande pthread_mutex_unlock (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); • Non è possibile lasciare l’aula conservando il tema della prova in corso. se la variabile si può trovare in due o più stati, li si coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); riporti tu1i quanti sem_post (&sem); !Valorereturn indicativo di domande ed esercizi, voti parziali e voto finale: NULL; Si presti a1enzione alla colonna "ʺcondizione"ʺ. In 1 (4 /punti) _________________________ } /Esercizio endsotto toss Si completi la tabella riportata, indicando gli stati delle variabili statement GLOBALI (ovviamenteX"ʺ tutte esistenti) particolare, con "ʺsubito dopo si negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come: Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { intendono richiedere i valori che le variabili possono intero, carattere, stringa, quando la variabile ha valore definito X, quando la variabile non è stata ancora inizializzata Esercizio 3tra (4 (int) punti) arg; _________________________ assumere X e lo statement int se la variabile si puòcoin trovare in=duelo o più statement stati, li si riporti tutti quanti immediatamente successivo del thread indicato nella sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente succondizione stessa. cessivo del thread indicato nella condizione stessa. (&cover); pthread_mutex_lock Esercizio 5 (1 punti) _________________________ well = well - coin; well = well - coin; pthread_mutex_unlock (&cover); coin = 2 return NULL; } / Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); well coin = 2 return NULL; } / end fish sem coin; subito stat. A in visitor [0] 5 / 10 CON dopo SOLUZIONI (in corsivo) / subito dopo stat. B in fisher / pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); / 0/1 statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void 9 0 void main (...) { pthread_t visitor subito dopo stat. C in main end fish void main (...) { variabili globali I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin; pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); [2], 10 / 9 fisher; 1/0 sem_init (&sem, 0, 0); Si completi pthread_create la tabella sotto predisposta indicando - per ciascuno[0], degli istanti di tempo&toss, specificati - se(void le / (&visitor NULL, variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può non esistere, si lasci in bianco la casella corrispondente. ) 1); pthread_join (fisher); return; )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / int well = 0; 38 AXO – Architettura dei Calcolatori e Sistemi Operativi pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; Prova di venerdì 19 novembre 2010 sem_t sem; Esercizio n. 1 – modello thread e parallelismo void Si consideri il programma C seguente (gli “#include” sono omessi): toss (void arg) { int coin = (int) arg; pthread_mutex_lock (&cover); Si completi la tabella sotto riportata, indicando gli stati delle variabili GLOBALI_______________________ (ovviamente tutte esistenti) Cognome ________________________ Nome intdi tempo well = 0;Lo stato di una variabile può essere indicato come: negli istanti specificati. well = well + coin; intero, carattere, stringa, quando la variabile ha valore definito pthread_mutex_t cover = PTHREAD_MUTEX_INITIALIZER; X, quando la variabile non è stata ancora inizializzata pthread_mutex_unlock se la variabile si può trovare in due o più stati, li si riporti tutti quanti Matricola _____________________Firma ___________________________ sem_t sem; Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori chetoss le variabili(void possono assumere tra lo statement X e lo statement immediatamente sucvoid arg) { cessivo del thread indicato nella condizione stessa. Analizzare ora le variabili locali e dire se esistono con int coin = (int) arg; certezza o meno oppure se si è certe della fa1o che Istruzioni variabili globali pthread_mutex_lock (&cover); non esistono. condizione Si scriva solo sui fogli distribuiti. Non si separino questi fogli. / statement A / / statement B / statement C / (&cover); coin = 0; sem_post (&sem); return NULL; } / end toss / ! sem void fish (void arg) /{ Per i calcoli si utilizzino le pagine bianchewell in fondo allo scritto. well = well + coin; / statement È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato int procoin = (int) arg; in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande subito pthread_mutex_unlock dopo stat. A in visitor [0] 5 / 10 0 / 1 (&cover); poste – vedrà annullata la propria prova. sem_wait (&sem); Non è possibile lasciare l’aula conservando il tema della prova in corso. coin = 0; Tempo a disposizione: 2 h : 30 m pthread_mutex_lock (&cover); Si presti a1enzione alla colonna "ʺcondizione"ʺ. In particolare, con "ʺsubito dopo statement X"ʺ si intendono richiedere i valori che le variabili possono subito dopo stat. B in(&sem); fisher 9 0 sem_post assumere tra lo statement X e lo statement Valore indicativo di domande ed esercizi, voti parziali e voto finale: return NULL; immediatamente successivo del thread indicato nella subito dopo stat. C in main 10 / 9 1/0 1 (4 /punti) _________________________ } /Esercizio end toss condizione stessa. Esercizio 2 (4.5 punti) arg) _________________________ void fish (void { Si completi la tabella sotto predisposta indicando - per ciascuno degli istanti di tempo specificati - se le variabili riportate esistono con certezza. Nei casi in cui la variabile considerata non esiste oppure può Esercizio 3 (4 (int) punti) arg; _________________________ non esistere, int si lasci incoin bianco la = casella corrispondente. sem_wait (&sem); Esercizio 4 (2.5 punti) _________________________ Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente sucpthread_mutex_lock (&cover); cessivo del thread indicato5nella (1 condizione stessa. _________________________ Esercizio punti) well = well - coin; variabili locali dei thread Voto finale: (16 punti) ______________________ condizione pthread_mutex_unlock (&cover); coin in visitor [0] I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. coin = 2 coin; CON dopo SOLUZIONI (in corsivo) esiste con certezza subito stat. A in visitor [0] return NULL; } / end fish coin in fisher void main (...) { (può non esistere) pthread_mutex_unlock (&cover); coin = 2 coin; return NULL; } / end fish / void main (...) { pthread_t visitor [2], fisher; sem_init (&sem, 0, 0); pthread_create (&visitor [0], NULL, &toss, (void ) 5); pthread_create (&visitor [1], NULL, &toss, (void ) 5); statement sem_wait (&sem); B / pthread_create (&fisher, NULL, &fish, (void (può non esistere) esiste con certezza (non esiste) sem_init (&sem, 0, 0); (può non esistere) ) 1); pthread_join (visitor [0], NULL); pthread_join (visitor [1], NULL); pthread_t visitor [2], fisher; subito dopo stat. C in main well = well - coin; / / subito dopo stat. B in fisher A pthread_join (fisher); return; pthread_create (&visitor [0], NULL, &toss, (void/ )end 5);main / / Temi d’Esame 4 luglio 2011 39 Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 40 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void Si consideri il programma C seguente (gli “#include” sono omessi): header (void Calcolatori e Sistemi Operativi 011 posted = posted + 1; / funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / printf (“Finished.\n”); printf (“Started.\n”); return NULL; / variabili globali pthread_mutex_lock /(&gate); Cognome___________________________ Nome __________________ / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione Si completi la tabella predisposta qui so1o indicando int posted = 1; Matricola Firma __________________ pthread_mutex_unlock (&gate); lo stato ___________________________ di esistenza della variabile locale nell’istante int gone = 0; / variabile printf (“Finished.\n”); di tempo specificato da ciascuna condizione, così: se / funzione return void header (void arg) diNULL; thread / pthread_mutex_lock (&gate); / statement la variabile certamente esiste, si scriva ESISTE; se sem_wait (&pass); ____________ Nome __________________ Istruzioni / header / printf (“Started.\n”); pthread_mutex_unlock (&gate); certamente non esiste, si scriva NON ESISTE; e se Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. pthread_mutex_lock / statement void in trailer (void id) gone = 1; / funzione di thread / può esistente o inesistente, scriva PUÒ È vietatoessere portare all’esame libri, eserciziari, appunti, calcolatricisi e telefoni cellulari. Chiunque fosse trovato sem_post (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte ____________ Firma __________________ ESISTERE. casella della tabella va riempita in – vedrà annullata laOgni propria prova. posted = posted + (int) /id;variabile locale int gone / posted = posted + 1; / statement A =/ 0; return NULL; Non è possibile lasciare l’aula conservando il tema della prova in corso. uno dei tre modi (non va lasciata vuota). pthread_mutex_unlock (&gate); printf (“Finished.\n”); Si badi bene alla colonna condizione: con subito dopo return NULL; ! pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). / approssimativo void trailer (void6 id) / doSiil badi tema della in corso. bene allaprova colonna condizione: con subito dopo statement X si chiede lo stato che la variabile assume tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio 3 5 e) 3h:00m (completo). int gone = 0; esercizio condizione ggio mativo / 5 4 variabile locale pthread_mutex_lock (&gate); esercizio 5 6 I parte II parte gone in TR1 completo gone in TR2 voto finale gone = 1; sem_post (&pass); ESISTEin parti. subito dopo stat.alcuni C in esercizi TR1 sono suddivisi ATTENZIONE: posted = posted + (int) id; return NULL; subito dopo stat. D / trailer PUÒ ESISTERE se la variabile può avere due o più valori, li si riporti tutti quanti pthread_create &trailer, (void (a) Indicare il numero di pagine fisiche e il (&tr2, numero di NULL, pagine logiche del sistema. ) 2); / n. pagine fisiche: 8 pthread_join (hr); n. pagine logiche: 16 pthread_join (tr2); / / che eseguono i programmi X e Y, che condi- CX: 8 K DX: 4 K PX: 4 K COND: 4 K CY: 8 K DY: 4 K PY: 4 K COND: 4 K / Y 0 CX0 CY0 1 CX1 CY1 DX0 DY0 COND / COND pthread_create (&tr2, NULL, &trailer, (void Il segmento COND è allocato lasciando 2 papthread_joingine (hr); libere dopo il segmento dati di X e Y. ) 2); 3 / / / X ) 1); 2 main statement indirizzo di pagina virtuale pthread_create (&tr1, NULL, &trailer, (void thread principale / thread principale 4 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI in tabella la struttura in pagine della 5 pthread_joinInserire (tr2); / statement memoria virtuale dei due programmi X e Y 6 pthread_join(notazione: (tr1);CX0, CX1, DX0, PX0,… CY0, …, COND0, ...). 7 NON ESISTE intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita ) 1); pthread_t hr, tr1, tr2; / main vidono un segmento dati. / La dimensione iniziale dei segmenti dei due programmi è la sesem_init (&pass, 0, 0); guente: pthread_create (&hr, NULL, &header, NULL); statement C / / thread pr (&tr1, NULL, &trailer, (void variabile locale / trailer / PUÒ ESISTERE argv [ ]) / rametri seguenti: la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e funzione di thread /pagine pthread_create dimensione delle è di 4096 byte. return NULL; int main (int charsaranno argv [ i ]) statement B /argc, pthread_join (tr1); (b) Nel sistema attivati processi P e Q Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: / pthread_t hr, tr1, tr2; / statement C / esercizio n. 2 – memoria virtuale sem_init (&pass, 0, 0); sem_post (&pass); Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai p pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; / int main (int argc, char argv [ ]) / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. A statement B gone = 1; Si appunti, completicalcolatrici tabella predisposta indicando lofosse statotrovato di esistenza della variabile locale ari, e telefoni cellulari. Chiunque in /lalo header /qui tra statement X sotto e condizione, lo statement immediatamente nell’istante di tempo specificato da1ciascuna così: se la proposte variabile certamente esiste, si scriva esercizio 5 alle domande corso – anche se non strettamente attinente successivo del thread indicato. / / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock punteggio arare questi fogli. II parte completo I parte statement X si chiede lo stato che la variabile assume ESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE.esercizio Ogni casella 2 della tabella va riempita in uno dei tre modi (non va lasciata vuota). trailer 8 9 D Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Antola prof.ssa Donatella Sciuto Breveglieri dei Calcolatori 41 AXO – Architettura prof.ssa Cristina Silvano e Sistemi Operativi pe Pelagatti esame di lunedì 4 luglio 2011 void header (void arg) / variabili globali pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); sem_t pass; pthread_mutex_lock (&gate); int posted = 1; sem_post (&pass); esercizio n. 1 – thread e parallelismo CON SOLUZIONI void posted = posted + 1; funzione / / statement arg) pthread_mutex_unlock (&gate); / funzione di thread / void in trailer (void id) / funzione di thread variabile È vietato portare all’esame libri, eserciziari, appunti, calcolatricilocale e telefoni cellulari. Chiunque fosse trovato (&pass); sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte (b) Nel sistema saranno attivati i processi P e Q __________________ gone in TR1 gone in TR2 – vedrà annullata la propria prova. postedX =e Yposted + (int) /id; int gone = 0; variabile locale che eseguono i programmi , che condiindirizzo di / Si consideri il programma C seguente (gli “#include” sono omessi): header (void / printf (“Finished.\n”); Calcolatori e Sistemi Operativi printf (“Started.\n”); return NULL; Si completi la tabella predisposta qui so1o, indicando / variabili globali / pthread_mutex_lock (&gate); 011 Cognome___________________________ Nome __________________ i valori delle variabili globali (sempre esistenti) / header / pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); Inserire in tabella la stru1ura in pagine della sem_t pass; posted = posted + 1; void trailer (void id) / statement A / / funzione memoria virtuale dei due programmi X variabile e Y locale intla tabella posted = 1; pthread_mutex_unlock (&gate); Matricola ___________________________ Firma della __________________ Si completi predisposta qui sotto indicando lo stato di esistenza esercizio n. 2 – memoria virtuale int gone = 0; / variabile nell’istante di tempo specificato da ciascuna condizione, così: se la variabile certamente esiste, si scriva printf (“Finished.\n”); (notazione: CX0, CX1, DX0, PX0,... CY0, ..., Un sistema dotato di memoria virtuale con paginazione e segmentazione tipo UNIX è caratterizzato dai paESISTE; se certamente non esiste, si scriva NON ESISTE; e se può essere esistente o inesistente, si rametri seguenti:/la memoria fisica ha capacità 32 K byte, la memoria logica ha capacità di 64 K byte e la return void header (void arg) funzione diNULL; thread scriva PUÒ ESISTERE. Ogni casella della tabella va riempita in uno dei tre modi (non va lasciata vuota). / pthread_mutex_lock (&gate); / statement COND0, ...). dimensione delle pagine è di 4096 byte. Si badi bene alla colonna condizione: con subito dopo statement X si chiede lo stato che la variabile sem_wait (&pass); ____________ Nome di __________________ tempo specificato da indicato. ciascuna Istruzioni / header /(a) Indicare il numero di pagine fisiche e il numero di pagine logiche del sistema. assume nell’istante tra lo statement X e lo statement immediatamente successivo del thread printf (“Started.\n”); pthread_mutex_unlock (&gate); Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. n. pagine fisiche: 8 n. pagine logiche: 16 condizione. Il valore della variabile va indicato così: pthread_mutex_lock gone = 1; / statement sem_post ! condizione ____________ Firma -‐‑ intero, cara1ere, stringa, quando la variabile ha un / statement A / posted = posted + 1; vidono un segmento dati. La NULL; dimensione inipagina virtuale return Non è possibile lasciare l’aula conservando il tema della prova in corso. ziale dei segmenti dei due programmi è la sevalore definito; oppure X quando è indefinita pthread_mutex_unlock (&gate); 0 PUÒ ESISTERE pthread_mutex_lock (&gate); / statement subito dopo stat.1h:30m A Tempo a disposizione: (una parte) 3h:00m (completo). PUÒ ESISTERE guente: / trailer / printf (“Finished.\n”); -‐‑ se la variabile può avere due o più valori, li si riporti 1 sem_wait (&pass); CX: 8 K DX: 4 K PX: 4 K COND: 4 K return NULL; main argc,4 Kchar argv [2 ]) pthread_mutex_unlock tu1i quanti CY: 8 K int DY: 4(&gate); K PY: (int 4 K COND: punteggio ESISTE I parte PUÒ ESISTERE arare questi fogli. subito dopo stat. C in TR1 II parte completo 3 approssimativo è allocato lasciando pa- tr2; / statement gone = 1; Il segmento CONDpthread_t hr, 2tr1, -‐‑ il semaforo può avere valore positivo o nullo (non ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in gine libere dopo il segmento dati di X e Y. 4 sem_init (&pass, 0, 0); sem_post (&pass); esercizio 1 5 corso – anche se non strettamente attinente alle domande proposte valore negativo) Inserire in tabella la struttura in pagine della 5 subito dopo stat. D !void esercizio 2 trailer do il tema della prova in corso. PUÒ ESISTERE (void6 id) NON ESISTE Si badi bene alla colonna condizione: con subito dopo e) statement X si 4 chiede 5il valore (o i valori) che la esercizio intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita variabile ha lo li sistatement se la variabile può avere due o tra più valori, riporti tutti quanti X e lo statement pthread_mutex_lock (&gate); esercizio 5 6 ggio il semaforo può avere valore positivo o nullo completo (non valore negativo) II parte I parte mativo immediatamente successivo del thread indicato. sem_wait (&pass); / esercizio Si completi la tabella predisposta3qui sotto, indicando i valori delle variabili globali (sempre esistenti) 5 3h:00m (completo). int gone = 0;condizione. Il valore della variabile va indicato così: / nell’istante di tempo specificato da ciascuna / Si badi bene alla colonna condizione: con subito esercizio 6 5 dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo pthread_mutex_unlock statement X e lo statement immediatamente successivo del thread indicato. (&gate); voto finale gone = 1; condizione sem_post (&pass); passin parti. ATTENZIONE: alcuni esercizi sono suddivisi posted = posted + (int) id; subito dopo stat.NULL; A 1 return subito dopo stat. B in TR1 / trailer / variabili globali / subito dopo stat. C in TR2 0/1 int main (int argc, char COND0, ...). variabile locale / trailer / argv [ ]) / int main (int statement B /argc, char B CX0 / CY0 CX1 CY1 DX0 / C / COND argv [ ]) (tr1); pthread_join / thread principale A D ) E1); PX0 AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI P viene creato (“fork” di P ed “exec” di X) pthread_join (tr2); P accede alla pagina condivisa COND pthread_join (tr1); / main / / C pthread_create (&tr1, NULL, &trailer, (void 2 Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread in- COND B pthread_create (&tr2, NULL, &trailer, (void ) F2); pthread_join (hr); (c) A un certo istante t0 sono terminati, nell’ordine, gli eventi seguenti: / DY0 pr thread pthread_create (&tr2, NULL, 7&trailer, (void ) 2); pthread_join (hr); 8 pthread_join (tr2); / statement 9 pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / posted 2/3 Y pthread_create (&hr, NULL, &header, NULL); posted = posted (int) memoria+virtuale dei id; due programmi X e Y funzione di thread / pthread_create NULL, 6&trailer, (void ) 1); CX0 , CX1 , DX0, PX0,… CY0, (&tr1, …, (notazione: return NULL; 1/2/4 0 / X / statement D PY0 / P esegue una “sbrk” e richiede un’area di memoria di 2000 byte cui accede. P esegue una “fork” e crea il processo figlio Q thread principale / le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoConsiderando ria fisica e al contenuto della MMU: Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: Antola intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita prof.ssa Donatella Sciuto Breveglieri la variabile avere due o più valori, li si Calcolatori riporti tutti quanti e Sistemi Operativi –può Architettura dei 42 seAXO prof.ssa Cristina Silvano il semaforo può avere valore positivo o nullo (non valore negativo) pe Pelagatti esame lunedì 4 luglio 2011 Si badi bene alladi colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio n. 1 – thread e parallelismo CON SOLUZIONI variabili globali condizione Si consideri il programma C seguente (gli “#include” sono omessi): Calcolatori e Sistemi Operativi pass posted 8 void header (void arg) / variabili globali 9 pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); A sem_t pass; pthread_mutex_lock (&gate); B int posted = 1; sem_post (&pass); C void header (void posted = posted + 1; D / funzione / / statement arg) pthread_mutex_unlock (&gate); E / funzione di thread printf (“Finished.\n”); F PX0 printf (“Started.\n”); return NULL; (c) A un certo istante t0/ sono terminati, nell’ordine, gli eventi seguenti: pthread_mutex_lock (&gate); PY0 / variabili globali 2 Nome __________________ P viene creato / (“fork” di P ed “exec” header / di X) pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); P accede alla pagina condivisa COND subito dopo stat. B in TR1 0/1 1 / 2 /Qui 4 sem_t pass; Il sistema può andare in stallo (deadlock). si posted = posted + 1; / statement A / / P esegue una “sbrk” e richiede un’area di memoriaid) di 2000 byte cui accede. void trailer (void int posted P esegue una “fork” e crea il processo figlio Q pthread_mutex_unlock (&gate); subito dopo stat. = C in1; TR2 2 __________________ /3 indichino gli statement dove 0si bloccano i thread in-‐‑ Matricola ___________________________ Firma 011 subito dopo stat. A 1 Cognome___________________________ corsi in stallo (non necessariamente tu1i): Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread invoid header (void arg) corsi in stallo (non necessariamente tutti): / / funzione int gone = 0; / variabile Considerando le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoprintf (“Finished.\n”); ria fisica e al contenuto della MMU: return funzione diNULL; thread / pthread_mutex_lock (&gate); / statement il lancio in esecuzione di un programma avviene caricando solo la pagina di codice con l’istruzione di partenza, la prima pagina dati e una pagina di pila, in quest’ordine sem_wait (&pass); ____________ Nome __________________ Istruzioni HR TR1 TR2 / header / il caricamento di ulteriori pagine in memoria avviene “on demand” printf (“Started.\n”); pthread_mutex_unlock (&gate); il numero di pagine residenti R è pari a 4 Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. si trova a monte di pthread_mutex_lock = 1; di X è 100C hex (indirizzo / statement virtuale assoluto) l’indirizzo esadecimale di partenza pthread_mutex_lock void in trailer (void id) gone / funzione di thread / È vietato portare all’esame libri, eserciziari, calcolatrici epthread_mutex_lock telefoni cellulari. Chiunque fosse trovato sem_waitappunti, (&pass) o è anch’esso fermo su sem_post (&pass); (&gate) l’indirizzo esadecimale di partenza di Y è 0020 hex (indirizzo virtuale assoluto) sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock ____________ Firma __________________ si utilizza l’algoritmo LRU per =la posted sostituzione +di (int) pagine di id; considerando che almeno – vedrà annullata la propria prova. int gone /memoria, variabile locale / posted = posted + 1; / statement A =/ 0;una pagina di pila posted debba sempre rimanere in memoria return NULL; Non è possibile l’aulae TR2. conservando il tema della prova in corso. Si possono scambiare lasciare i ruoli di TR1 pthread_mutex_unlock (&gate); printf (“Finished.\n”); return NULL; AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI l’allocazione delle pagine virtuali nelle pagine fisiche avviene sempre in sequenza all’inizio della sequenza di eventi pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). punteggio approssimativo arare questi fogli. I parte / riga trailer sempre la prima libera II parte ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in esercizio 1 5 alle domande proposte corso – anche se non strettamente attinente void esercizio 2 trailer do il tema della prova in corso. esercizio 3 e) 3h:00m (completo). int gone = ggio mativo esercizio (void6 0; id) / 5 / 5 4 II parte completo voto finale gone = 1; pthread_t hr, tr1, tr2; / statement C / sem_init (&pass, 0, 0); sem_post (&pass); pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; funzione di thread / pthread_create (&tr1, NULL, &trailer, (void return NULL; variabile locale / trailer / / pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); ) 2); AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI / pr / main / thread principale / / ) 1); ) 2); statement thread principale ) 1); pthread_join (tr1); argv [ ]) argv [ ]) (tr1); pthread_join / pthread_create (&tr1, NULL, &trailer, (void pthread_join (tr2); / int main (int argc, char / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); int main (int statement B /argc, char sem_post (&pass); ATTENZIONE: alcuni esercizi sono suddivisi in parti. posted = posted + (int) id; return NULL; trailer pagina 4/ di 19 thread gone = 1; / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); / argv [ ]) pthread_join (tr2); pthread_mutex_lock (&gate); esercizio 5 6 I parte sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI pagina 3 di 19 completo la MMU è vuota, e se / è richiesta una nuova riga statement B si/utilizzi / statement D / / Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: Antola intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita prof.ssa Donatella Sciuto Breveglieri la variabile avere due o più valori, li si Calcolatori riporti tutti quanti e Sistemi Operativi –può Architettura dei 42 seAXO prof.ssa Cristina Silvano il semaforo può avere valore positivo o nullo (non valore negativo) pe Pelagatti esame lunedì 4 luglio 2011 Si badi bene alladi colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio n. 1 – thread e parallelismo CON SOLUZIONI variabili globali condizione Si consideri il programma C seguente (gli “#include” sono omessi): Calcolatori e Sistemi Operativi pass posted 8 void header (void arg) / variabili globali 9 pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); A sem_t pass; pthread_mutex_lock (&gate); B int posted = 1; sem_post (&pass); C void header (void posted = posted + 1; D / funzione / / statement arg) pthread_mutex_unlock (&gate); E / funzione di thread printf (“Finished.\n”); F PX0 printf (“Started.\n”); return NULL; (c) A un certo istante t0/ sono terminati, nell’ordine, gli eventi seguenti: pthread_mutex_lock (&gate); PY0 / variabili globali 2 Nome __________________ P viene creato / (“fork” di P ed “exec” header / di X) pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); P accede alla pagina condivisa COND subito dopo stat. B in TR1 0/1 1 / 2 /Qui 4 sem_t pass; Il sistema può andare in stallo (deadlock). si posted = posted + 1; / statement A / / P esegue una “sbrk” e richiede un’area di memoriaid) di 2000 byte cui accede. void trailer (void int posted P esegue una “fork” e crea il processo figlio Q pthread_mutex_unlock (&gate); subito dopo stat. = C in1; TR2 2 __________________ /3 indichino gli statement dove 0si bloccano i thread in-‐‑ Matricola ___________________________ Firma 011 subito dopo stat. A 1 Cognome___________________________ corsi in stallo (non necessariamente tu1i): Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread invoid header (void arg) corsi in stallo (non necessariamente tutti): / / funzione int gone = 0; / variabile Considerando le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoprintf (“Finished.\n”); ria fisica e al contenuto della MMU: return funzione diNULL; thread / pthread_mutex_lock (&gate); / statement il lancio in esecuzione di un programma avviene caricando solo la pagina di codice con l’istruzione di partenza, la prima pagina dati e una pagina di pila, in quest’ordine sem_wait (&pass); ____________ Nome __________________ Istruzioni HR TR1 TR2 / header / il caricamento di ulteriori pagine in memoria avviene “on demand” printf (“Started.\n”); pthread_mutex_unlock (&gate); il numero di pagine residenti R è pari a 4 Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. si trova a monte di pthread_mutex_lock = 1; di X è 100C hex (indirizzo / statement virtuale assoluto) l’indirizzo esadecimale di partenza pthread_mutex_lock void in trailer (void id) gone / funzione di thread / È vietato portare all’esame libri, eserciziari, calcolatrici epthread_mutex_lock telefoni cellulari. Chiunque fosse trovato sem_waitappunti, (&pass) o è anch’esso fermo su sem_post (&pass); (&gate) l’indirizzo esadecimale di partenza di Y è 0020 hex (indirizzo virtuale assoluto) sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock ____________ Firma __________________ si utilizza l’algoritmo LRU per =la posted sostituzione +di (int) pagine di id; considerando che almeno – vedrà annullata la propria prova. int gone /memoria, variabile locale / posted = posted + 1; / statement A =/ 0;una pagina di pila posted debba sempre rimanere in memoria return NULL; Non è possibile l’aulae TR2. conservando il tema della prova in corso. Si possono scambiare lasciare i ruoli di TR1 pthread_mutex_unlock (&gate); printf (“Finished.\n”); return NULL; AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI l’allocazione delle pagine virtuali nelle pagine fisiche avviene sempre in sequenza all’inizio della sequenza di eventi pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). punteggio approssimativo arare questi fogli. I parte / riga trailer sempre la prima libera II parte ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in esercizio 1 5 alle domande proposte corso – anche se non strettamente attinente void esercizio 2 trailer do il tema della prova in corso. esercizio 3 e) 3h:00m (completo). int gone = ggio mativo esercizio (void6 0; id) / 5 / 5 4 II parte completo voto finale gone = 1; pthread_t hr, tr1, tr2; / statement C / sem_init (&pass, 0, 0); sem_post (&pass); pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; funzione di thread / pthread_create (&tr1, NULL, &trailer, (void return NULL; variabile locale / trailer / / pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); ) 2); AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI / pr / main / thread principale / / ) 1); ) 2); statement thread principale ) 1); pthread_join (tr1); argv [ ]) argv [ ]) (tr1); pthread_join / pthread_create (&tr1, NULL, &trailer, (void pthread_join (tr2); / int main (int argc, char / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); int main (int statement B /argc, char sem_post (&pass); ATTENZIONE: alcuni esercizi sono suddivisi in parti. posted = posted + (int) id; return NULL; trailer pagina 4/ di 19 thread gone = 1; / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); / argv [ ]) pthread_join (tr2); pthread_mutex_lock (&gate); esercizio 5 6 I parte sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI pagina 3 di 19 completo la MMU è vuota, e se / è richiesta una nuova riga statement B si/utilizzi / statement D / / Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: Antola intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita prof.ssa Donatella Sciuto Breveglieri la variabile avere due o più valori, li si Calcolatori riporti tutti quanti e Sistemi Operativi –può Architettura dei 42 seAXO prof.ssa Cristina Silvano il semaforo può avere valore positivo o nullo (non valore negativo) pe Pelagatti esame lunedì 4 luglio 2011 Si badi bene alladi colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio n. 1 – thread e parallelismo CON SOLUZIONI variabili globali condizione Si consideri il programma C seguente (gli “#include” sono omessi): Calcolatori e Sistemi Operativi pass posted 8 void header (void arg) / variabili globali 9 pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); A sem_t pass; pthread_mutex_lock (&gate); B int posted = 1; sem_post (&pass); C void header (void posted = posted + 1; D / funzione / / statement arg) pthread_mutex_unlock (&gate); E / funzione di thread printf (“Finished.\n”); F PX0 printf (“Started.\n”); return NULL; (c) A un certo istante t0/ sono terminati, nell’ordine, gli eventi seguenti: pthread_mutex_lock (&gate); PY0 / variabili globali 2 Nome __________________ P viene creato / (“fork” di P ed “exec” header / di X) pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); P accede alla pagina condivisa COND subito dopo stat. B in TR1 0/1 1 / 2 /Qui 4 sem_t pass; Il sistema può andare in stallo (deadlock). si posted = posted + 1; / statement A / / P esegue una “sbrk” e richiede un’area di memoriaid) di 2000 byte cui accede. void trailer (void int posted P esegue una “fork” e crea il processo figlio Q pthread_mutex_unlock (&gate); subito dopo stat. = C in1; TR2 2 __________________ /3 indichino gli statement dove 0si bloccano i thread in-‐‑ Matricola ___________________________ Firma 011 subito dopo stat. A 1 Cognome___________________________ corsi in stallo (non necessariamente tu1i): Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread invoid header (void arg) corsi in stallo (non necessariamente tutti): / / funzione int gone = 0; / variabile Considerando le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoprintf (“Finished.\n”); ria fisica e al contenuto della MMU: return funzione diNULL; thread / pthread_mutex_lock (&gate); / statement il lancio in esecuzione di un programma avviene caricando solo la pagina di codice con l’istruzione di partenza, la prima pagina dati e una pagina di pila, in quest’ordine sem_wait (&pass); ____________ Nome __________________ Istruzioni HR TR1 TR2 / header / il caricamento di ulteriori pagine in memoria avviene “on demand” printf (“Started.\n”); pthread_mutex_unlock (&gate); il numero di pagine residenti R è pari a 4 Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. si trova a monte di pthread_mutex_lock = 1; di X è 100C hex (indirizzo / statement virtuale assoluto) l’indirizzo esadecimale di partenza pthread_mutex_lock void in trailer (void id) gone / funzione di thread / È vietato portare all’esame libri, eserciziari, calcolatrici epthread_mutex_lock telefoni cellulari. Chiunque fosse trovato sem_waitappunti, (&pass) o è anch’esso fermo su sem_post (&pass); (&gate) l’indirizzo esadecimale di partenza di Y è 0020 hex (indirizzo virtuale assoluto) sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock ____________ Firma __________________ si utilizza l’algoritmo LRU per =la posted sostituzione +di (int) pagine di id; considerando che almeno – vedrà annullata la propria prova. int gone /memoria, variabile locale / posted = posted + 1; / statement A =/ 0;una pagina di pila posted debba sempre rimanere in memoria return NULL; Non è possibile l’aulae TR2. conservando il tema della prova in corso. Si possono scambiare lasciare i ruoli di TR1 pthread_mutex_unlock (&gate); printf (“Finished.\n”); return NULL; AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI l’allocazione delle pagine virtuali nelle pagine fisiche avviene sempre in sequenza all’inizio della sequenza di eventi pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). punteggio approssimativo arare questi fogli. I parte / riga trailer sempre la prima libera II parte ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in esercizio 1 5 alle domande proposte corso – anche se non strettamente attinente void esercizio 2 trailer do il tema della prova in corso. esercizio 3 e) 3h:00m (completo). int gone = ggio mativo esercizio (void6 0; id) / 5 / 5 4 II parte completo voto finale gone = 1; pthread_t hr, tr1, tr2; / statement C / sem_init (&pass, 0, 0); sem_post (&pass); pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; funzione di thread / pthread_create (&tr1, NULL, &trailer, (void return NULL; variabile locale / trailer / / pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); ) 2); AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI / pr / main / thread principale / / ) 1); ) 2); statement thread principale ) 1); pthread_join (tr1); argv [ ]) argv [ ]) (tr1); pthread_join / pthread_create (&tr1, NULL, &trailer, (void pthread_join (tr2); / int main (int argc, char / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); int main (int statement B /argc, char sem_post (&pass); ATTENZIONE: alcuni esercizi sono suddivisi in parti. posted = posted + (int) id; return NULL; trailer pagina 4/ di 19 thread gone = 1; / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); / argv [ ]) pthread_join (tr2); pthread_mutex_lock (&gate); esercizio 5 6 I parte sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI pagina 3 di 19 completo la MMU è vuota, e se / è richiesta una nuova riga statement B si/utilizzi / statement D / / Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: Antola intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita prof.ssa Donatella Sciuto Breveglieri la variabile avere due o più valori, li si Calcolatori riporti tutti quanti e Sistemi Operativi –può Architettura dei 42 seAXO prof.ssa Cristina Silvano il semaforo può avere valore positivo o nullo (non valore negativo) pe Pelagatti esame lunedì 4 luglio 2011 Si badi bene alladi colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio n. 1 – thread e parallelismo CON SOLUZIONI variabili globali condizione Si consideri il programma C seguente (gli “#include” sono omessi): Calcolatori e Sistemi Operativi pass posted 8 void header (void arg) / variabili globali 9 pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); A sem_t pass; pthread_mutex_lock (&gate); B int posted = 1; sem_post (&pass); C void header (void posted = posted + 1; D / funzione / / statement arg) pthread_mutex_unlock (&gate); E / funzione di thread printf (“Finished.\n”); F PX0 printf (“Started.\n”); return NULL; (c) A un certo istante t0/ sono terminati, nell’ordine, gli eventi seguenti: pthread_mutex_lock (&gate); PY0 / variabili globali 2 Nome __________________ P viene creato / (“fork” di P ed “exec” header / di X) pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); P accede alla pagina condivisa COND subito dopo stat. B in TR1 0/1 1 / 2 /Qui 4 sem_t pass; Il sistema può andare in stallo (deadlock). si posted = posted + 1; / statement A / / P esegue una “sbrk” e richiede un’area di memoriaid) di 2000 byte cui accede. void trailer (void int posted P esegue una “fork” e crea il processo figlio Q pthread_mutex_unlock (&gate); subito dopo stat. = C in1; TR2 2 __________________ /3 indichino gli statement dove 0si bloccano i thread in-‐‑ Matricola ___________________________ Firma 011 subito dopo stat. A 1 Cognome___________________________ corsi in stallo (non necessariamente tu1i): Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread invoid header (void arg) corsi in stallo (non necessariamente tutti): / / funzione int gone = 0; / variabile Considerando le ipotesi seguenti, compilare le tabelle della situazione al tempo t0 relative alla memoprintf (“Finished.\n”); ria fisica e al contenuto della MMU: return funzione diNULL; thread / pthread_mutex_lock (&gate); / statement il lancio in esecuzione di un programma avviene caricando solo la pagina di codice con l’istruzione di partenza, la prima pagina dati e una pagina di pila, in quest’ordine sem_wait (&pass); ____________ Nome __________________ Istruzioni HR TR1 TR2 / header / il caricamento di ulteriori pagine in memoria avviene “on demand” printf (“Started.\n”); pthread_mutex_unlock (&gate); il numero di pagine residenti R è pari a 4 Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. si trova a monte di pthread_mutex_lock = 1; di X è 100C hex (indirizzo / statement virtuale assoluto) l’indirizzo esadecimale di partenza pthread_mutex_lock void in trailer (void id) gone / funzione di thread / È vietato portare all’esame libri, eserciziari, calcolatrici epthread_mutex_lock telefoni cellulari. Chiunque fosse trovato sem_waitappunti, (&pass) o è anch’esso fermo su sem_post (&pass); (&gate) l’indirizzo esadecimale di partenza di Y è 0020 hex (indirizzo virtuale assoluto) sem_post (&pass); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock ____________ Firma __________________ si utilizza l’algoritmo LRU per =la posted sostituzione +di (int) pagine di id; considerando che almeno – vedrà annullata la propria prova. int gone /memoria, variabile locale / posted = posted + 1; / statement A =/ 0;una pagina di pila posted debba sempre rimanere in memoria return NULL; Non è possibile l’aulae TR2. conservando il tema della prova in corso. Si possono scambiare lasciare i ruoli di TR1 pthread_mutex_unlock (&gate); printf (“Finished.\n”); return NULL; AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI l’allocazione delle pagine virtuali nelle pagine fisiche avviene sempre in sequenza all’inizio della sequenza di eventi pthread_mutex_lock (&gate); Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo). punteggio approssimativo arare questi fogli. I parte / riga trailer sempre la prima libera II parte ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in esercizio 1 5 alle domande proposte corso – anche se non strettamente attinente void esercizio 2 trailer do il tema della prova in corso. esercizio 3 e) 3h:00m (completo). int gone = ggio mativo esercizio (void6 0; id) / 5 / 5 4 II parte completo voto finale gone = 1; pthread_t hr, tr1, tr2; / statement C / sem_init (&pass, 0, 0); sem_post (&pass); pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; funzione di thread / pthread_create (&tr1, NULL, &trailer, (void return NULL; variabile locale / trailer / / pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); ) 2); AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI / pr / main / thread principale / / ) 1); ) 2); statement thread principale ) 1); pthread_join (tr1); argv [ ]) argv [ ]) (tr1); pthread_join / pthread_create (&tr1, NULL, &trailer, (void pthread_join (tr2); / int main (int argc, char / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); int main (int statement B /argc, char sem_post (&pass); ATTENZIONE: alcuni esercizi sono suddivisi in parti. posted = posted + (int) id; return NULL; trailer pagina 4/ di 19 thread gone = 1; / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); / argv [ ]) pthread_join (tr2); pthread_mutex_lock (&gate); esercizio 5 6 I parte sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI pagina 3 di 19 completo la MMU è vuota, e se / è richiesta una nuova riga statement B si/utilizzi / statement D / / Si completi la tabella predisposta qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così: 8 Antola intero, carattere, stringa, quando la variabile ha un valore definito; oppure X quando è indefinita prof.ssa Donatella Sciuto Breveglieri la variabile avere due o più valori, li si Calcolatori riporti tutti quanti e Sistemi Operativi –può Architettura dei 42 seAXO prof.ssa Cristina Silvano dopo in il semaforo puòsubito avere valore positivo o nullostat. (non valore negativo) pe Pelagatti esame lunedì 4 luglio 2011 Si badi bene alladi colonna condizione: con subito dopo statement X si chiede il valore (o i valori) che la B TR1 void header (void arg) / variabili globali 9 pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; printf (“Started.\n”); A sem_t pass; pthread_mutex_lock (&gate); B int posted = 1; sem_post (&pass); C 0/1 variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. esercizio n. 1 – thread e parallelismo CON SOLUZIONI variabili globali condizione Si consideri il programma C seguente (gli “#include” sono omessi): Calcolatori e Sistemi Operativi pass posted subito dopo stat. C in TR2 0 void header (void 2 posted / 3 = posted + 1; D void header (void arg) printf (“Finished.\n”); F / / statement arg) pthread_mutex_unlock (&gate); E / funzione di thread int posted subito dopo stat. = C in1; TR2 2 __________________ /3 indichino gli statement dove 0si bloccano i thread in-‐‑ Matricola ___________________________ Firma HR TR1 corsi in stallo (non necessariamente tu1i): Il sistema può andare in stallo (deadlock). Qui si indichino gli statement dove si bloccano i thread incorsi in stallo (non necessariamente tutti): funzione / 1/2/4 PX0 printf (“Started.\n”); return NULL; / variabili globali (c) A un certo istante t0/ sono terminati, nell’ordine, gli eventi seguenti: pthread_mutex_lock (&gate); IlCognome___________________________ sistema può (deadlock). Qui si indichino gli statement dove si bloccano i thread insubito dopo stat. Aandare in stallo 1 2 Nome __________________ P viene creato / (“fork” di P ed “exec” header / di X) pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; sem_post (&pass); corsisubito in dopo stallo (non necessariamente tutti): P accede alla pagina condivisa COND stat. B in TR1 0/1 1 / 2 /Qui 4 sem_t pass; Il sistema può andare in stallo (deadlock). si posted = posted + 1; / statement A P esegue una “sbrk” e richiede un’area di memoriaid) di 2000 byte cui accede. void trailer (void 011 / PY0 / / funzione P esegue una “fork” e crea il processo figlio Q pthread_mutex_unlock (&gate); int = 0; / variabile Considerando le ipotesi seguenti,gone compilare le tabelle della situazione al tempo t0 relative alla memoprintf (“Finished.\n”); ria fisica e al contenuto della MMU: return funzione diNULL; thread / pthread_mutex_lock (&gate); / statement TR2 il lancio in esecuzione di un programma avviene caricando solo la pagina di codice con l’istruzione di partenza, pagina dati di e una pagina di pila, in quest’ordine si trova ala prima monte sem_wait (&pass); il caricamento di ulteriori pagine in memoria avviene “on demand” pthread_mutex_lock pthread_mutex_unlock (&gate); il numero di pagine residenti R è pari a 4 o è anch’esso fermo = 1; / statement hex (indirizzo virtuale assoluto) l’indirizzo esadecimale di partenza di X è 100Csu (void id) gone / funzione di thread / l’indirizzo esadecimale di partenza di Y è 0020 hex (indirizzo virtuale assoluto) sem_post (&pass); pthread_mutex_lock ____________ Nome __________________ Istruzioni HR TR1 TR2 / header / printf (“Started.\n”); pthread_mutex_lock Scrivere solo sui fogli distribuiti. Non separare (&gate); questi fogli. (&pass) si sem_wait trova a monte di pthread_mutex_lock (&gate) pthread_mutex_lock pthread_mutex_lock void in trailer È vietato portare all’esame libri, eserciziari, calcolatrici e telefoni cellulari. Chiunque fosse trovato sem_waitappunti, (&pass) o è anch’esso fermo su sem_post (&pass); (&gate) possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte pthread_mutex_lock ____________ Firma __________________ si utilizza l’algoritmo LRU per =la posted sostituzione +di (int) pagine di id; considerando che almeno – vedrà annullata la propria prova. int gone /memoria, variabile locale posted = posted + 1; / statement A =/ 0;una pagina di pila posted debba sempre rimanere in memoria pthread_mutex_unlock (&gate); all’inizio della sequenza di eventi pthread_mutex_lock (&gate); a disposizione: 1h:30m (una parte) 3h:00m (completo). SiTempo possono scambiare i ruoli di TR1 e TR2. printf (“Finished.\n”); return NULL; AXO – prova di venerdì 19 novembre 2010 – CON punteggio SOLUZIONI approssimativo I parte II parte / riga trailer sempre la prima libera completo esercizio 2 (void 6 void– prova trailer id) 2010 – CON SOLUZIONI AXO di venerdì 19 novembre do il tema della prova in corso. esercizio 3 5 e) 3h:00m (completo). ggio mativo esercizio / 5 4 II parte completo voto finale gone = 1; pthread_t hr, tr1, tr2; / statement C / sem_init (&pass, 0, 0); sem_post (&pass); pthread_create (&hr, NULL, &header, NULL); posted = posted + (int) id; funzione di thread / pthread_create (&tr1, NULL, &trailer, (void pagina 3 di 19 return NULL; variabile locale / trailer / / pthread_t hr, tr1, tr2; / main / sem_init (&pass, 0, 0); pthread_create (&hr, NULL, &header, NULL); statement C / / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); ) 2); AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI / pr / main / thread principale / / ) 1); ) 2); statement thread principale ) 1); pthread_join (tr1); argv [ ]) argv [ ]) (tr1); pthread_join / pthread_create (&tr1, NULL, &trailer, (void pthread_join (tr2); / int main (int argc, char / pthread_create (&tr2, NULL, &trailer, (void pthread_join (hr); int main (int statement B /argc, char sem_post (&pass); ATTENZIONE: alcuni esercizi sono suddivisi in parti. posted = posted + (int) id; return NULL; trailer pagina 4/ di 19 thread gone = 1; / sem_wait (&pass); esercizio 6 5 pthread_mutex_unlock (&gate); / argv [ ]) pthread_join (tr2); pthread_mutex_lock (&gate); esercizio 5 6 I parte / la MMU è vuota, e se / è richiesta una nuova riga statement B si/utilizzi / sem_wait (&pass); int (&gate); main (int argc, char pthread_mutex_unlock AXO – prova di venerdì 19 novembre 2010 – CON SOLUZIONI pagina 3 di 19 ari, appunti, calcolatrici e telefoni / header / cellulari. Chiunque fosse trovato in esercizio 1 5 alle domande proposte corso – anche se non strettamente attinente int gone = 0; / return NULL; l’allocazione delle pagine virtuali nelle pagine fisiche avviene sempre in sequenza Non è possibile l’aulae TR2. conservando il tema della prova in corso. Si possono scambiare lasciare i ruoli di TR1 arare questi fogli. / statement D / / Temi d’Esame 17 novembre 2009 43 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 44 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) return NULL; / STATEMENT S3 (4 punti) Voto finale: (16 punti) _________________________ ______________________ successivo del thread indicato nella condizione stessa. condizione stessa. pthread_mutex_lock (&gate); / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. sem_wait (&pass); Tabella A pthread_mutex_unlock (&gate); variabili locali al thread th_A gone = 1; condizione sem_post (&pass); Aa posted = posted + (int) id; subito dopo STATEMENT S1 in th_A 2 return NULL; Ab Ga X 4 2 2 4/6 subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) 3/6 / intdopo main (int S4argc, subito STATEMENT in main char argv [ ]) NE NE } / thread statement B / principale / variabili globali valore / statement C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore subito dopo STATEMENT S2 in th_A trailer / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: CON SOLUZIONI (in corsivo) / / _________________________ int Ma; sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, A, (void ) 2); Esercizio 3 (4 punti) _________________________ particolare, con "ʺsubito dopo statement X"ʺ si pthread_create (&th_B, NULL, B, (void ) 3); Esercizio 4 (2 punti) _________________________ void trailer (void id) / funzione di thread (th_A, / pthread_join (void ) &Ma); intendono richiedere i valori che le variabili possono sem_post (&sem_A); / STATEMENT S4 Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement pthread_join (th_B, NULL); int gone = 0; “condizione”. In particolare, con la dicitura “subito/ dopo variabile / Si presti attenzione alla colonna statement X” locale si immediatamente successivo del thread indicato nella return Ma; richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Esercizio 2 / / NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata sem_A quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una 0 tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste 0 valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste 0/1 U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 45 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova di martedì 17 novembre 2009 esercizio n. 1 – thread e parallelismo Si consideri il programma C seguente (gli “#include” Si completino le tabelle, indicando gli sono state omessi): delle Cognome ________________________ Nome _______________________ variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; !sem_t Matricola _____________________Firma ___________________________ pass; posted = 1; •int intero, cara1ere, stringa (quando il valore è pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; } / void thread A B (void / arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata Si scriva solo sui fogli distribuiti. Non“condizione”. si separino questi Si presti attenzione alla colonna Infogli. particolare, con la dicitura “subito dopo statement si + 2; Ga X” = Ga Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); richiedono gli stati che le variabili possono assumere tra lo statement X e lo statement immediatamente Ba = Ba Ga; È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato successivo del thread indicato nella condizione stessa. pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si è possibile lasciare l’aula conservando il tema della prova in corso. Ga = 3; Tabella A Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return variabili locali } / thread B / • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock (&gate); variabili globali Valore indicativo di domande ed esercizi, voti voto finale: alparziali thread e th_A int main ( ) { condizione printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; ! Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ return NULL; Aa Ab subito dopo STATEMENT S1 in th_A Si presti a1enzione alla 2 "ʺcondizione"ʺ. X colonna In Esercizio 3 (4 punti) _________________________ particolare, con S2 "ʺsubito dopo 2 statement 2 X"ʺ si subito dopo STATEMENT in th_A Esercizio 4 (2 punti) void trailer (void_________________________ id) intendono richiedere i valori che le variabili possono subito dopo STATEMENT S3 in th_B U (NE / X / 2) U (NE / X / 2) Esercizio 5 tra (2 lo punti) _________________________ assumere statement X e lo statement int gone = 0; subito dopo STATEMENT S4 in main NE NE immediatamente successivo del thread indicato nella Voto finale: (16 punti) ______________________ condizione stessa. pthread_mutex_lock (&gate); / header / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. Ga 4 sem_wait (&pass); Tabella B pthread_mutex_unlock (&gate); CON SOLUZIONI (in corsivo) gone = 1; condizione variabili locali al thread th_B / sem_post (&pass); Ba posted = posted + (int) id; subito dopo STATEMENT S1 in th_A U (NE / X / 3 / 9) return NULL; subito dopo STATEMENT S2 in th_A U (NE / X / 3 / 9 / 18) subito dopo STATEMENT S3 in th_B 9 / 18 / trailer / int main (int argc, char subito dopo STATEMENT S4 in main argv [ ]) U (NE / X / 3 / 9 / 18) / STATEMENT S3 / / sem_A int Ma; 0sem_init (&sem_A, 0, 0); pthread_create (&th_A, NULL, A, (void ) 2); 4/6 0pthread_create (&th_B, NULL, B, (void ) 3); / funzione di thread (th_A, / pthread_join (void ) &Ma); 3/6 0/1 sem_post (&sem_A); / STATEMENT S4 pthread_join (th_B, NULL); / variabile locale / return Ma; / / / } / thread statement B / principale / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore NE, quando la variabile non esiste (in quanto non esiste il thread) X, quando la variabile esiste ma non è stata ancora inizializzata quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione thread principale / AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 subito dopo STATEMENT S2 in th_A 2 46 AXO – Architettura dei Calcolatori e Sistemi Operativi Prova didopo martedì 17 novembre S3 2009 subito STATEMENT in th_B U (NE / X / 2) esercizio n. 1 – thread e parallelismo subito dopo STATEMENT S4 in main NE Si consideri il programma C seguente (gli “#include” sono omessi): 2 4/6 0 U (NE / X / 2) 3/6 0/1 pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; / PTHREAD_MUTEX_INITIALIZER è equivalente a pthread_mutex_init sem_t sem_A; int Ga = 1; void A (void arg) { int Aa = (int) arg; int Ab; pthread_mutex_lock (&mutex_A); Ga = Aa 2; / STATEMENT S1 / / Ab = Ga - 2; pthread_mutex_unlock (&mutex_A); / STATEMENT S2 / return (void *) Ab; NE Si completino le tabelle, indicando gli state delle variabili globali e locali. Lo stato di una variabile può / variabili globali essere: pthread_mutex_t gate = PTHREAD_MUTEX_INITIALIZER; Cognome ________________________ Nome _______________________ !sem_t Matricola _____________________Firma ___________________________ pass; } / thread A / posted = 1; •int intero, cara1ere, stringa (quando il valore è Tabella B void B (void arg) { definito) int Ba = (int) arg; void header (void arg) / funzione di thread / (&mutex_A); Istruzioni pthread_mutex_lock • X, quando la variabile non è ancora stata variabili locali Si scriva solo sui fogli distribuiti. Non si separino questi fogli. Ga = Ga + 2; al thread th_B Per i calcoli si utilizzino le pagine bianche in fondo allo scritto. inizializzata printf (“Started.\n”); Ba = Ba Ga; condizione È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato pthread_mutex_lock (&gate); • inNE, se la variabile può non esistere pthread_mutex_unlock (&mutex_A); possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. sem_wait (&sem_A); sem_post (&pass); • Non se la variabile si può trovare in due o più stati, li si Ba Ga è possibile lasciare l’aula conservando il tema della prova in corso. = 3; Tempo a disposizione: 2 h : 30 m posted = posted + 1; / statement A / NULL; riporti tu1i quanti return • U quando la variable può trovarsi in tre o più stati pthread_mutex_unlock subito dopo STATEMENT S1(&gate); in th_A U (NE / X} // 3thread / 9) B / Valore indicativo di domande ed esercizi, voti parziali e voto finale: int main ( ) { printf (“Finished.\n”); o in qualsiasi combinazione pthread_t th_A, th_B; Esercizio 1 (4 punti) _________________________ Esercizio 2 (4 punti) _________________________ subito dopo NULL; STATEMENT S2 in th_A ! return sem_wait (&pass); pthread_mutex_unlock (&gate); gone = 1; / trailer / A, (void ) 2); B, (void ) 3); &Ma); / STATEMENT S4 / Si completino le tre tabelle riportate a pagina seguente, indicando gli stati delle variabili negli istanti di tempo specificati. Una variabile può essere di tipo intero, carattere o stringa. Lo stato di una variabile va indicato come segue: statementvalore C dell’intero, / del carattere o della stringa, quando la variabile esiste e ha un solo valore quando la variabile non esiste (in quanto non esiste il thread) variabili locali NE, X, quando la variabile esiste ma non è stata ancora inizializzata variabili globali quando la variabile si può trovare in due stati differenti, si deve scegliere e indicare esplicitamente una al thread main Ma / int main (int argc, charS4 argv [ ]) subito dopo STATEMENT in main STATEMENT S3 Tabella C / sem_post (&pass); posted = posted + (int) id; condizione return NULL; / U (NE / X / 3 /int 9 /Ma; 18) sem_init (&sem_A, 0, 0); Si /presti a1enzione alla colonna "ʺcondizione"ʺ. In header / pthread_create (&th_A, NULL, Esercizio 3 punti) _________________________ subito dopo (4con STATEMENT S3 in th_B 9 / 18 pthread_create (&th_B, NULL, particolare, "ʺsubito dopo statement X"ʺ si Esercizio 4 (2 punti) void trailer (void_________________________ id) / funzione di thread (th_A, / pthread_join (void ) intendono richiedere i valori che le variabili possono Esercizio 5 tra (2 punti) _________________________ subito dopo STATEMENT S4 in 9 / 18)(&sem_A); assumere lo statement X main e lo statement U (NE / X / 3 /sem_post pthread_join (th_B, NULL); int gone = 0; / variabile locale / immediatamente successivo del thread indicato nella return Ma; Voto finale: (16 punti) ______________________ } / thread condizione stessa. pthread_mutex_lock (&gate); / statement B / principale / I NUMERI INDICANO I PUNTEGGI APPROSSIMATIVI. CON SOLUZIONI (in corsivo) / / tra le quattro combinazioni seguenti, le quali esauriscono l’insieme di possibilità valore1 / valore2 ha due valori ben definiti valore / NE ha un valore ben definito oppure non esiste valore / X ha un valore ben definito oppure non è stata ancora inizializzata X / NE non è stata ancora inizializzata oppure non esiste U, quando la variabile si può trovare in tre o più stati in qualsiasi combinazione Ga 2thread principale U (3 // 4 / 6) AXO – prova di martedì 17 novembre 2009 – CON SOLUZIONI sem_A 0/1 pagina 2 di 14 Alla prossima lezione [email protected] 47