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ēē 4–p Ł¨ ûŁ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
Scarica

AXO – Architettura dei Calcolatori e Sistemi