,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/D3URJUDPPD]LRQH GL5HWHHGL6LVWHPDLLL
$FXUDGL
/XFD%UHYHJOLHUL *LDFRPR%XRQDQQR 5REHUWR1HJULQL *LXVHSSH3R]]L 'RQDWHOOD6FLXWR
DEIPoliMI0LODQR
LIUC&DVWHOODQ]DVA
EUHYHJOLHULQHJULQLSR]]LVFLXWR#HOHWSROLPLLW EXRQDQQR#OLXFLW
YHUVLRQHGHOPDU]R
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/DSURJUDPPD]LRQHGLVLVWHPD
,QWURGX]LRQHDOVLVWHPDRSHUDWLYR HGLOVLVWHPDRSHUDWLYRPXOWLSURFHVVR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR
,OVLVWHPDRSHUDWLYR
qXQLQVLHPHGLPRGXOLVRIWZDUH
FRQWUROODOHULVRUVHGHOVLVWHPD
LQWHUDJLVFHGLUHWWDPHQWHFRQLVRIWZDUHFKH
FRQWUROODQRO¶KDUGZDUHGHYLFHGULYHU
PHWWHDGLVSRVL]LRQHGHOO¶XWHQWHXQD
PDFFKLQD³YLUWXDOH´LQJUDGRGLHVHJXLUH
FRPDQGLGDWLGDOO¶XWHQWHXWLOL]]DQGRXQD
PDFFKLQD³UHDOH´GLOLYHOORLQIHULRUHHPHQR
SRWHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR
CPU RAM
FD
HD
Scheda
rete Interf.
I/O bus Sistema operativo
Interprete comandi
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OSURFHVVRGDOSXQWRGLYLVWD
GHOVLVWHPDRSHUDWLYR
,OSURFHVVR q
XQ¶DWWLYLWjVHTXHQ]LDOHFRPHDGHV
O¶LVWDQ]DGLXQSURJUDPPDLQHVHFX]LRQH
FRQXQRVWDWRDVVRFLDWR/RVWDWRDVXD
YROWDVLGLYLGHLQ
VWDWRLQWHUQR
VWDWRHVWHUQR
LOSURFHVVRqDQFKHGHILQLWRFRPHO¶HVHFXWRUHGLXQSURJUDPPD
FUHDWRGLQDPLFDPHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/RVWDWRGLXQSURFHVVR
/RVWDWRLQWHUQR LQGLFD
ODSURVVLPDLVWUX]LRQHGHOSURJUDPPDFKHGHYH
HVVHUHHVHJXLWD
LYDORULGHOOHYDULDELOLHGHLUHJLVWULXWLOL]]DWLGDO
SURFHVVR
/RVWDWRHVWHUQR LQGLFDVHLOSURFHVVRq
LQDWWHVDGLXQHYHQWRFRPHDGHVODOHWWXUDGD
GLVFRRO¶LQVHULPHQWRGLGDWLGDWDVWLHUD
LQHVHFX]LRQH
SURQWRSHUO¶HVHFX]LRQHHTXLQGLDWWHQGHGL
DFFHGHUHDOO¶XWLOL]]RGHOOD&38
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYRHOH
PDFFKLQHYLUWXDOL
,OVLVWHPDRSHUDWLYR
FRQWUROODODPDFFKLQDPXOWLSURJUDPPDWD
FLRqFKHHVHJXHSLSURFHVVL
FRQWHPSRUDQHDPHQWHUHQGHQGRYLVLELOHDG
RJQLSURFHVVRXQDPDFFKLQD³YLUWXDOH´DG
HVVRLQWHUDPHQWHGHGLFDWDHTXLQGLFRQ
ULVRUVHSURSULH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR
HARDWARE 3URFHVVRUH 0HPRULD 3HULIHULFKH
SISTEMA OPERATIVO 6
H E L L
G U I
altri pro_
gram mi
altri pro_
gram
mi PROCESSI
Servizi di Sistema
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYRHOH
PDFFKLQHYLUWXDOL
Hardware e Sistema operativo Processo 1
(esecutore)
Processo 2 (esecutore)
Processo 3 (esecutore) Programma 1 Programma 2 Programma 3
,VWUX]LRQL ,VWUX]LRQL ,VWUX]LRQL
9LUWXDOL]]D]LRQH 9LUWXDOL]]D]LRQH 9LUWXDOL]]D]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR HOHPDFFKLQHYLUWXDOL
CPU A RAM A
FD A
HD A
Rete A I/O A
proc. A
CPU B RAM B
FD B
HD B
Rete B I/O B
proc. B
CPU D RAM D
FD D
HD D
Rete D I/O D
proc. D
CPU C RAM C
FD C
HD C
Rete C I/O C
proc. C
bus
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR HODPDFFKLQDUHDOH
CPU
A, B, C, D
RAM
A B C D
HD
A B C D
FD
A B C D
Rete
A, B, C, D
I/O
A, B, C, D
bus
utilizzo a rotazione suddivisione in blocchi suddivisione in blocchi
suddivisione in blocchi utilizzo a rotazione utilizzo a rotazione
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OVLVWHPDRSHUDWLYR
,OVLVWHPDRSHUDWLYR
JHVWLVFHHYHQWXDOLFRQIOLWWLGLDFFHVVR
FRQWHPSRUDQHRDOOHULVRUVH³UHDOL´
FRQGLYLVHDFFRGDQGRLSURFHVVLULFKLHGHQWL
$GHVXQFRPSRQHQWHGHWWRVFKHGXOHU
VHOH]LRQDLSURFHVVLLQVWDWRGLSURQWRHG
DVVHJQDORURDURWD]LRQHO¶XWLOL]]RGHOOD&38
SHUXQTXDQWRGLWHPSRGLHVHFX]LRQH
SROLWLFDGHWWDURXQGURELQ
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,SURFHVVLHGLOVLVWHPD
RSHUDWLYR
$QFKHLOVLVWHPDRSHUDWLYRq
LPSOHPHQWDWRWUDPLWHSURFHVVL
LOVLVWHPDRSHUDWLYRqJDUDQWHFKHL
FRQIOLWWLWUDLSURFHVVLVLDQRFRQWUROODWLH
JHVWLWLFRUUHWWDPHQWH
LOVLVWHPDRSHUDWLYRYLHQHHVHJXLWRLQ
PRGDOLWjSULYLOHJLDWDNHUQHOPRGH R
VXSHUYLVRUFRVuGDSRWHUFRQWUROODUHJOL
DOWULSURFHVVLHVHJXLWLLQPRGDOLWjXVHU
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&KLDPDWHDOVXSHUYLVRU
,SURFHVVLXWHQWHSHUHVHJXLUH
RSHUD]LRQLSULYLOHJLDWHFRPHDGHV
DFFHVVRDILOH
DFFHVVRDGDOWUHULVRUVH
RSHUD]LRQLGL,2GLUHWWR
LQYRFDQRLOVXSHUYLVRU WUDPLWHFKLDPDWH
GLVLVWHPDV\VWHPFDOOV
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RWLYD]LRQLGHOO¶XVR GHOVXSHUYLVRU
/HRSHUD]LRQLGL,2VRQRRSHUD]LRQL
ULVHUYDWH
XQSURFHVVR$ QRQGHYHSRWHUDQGDUHD
VFULYHUHPHVVDJJLVXXQWHUPLQDOHQRQ
DVVRFLDWRDOORVWHVVRSURFHVVR$
XQSURFHVVR$ QRQGHYHSRWHUOHJJHUH
FDUDWWHULLPPHVVLGDXQWHUPLQDOHQRQ
DVVRFLDWRDOORVWHVVRSURFHVVR$
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RWLYD]LRQLGHOO¶XVR GHOVXSHUYLVRU
8QSURFHVVRQRQGHYHSRWHUVFRQILQDUH
DOGLIXRULGHOSURSULRVSD]LRGL
PHPRULD
SHUQRQDFFHGHUHDOORVSD]LRGLPHPRULD
DVVRFLDWRDGXQDOWURSURFHVVR
PRGLILFDQGRFRGLFHHGDWLGLTXHVW¶XOWLPR
SHUQRQRFFXSDUHWXWWDODPHPRULD
GLVSRQLELOHQHOVLVWHPDEORFFDQGRORH
UHQGHQGRORFRVuLQXWLOL]]DELOHGDDOWUL
SURFHVVL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RWLYD]LRQLGHOO¶XVR GHOVXSHUYLVRU
/DFRQGLYLVLRQHGLULVRUVHTXDOLDG
HVHPSLRGLVFKL&38VFKHGHGLUHWH
GHYHHVVHUHWDOHGDFDXWHODUHLGDWLGLRJQL
XWHQWH
GHYHHYLWDUHFKHXQXWHQWHRFFXSLO¶LQWHUR
VSD]LRGLVSRQLELOHVXLGLVFKLQRQODVFLDQGR
VSD]LRSHUDOWULXWHQWL
VHXQSURFHVVR$ HQWUDLQORRSFLzQRQ
GHYHEORFFDUHO¶LQWHURVLVWHPD
«HGDOWULHVHPSLDQFRUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RWLYD]LRQLGHOO¶XVR GHOVXSHUYLVRU
(VVHQGRXQVLVWHPDPXOWLSURJUDPPDWR
HRPXOWLXWHQWH
HYHQWXDOLFRQIOLWWLGHYRQRHVVHUHJHVWLWLGD
XQ³DUELWUR´LOVLVWHPDRSHUDWLYRFKH
IXQ]LRQLVHFRQGRUHJROHFKLDUHHEHQ
VWDELOLWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
1HFHVVLWjGLSDUDOOHOLVPR QHLVLVWHPLRSHUDWLYL
8QXWHQWHFKHVLFROOHJDDGXQD
PDFFKLQDDGHV8QL[WUDPLWHLO
SURJUDPPDWHOQHWGLVSRQHGLXQ
LQWHUSUHWHFRPDQGLHYHQWXDOPHQWH
VFHOWRGDOO¶XWHQWHVWHVVRWUDPLWHFKVK
1HOODPDFFKLQDGHYHHVVHUHSUHVHQWHXQ
SURFHVVRLQWHUSUHWHFRPDQGLSHURJQL
VHVVLRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
1HFHVVLWjGLSDUDOOHOLVPR QHLVLVWHPLRSHUDWLYL
$GRJQLQXRYDFRQQHVVLRQHLOVLVWHPD
RSHUDWLYRJHQHUDXQSURFHVVRLQWHUSUHWH
FRPDQGLVSHFLILFRSHUTXHOOD
FRQQHVVLRQH
&LVRQRTXLQGLSLFRSLHGHOORVWHVVR
SURJUDPPD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
3DUDOOHOLVPRLQ8QL[
(VLVWRQRGXHSULQFLSDOLPHWRGLSHU
RWWHQHUHO¶HVHFX]LRQHSDUDOOHODLQ
DPELHQWH8QL[
JHQHUD]LRQHGLQXRYLSURFHVVL
XWLOL]]RGLWKUHDG
&RQVLGHUHUHPRODJHQHUD]LRQHGLQXRYL
SURFHVVLPHFFDQLVPRSLVWDQGDUGH
PHQRFRPSOHVVR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/DSURJUDPPD]LRQHGLVLVWHPD
'HILQL]LRQL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
'HILQL]LRQH
&RQSURJUDPPD]LRQHGLVLVWHPD VL
LQWHQGRQROHWHFQLFKHXWLOL]]DWHQHOOD
VFULWWXUDGLSURJUDPPLXWHQWHFLRqQRQ
QHFHVVDULDPHQWHHVHJXLWLLQPRGDOLWj
VXSHUYLVRUFKHLQWHUDJLVFRQR
VWUHWWDPHQWHFRQLOVLVWHPDRSHUDWLYRH
FKHXWLOL]]DQRLVHUYL]LV\VWHPFDOOV PHVVLDGLVSRVL]LRQHGDTXHVW¶XOWLPR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/HFKLDPDWHGLVLVWHPD
/HFKLDPDWHGLVLVWHPDVRQRGLYLVHQHOOH
VHJXHQWLSULQFLSDOLFDWHJRULH
JHVWLRQHGHLSURFHVVL
VHJQDOD]LRQL
JHVWLRQHGLILOH
JHVWLRQHGLGLUHWWRULHGLILOHV\VWHP
SURWH]LRQH
JHVWLRQHGLRUDHGDWD
GD7DQHQEDXP$6:RRGKXOO$:2SHUDWLQJ6\VWHPV 'HVLJQDQG,PSOHPHQWDWLRQQG HG3UHQWLFH+DOO
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
3URJUDPPD]LRQHGLVLVWHPD
$OO¶LQWHUQRGHOODSURJUDPPD]LRQHGL
VLVWHPDODQRVWUDDWWHQ]LRQHVL
IRFDOL]]HUjVXOOHSULPLWLYHLQOLQJXDJJLR
&SHU
JHVWLRQHGHJOLDFFHVVLDILOH
JHVWLRQHGLSURFHVVL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
2SHUD]LRQLVXLILOH
/HSULQFLSDOLRSHUD]LRQLGLDFFHVVRDILOH
FRQVHQWRQRGL
DSULUHXQILOH
OHJJHUHXQFDUDWWHUHXQDVWULQJDXQ
EORFFRGDXQILOH
VFULYHUHXQFDUDWWHUHXQDVWULQJDXQ
EORFFRVXXQILOH
FDQFHOODUHFDPELDUHQRPHVSRVWDUHGL
GLUHWWRULRXQILOH
FKLXGHUHXQILOH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
2SHUD]LRQLVXLSURFHVVL
/HSULQFLSDOLRSHUD]LRQLVXLSURFHVVL
FRQVHQWRQRGL
JHQHUDUHXQSURFHVVRILJOLRFKLOG RDQFKH
VODYHFRSLDGHOSURFHVVRSDGUHSDUHQW R
DQFKHPDVWHULQHVHFX]LRQH
DWWHQGHUHODWHUPLQD]LRQHGLXQSURFHVVRILJOLR
WHUPLQDUHXQSURFHVVRILJOLR UHVWLWXHQGRXQ
FRGLFHDOSURFHVVRSDGUH
VRVWLWXLUHLOFRGLFHGLXQSURFHVVRLQHVHFX]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/DSURJUDPPD]LRQHGLVLVWHPD
/DJHVWLRQHGHLILOH
DHVHUFLWD]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OILOH
(¶XQFRQWHQLWRUHGLLQIRUPD]LRQL
SHUPDQHQWL
VXPHPRULDGLPDVVD
FXLVLDFFHGHWUDPLWHIXQ]LRQLGHOOD
VWDQGDUGOLEUDU\
(¶DQFKHGHWWR³ORQJOLYHGREMHFW´
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,OILOH
(¶LGHQWLILFDWRGD
QRPHXQLYRFRQHOODVXDGLUHFWRU\HG
HVWHQVLRQH
GLUHFWRU\HYROXPHGRYHqPHPRUL]]DWR
OXQJKH]]DQXPHURGLE\WH
GDWDHRUDGLFUHD]LRQHHGLXOWLPRDFFHVVR
SURSULHWDULRHGXWHQWLDXWRUL]]DWLDOO¶DFFHVVR
PRGDOLWjGLDFFHVVR
OHWWXUD
VFULWWXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
9LVXDOL]]D]LRQHGHOOHLQIRUPD]LRQL
DVVRFLDWHDGXQILOH
KRPHSR]]LWHPS!OVOSD WRWDO
GUZ[ SR]]L 6HS
GUZ[U[U[ SR]]L-XQ
UZ SR]]L 6HS 7HPD(VDPHW[W
UZ[UZ[ SR]]L6HS ([HFXWH0H
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
)OXVVLHILOH
8QSURJUDPPDDGHVLQ&FKHGHVLGHUD
XWLOL]]DUHXQILOHGHYHDSULUHXQIOXVVR
VWUHDPGLFRPXQLFD]LRQHLQYRFDQGRLO
VLVWHPDRSHUDWLYR
,OVLVWHPDRSHUDWLYRUHVWLWXLVFHDOSURJUDPPD
LOGHVFULWWRUHGHOILOH KDQGOHHPHPRUL]]D
VHPSUHODSRVL]LRQHFRUUHQWHQHOILOH
2JQLRSHUD]LRQHVXOILOHDYYLHQHWUDPLWH
KDQGOH$OWHUPLQHLOSURJUDPPDFKLXGHLO
ILOHULODVFLDQGRLOGHVFULWWRUH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
)OXVVLHILOH
9LVRQRWUHIOXVVLVWDQGDUGDVVRFLDWLDG
RJQLSURFHVVR
VWGLQODWDVWLHUDSHUOHJJHUHLPHVVDJJLLQ
LQJUHVVRVFDQI
VWGRXWLOYLGHRSHUVFULYHUHLPHVVDJJLLQ
XVFLWDSULQWI
VWGHUULOYLGHRSHUVFULYHUHLPHVVDJJLGL
HUURUHSULQWI
$WDOLIOXVVLVLDJJLXQJRQRHYHQWXDOLILOH
DSHUWLGDOSURJUDPPD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
7LSLGLILOH
'LWHVWR $6&,,
VRQRVHTXHQ]HGLFDUDWWHULJHQHUDOPHQWH
VXGGLYLVHLQOLQHHVHSDUDWHGDOFDUDWWHUH
C?Q¶
SRVVRQRHVVHUHYLVXDOL]]DWLDYLGHRDGHV
WUDPLWHLOFRPDQGRFDWRVWDPSDWLDGHV
WUDPLWHLOFRPDQGROSU
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
7LSLGLILOH
%LQDUL ELQDU\
VRQRVHTXHQ]HGLE\WH
SHUHVVHUHOHWWLqQHFHVVDULRFRQRVFHUHOD
PRGDOLWjVHFRQGRODTXDOHOHLQIRUPD]LRQL
VRQRVWDWHVFULWWH
JHQHUDOPHQWHQRQSRVVRQRHVVHUHOHWWLH
VWDPSDWLGLUHWWDPHQWHVHQRQWUDPLWH
RSSRUWXQLSURJUDPPL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
2SHUD]LRQLGLEDVH QHOODJHVWLRQHGHLILOH
$SHUWXUDIRSHQ DSUHXQILOH
PHPRUL]]DVHPSUHODSRVL]LRQHFRUUHQWH
QHOILOH
&KLXVXUDIFORVH FKLXGHXQILOH
&DQFHOOD]LRQHUHPRYH SHUFDQFHOODUHXQ
ILOH
5LGHQRPLQD]LRQHUHQDPH PRGLILFDLO
QRPHGLXQILOHRVSRVWDUORGLGLUHWWRULR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RGDOLWjEDVHGLDFFHVVR
/HPRGDOLWjEDVHGLDFFHVVRVRQRVSHFLILFDWH
GXUDQWHODIDVHGLDSHUWXUDGHOILOHHVRQR
/HWWXUD
UUHDG
ODSRVL]LRQHFRUUHQWHqDOO¶LQL]LRGHOILOH
6FULWWXUD
ZZULWH
ODSRVL]LRQHFRUUHQWHqDOO¶LQL]LRGHOILOH
$JJLXQWD
DDSSHQG
ODSRVL]LRQHFRUUHQWHqDOODILQHGHOILOH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$OWUHPRGDOLWjGLDFFHVVR
%LQDULR
EELQDU\
/HWWXUDHVFULWWXUD
VLDVFULWWXUDFKHOHWWXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
(VHPSLGLPRGDOLWjGLDFFHVVR
ZZULWHLQPRGDOLWjWHVWR
ZZULWHHUHDGLQPRGDOLWjWHVWR
UEUHDGLQPRGDOLWjELQDULD
DEDJJLXQWDHOHWWXUDLQPRGDOLWjELQDULD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IRSHQ
$SHUWXUDGHOILOH
),/( IS
FRQVWFKDU IQDPH ³0LR)LOH´
FRQVWFKDU PRGH ³Z´
IS IRSHQIQDPHPRGH
IS 18//VHHUURUHGLDSHUWXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IFORVH
&KLXVXUDGHOILOHFKHGHYHHVVHUHVWDWR
DSHUWRSUHFHGHQWHPHQWH
),/( IS
LQWUHVXOW
UHVXOW IFORVHIS
UHVXOW VHHUURUHGLFKLXVXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
UHPRYH
&DQFHOOD]LRQHGHOILOH
),/( IS LQXWLOHSHUODUHPRYH LQWUHVXOW
FRQVWFKDU IQDPH ³0LR)LOH´
UHVXOW UHPRYHIQDPH
UHVXOW VHHUURUHGLFDQFHOOD]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
UHQDPH
5LGHQRPLQD]LRQHGHOILOH
),/( IS LQXWLOHSHUODUHQDPH FRQVWFKDU IQDPH2OG ³9HFFKLR1RPH´
FRQVWFKDU IQDPH1HZ ³1XRYR1RPH´
LQWUHVXOW
UHVXOW UHQDPHIQDPH2OGIQDPH1HZ
UHVXOW VHHUURUHGLULGHQRPLQD]
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
UHQDPHLL
5LGHQRPLQD]LRQHGHOILOHFRQFDPELRGL
GLUHFWRU\
),/( IS LQXWLOHSHUODUHQDPH FKDU IQDPH2OG ³0\'LU9HFFKLR´
FKDU IQDPH1HZ ³0\'LU1XRYR´
UHVXOW UHQDPHIQDPH2OGIQDPH1HZ
UHVXOW VHHUURUHGLULGHQRPLQD]
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
*HVWLRQHGHJOLHUURUL
QHOO¶DFFHVVRDLILOH
5DJJLXQJLPHQWRGHOODILQHGHOILOHIHRI LQGLFDVHVLqUDJJLXQWDODILQHGHOILOH
9HULILFDGLHYHQWXDOLHUURULGLDFFHVVR
IHUURU LQGLFDVHVLVRQRYHULILFDWLHUURUL
GLDFFHVVRDOILOH
&DQFHOOD]LRQHGLHYHQWXDOLHUURULGL
DFFHVVRFOHDUHUU ULSRUWDDOGHIDXOWL
YDORULGLHRI HGLHUURU SHULOILOH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IHRI
9HULILFDLOUDJJLXQJLPHQWRGHOODILQHGHO
ILOHVXXQILOHSUHFHGHQWHPHQWHDSHUWR
OHJJHQGRODYDULDELOHHRI DVVRFLDWDDIS
),/( IS
LQWUHVXOW
UHVXOW IHRIIS
UHVXOW VHILQHILOHUDJJLXQWD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IHUURU
&RQWUROODHUURULGLDFFHVVRDOILOHVXXQ
ILOHSUHFHGHQWHPHQWHDSHUWROHJJHQGR
ODYDULDELOHHUURU DVVRFLDWDDIS
),/( IS
LQWUHVXOW
UHVXOW IHUURUIS
UHVXOW VHHUURUHGLDFFHVVRDOILOH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
FOHDUHUU
5LVWDELOLVFHLYDORULGLGHIDXOWSHUHRI HG
HUURU VXILOHSUHFHGHQWHPHQWHDSHUWR
),/( IS
YRLGFOHDUHUUIS
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$FFHVVRGLUHWWRDLILOH
&RQVHQWH
ODPRGLILFDGHOODSRVL]LRQHFRUUHQWHQHOILOH
SUHFHGHQWHPHQWHDSHUWRTXLQGLSHUPHWWH
O¶DFFHVVRDGXQSDUWLFRODUHE\WHGHOTXDOHq
QRWDODSRVL]LRQHDOO¶LQWHUQRGHOILOH
'LVSRQHGHOOHIXQ]LRQL
IVHHN
IWHOO
UHZLQG
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IVHHN
0RGLILFDGHOODSRVL]LRQHFRUUHQWHGLXQ
ILOHSUHFHGHQWHPHQWHDSHUWR
),/( IS
ORQJRIIVHW
LQWUHVXOWUHISRLQW
UHVXOW IVHHNISRIIVHWUHISRLQW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IVHHN
RIIVHW
LQGLFDORVFRVWDPHQWRHSXzDVVXPHUH
YDORULSRVLWLYLRQHJDWLYL
UHISRLQW
LQGLFDVHORVFRVWDPHQWRqUHODWLYRD
6((.B6(7LQL]LRGHOILOH
6((.B&85SRVL]LRQHFRUUHQWH
6((.B(1'ILQHGHOILOH
UHVXOW
VH LQGLFDXQHUURUHQHOO¶RSHUD]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IWHOO
5LSRUWDODSRVL]LRQHFRUUHQWHGLXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
ORQJRIIVHW
RIIVHW IWHOOIS
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
UHZLQG
5LSRUWDDOO¶LQL]LRODSRVL]LRQHFRUUHQWHGL
XQILOHSUHFHGHQWHPHQWHDSHUWR
),/( IS
YRLGUHZLQGIS
HTXLYDOHDIVHHNIS6((.B6(7
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/HWWXUDHVFULWWXUD GLFDUDWWHULVXILOH
/HWWXUDOHJJHXQFDUDWWHUHGDOILOH
SUHFHGHQWHPHQWHDSHUWR
JHWF
IJHWF
6FULWWXUDVFULYHXQFDUDWWHUHVXOILOH
SUHFHGHQWHPHQWHDSHUWR
SXWF
ISXWF
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IJHWF
/HWWXUDGLXQFDUDWWHUHGDXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
FKDUF
F IJHWFIS
F (2)VHILQHILOHUDJJLXQWD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
ISXWF
6FULWWXUDGLXQFDUDWWHUHVXXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
LQWUHVXOW
FKDUF
UHVXOW ISXWFISF
UHVXOW VHHUURUHGLVFULWWXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/HWWXUDHVFULWWXUD GLVWULQJKHVXILOH
/HWWXUDOHJJHXQDVWULQJDGLFDUDWWHUL
GDOILOHSUHFHGHQWHPHQWHDSHUWR
JHWV
IJHWV
6FULWWXUDVFULYHXQDVWULQJDGLFDUDWWHUL
VXOILOHSUHFHGHQWHPHQWHDSHUWR
SXWV
ISXWV
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IJHWV
/HWWXUDGLXQDVWULQJDGLQ FDUDWWHULGD
XQILOHSUHFHGHQWHPHQWHDSHUWR
),/( IS
FKDU V
LQWQ
LIIJHWVVQIS 18//
^HUURUHGLOHWWXUD`
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IJHWV
/¶RSHUD]LRQHGLOHWWXUDSXz
OHJJHUHQ FDUDWWHUL
OHJJHUHPHQRGLQ FDUDWWHULVHLQFRQWUDXQ
µ?Q¶
/DVWULQJDLQPHPRULDqWHUPLQDWDGD
µ?¶
6HVLLQFRQWUDHRISULPDGLDYHUOHWWRQ FDUDWWHULLFDUDWWHULOHWWLVRQRDVVHJQDWL
DV FKHWHUPLQDFRQµ?¶
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
ISXWV
6FULWWXUDGLXQDVWULQJDVXXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
FKDU V
LQWUHVXOW
UHVXOW ISXWVVIS
UHVXOW VHHUURUHLQVFULWWXUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/HWWXUDHVFULWWXUDGLVWUXFW
/¶RSHUD]LRQHSUHYHGHO¶DFFHVVRDILOHSHU
EORFFKL
/HWWXUDOHJJHXQEORFFRGLGDWLGDXQ
ILOHSUHFHGHQWHPHQWHDSHUWR
IUHDG
6FULWWXUDVFULYHXQEORFFRGLGDWLVXXQ
ILOHSUHFHGHQWHPHQWHDSHUWR
IZULWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/HWWXUDHVFULWWXUDGLVWUXFW
6LLSRWL]]DVLDGDWDXQDVWUXFW GHOWLSR
W\SHGHIVWUXFW^
FKDUFRJQRPH>@
FKDUQRPH>@
LQWPDWULFROD
`VWXGHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IUHDG
/HWWXUDGLXQEORFFRGLGDWLGDXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
VWXGHQWHVWXG
LQWUHVXOWGLPHOHPQXPHOHP
UHVXOW IUHDG VWXGGLPHOHPQXPHOHPIS
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IUHDG
VWXG
LQGLUL]]RGLVWXGHQWH
GLPHOHP
GLPHQVLRQHGHOO¶HOHPHQWR
VL]HRIVWXG
QXPHOHP
QXPHURGLHOHPHQWLGDOHJJHUH
UHVXOW
QXPHURGLHOHPHQWLHIIHWWLYDPHQWHOHWWL
6HUHVXOW QXPHOHPLQGLFDXQHUURUH
QHOO¶RSHUD]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IZULWH
6FULWWXUDGLXQEORFFRGLGDWLVXXQILOH
SUHFHGHQWHPHQWHDSHUWR
),/( IS
VWXGHQWHVWXG
LQWUHVXOWGLPHOHPQXPHOHP
UHVXOW IZULWH VWXGGLPHOHPQXQHOHP
IS
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IZULWH
VWXG
LQGLUL]]RGLVWXGHQWH
GLPHOHP
GLPHQVLRQHGHOO¶HOHPHQWR
VL]HRIVWXG
QXPHOHP
QXPHURGLHOHPHQWLGDVFULYHUH
UHVXOW
QXPHURGLHOHPHQWLHIIHWWLYDPHQWHVFULWWL
6HUHVXOW QXPHOHPLQGLFDXQHUURUH
QHOO¶RSHUD]LRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/DSURJUDPPD]LRQHGLVLVWHPD
/DJHVWLRQHGHLSURFHVVL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
0RWLYD]LRQL
8QSURFHVVRSDGUHSXzGRYHU
PDQGDUHLQHVHFX]LRQHXQDOWUR
SURFHVVRILJOLRHYHQWXDOPHQWH
VRVSHQGHQGRODSURSULDHVHFX]LRQHLQ
DWWHVDGHOODWHUPLQD]LRQHGHOSURFHVVR
ILJOLR
(VHPSLRLQWHUSUHWHFRPDQGL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$VSHWWLJHQHUDOLUHODWLYL DLSURFHVVL
2JQLSURFHVVRqLGHQWLILFDWRLQPRGR
XQLYRFRGDXQ3,'3URFHVV,'HQWLILHU
7XWWLLSURFHVVLVRQRFUHDWLGDDOWUL
SURFHVVLHTXLQGLKDQQRXQSURFHVVR
SDGUH XQLFDHFFH]LRQHLOSURFHVVRLQLW
SULPRSURFHVVRFUHDWRDOODYYLDPHQWR
GHO62FKHQRQKDXQSURFHVVRSDGUH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$VSHWWLJHQHUDOLUHODWLYL DLSURFHVVL
'DOSXQWRGLYLVWDGHOSURJUDPPDWRUHGLVLVWHPDOD
PHPRULDGLODYRURDVVRFLDWDDGXQSURFHVVRSXzHVVHUH
YLVWDFRPHFRVWLWXLWDGDVHJPHQWL
VHJPHQWRFRGLFH WH[WVHJPHQWFRQWLHQHOHVHJXLELOHGHO
SURJUDPPD
VHJPHQWRGDWL XVHUGDWDVHJPHQWFRQWLHQHWXWWHOHYDULDELOLGHO
SURJUDPPDJOREDOLRVWDWLFKHORFDOLDOORFDWHVXVWDFNFUHDWH
GLQDPLFDPHQWHGDOSURJUDPPDWUDPLWHPDOORF
VHJPHQWRGLVLVWHPD V\VWHPGDWDVHJPHQWFRQWLHQHLGDWLQRQ
JHVWLWLHVSOLFLWDPHQWHGDOSURJUDPPDLQHVHFX]LRQHPDGDO62DG
HVHPSLRODWDEHOODGHLILOHDSHUWLHLGHVFULWWRULGLVRFNHW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
2SHUD]LRQHVXLSURFHVVL
/HSULQFLSDOLRSHUD]LRQLVXLSURFHVVL
FRQVHQWRQRGL
JHQHUDUHXQSURFHVVR
DWWHQGHUHODWHUPLQD]LRQHGLXQSURFHVVR
WHUPLQDUHXQSURFHVVR
VRVWLWXLUHLOFRGLFHGLXQSURFHVVRLQ
HVHFX]LRQH
LOSUHVHQWHOXFLGRQHULFKLDPDXQRSUHFHGHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IRUN
&UHDXQSURFHVVRILJOLRRFKLOGLGHQWLFRDO
SURFHVVRSDGUHRSDUHQW
LOILJOLRqXQDFRSLDLGHQWLFDGHOSDGUHDOO¶L
VWDQWHGHOODIRUN/HYDULDELOLLILOHDSHUWLL
VRFNHWXWLOL]]DWLVRQRGXSOLFDWL QHOILJOLR
O¶XQLFDGLIIHUHQ]DWUDILJOLRHSDGUHqOD
YDULDELOHSLG GHOSURFHVVRILJOLRJHQHUDWR
LOSDGUHFRQRVFHLOSLG GHOORILJOLRLOILJOLRQRQ
FRQRVFHLOSURSULRSLG4XLQGLQHOILJOLR
SLG
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
IRUN
8QSURFHVVRILJOLR) SXzDVXDYROWDJHQHUDUH
XQXOWHULRUHSURFHVVRILJOLR1
6LVWDELOLVFHFRVuXQDJHUDUFKLDGLSURFHVVL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
*HUDUFKLDGLSURFHVVL
Padre P
3qSDGUHGL)H)
)qSDGUHGL1H1
)qSDGUHGL1
Figlio F1
Figlio N11
Figlio F2
Figlio N12 Figlio N2
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLIRUN
pid_t fork ()
/∗ Biforca il processo in padre e figlio:
al figlio restituisce sempre 0; al padre restituisce il pid > 0 del figlio biforcato; la funzione restituisce −1 se la biforcazione del processo fallisce (restituisce solo al padre, ovviamente, visto che il figlio non è stato biforcato), per esempio per insufficienza di memoria per la creazione del processo figlio, o altro motivo ∗/
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLIRUN LL
6LQWDVVL
SLGBWSLG IRUN UHVWLWXLVFHSLGBW SLGDVVXPHYDORUH
QHOILJOLR
QHOSDGUHVHODIRUNQRQqVWDWDHVHJXLWDDG
HVSHUPDQFDQ]DGLPHPRULD
TXDOVLDVLDOWURYDORUHQHOSDGUHLQGLFDLOSLGGHO
ILJOLR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
8WLOL]]RGLIRUN
#include <stdio.h>
#include <unistd.h>
void main(int argc, char * argv[]) { pid_t pid;
int retstatus;
pid = fork();
if (pid==0) {
/* sono nel figlio*/
...
/* il figlio termina restituendo al padre lo */
/* stato di terminazione */
exit(retstatus);
} else {
/* pid != 0, sono nel padre */
} }
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
s_pid = fork();
if (s_pid == 0) {
compito del figlio }
else {w_pid = wait(&stato);}
seguito del padre;
Process ID = a La fork genera un
altro processo con Process ID=s_pid=b
Process ID = b, s_pid = 0 Process ID = a, s_pid = b
s_pid = fork();
if (s_pid == 0) {...}
else {w_pid = wait(&stato);
il padre attende la terminazione del figlio
};
padre
s_pid = fork();
if (s_pid == 0) {
compito del figlio exit(0);
} else {};
figlio
s_pid = fork();
if (s_pid == 0) {...}
else {w_pid = wait(&stato);
dopo la terminazione del figlio il padre procede l’esecuzione };
Termine del processo con Process ID = b Dopo la terminazione del processo figlio
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
ZDLW
6RVSHQGHO¶HVHFX]LRQHGHOSURFHVVRSDGUHHG
DWWHQGHODWHUPLQD]LRQHGLXQTXDOVLDVL
SURFHVVRILJOLR
VHLOILJOLRWHUPLQDSULPDFKHLOSDGUHHVHJXD
ODZDLWO¶HVHFX]LRQHGHOODZDLW QHOSDGUH
WHUPLQDLVWDQWDQHDPHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLZDLW
pid_t wait (int * stato)
/∗ Mette un processo padre in stato di attesa dell’evento di terminazione di un processo figlio qualsiasi, e restituisce il pid del figlio effettivamente terminato; la funzione restituisce −1 se il processo padre esce dalla
"wait" per un errore che non abbia a che vedere con la terminazione di un figlio; l'argomento
“stato” assume il valore di “exit” del processo figlio terminato.
Parametri: stato è il puntatore a un intero, che conterrà lo stato di uscita del figlio terminato (contano solo gli 8 bit più significativi; gli 8 bit meno significativi vengono impostati da parte del sistema operativo stesso) ∗/
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
(VHPSLRGLZDLW
6LQWDVVL
P\BSLG ZDLW VWDWXV
UHVWLWXLVFHXQWLSRSLGBW QHOSDGUH
P\BSLGDVVXPHLOYDORUHGHOSLGGHOILJOLR
WHUPLQDWR
VWDWXVGLWLSRLQWHURDVVXPHLOYDORUHGHO
FRGLFHGLWHUPLQD]LRQHGHOSURFHVVRILJOLR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
8WLOL]]RGLZDLW
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main(int argc, char * argv[]) { pid_t pid, my_pid;
int status;
pid = fork();
if (pid==0) { }
else {
printf("Ho generato il processo figlio con pid %d\n",pid);
/* pid != 0, sono nel padre */
...
my_pid = wait(&status);
printf{"E’ terminato il processo %d con esito %d\n",my_pid, status/256);
} }
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
ZDLWSLG
6RVSHQGHO¶HVHFX]LRQHGHOSURFHVVRSDGUHHG
DWWHQGHODWHUPLQD]LRQHGHOSURFHVVRILJOLRGL
FXLYLHQHIRUQLWR LOSLGP\BSLG
VHLOILJOLRWHUPLQDSULPDFKHLOSDGUHHVHJXD
ODZDLWSLGO¶HVHFX]LRQHGHOODZDLWSLG QHO
SDGUHWHUPLQDLVWDQWDQHDPHQWH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLZDLWSLG
pid_t waitpid (pid_t pid, int * stato, int opzioni)
/∗ Mette un processo padre in stato di attesa dell’evento di terminazione del processo figlio avente pid pari a “pid”, e ne restituisce il pid; la funzione è insensibile alla terminazione di eventuali altri figli aventi pid diverso da "pid"; la funzione restituisce −1 se il processo padre esce dalla
"waitpid" per un errore che non abbia a che vedere con la terminazione del figlio "pid"; l'argomento
“stato” assume il valore di “exit” del processo figlio terminato.
Parametri: pid è il "pid" del figlio della cui terminazione il padre si mette in attesa; stato è il puntatore a un intero, che conterrà lo stato di uscita del figlio terminato (solo gli 8 bit più significativi); opzioni è un intero che specializza la funzione “waitpid”, e di solito vale 0 (altrimenti vedere il manuale in linea della funzione, perché le opzioni possibili sono parecchie) ∗/
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
(VHPSLRGLZDLWSLG
6LQWDVVL
P\BSLG ZDLWSLGSLG VWDWXV
RSWLRQV UHVWLWXLVFHXQSLGBW QHOSDGUH
P\BSLGDVVXPHLOYDORUHGHOSLGGHOILJOLR
WHUPLQDWR
VWDWXVDVVXPHLOYDORUHGHOFRGLFHGLWHUPLQD]LRQH
GHOSURFHVVRILJOLR
RSWLRQVVSHFLILFDXOWHULRULRS]LRQLLSRWL]]LDPR!
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
8WLOL]]RGLZDLWSLG
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main(int argc, char * argv[]) { pid_t pid, my_pid;
int status;
pid = fork();
if (pid==0) { }
else {
printf("Ho generato il processo figlio con pid %d\n",pid);
/* pid != 0, sono nel padre */
...
printf{"Attendo la terminazione del figlio con pid %d\n",pid) my_pid = waitpid(pid, &status, 1);
printf{"E’ terminato il processo %d con esito %d\n",my_pid, status/256);
} }
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
H[HF
6RVWLWXLVFHLOFRGLFHGHOSURFHVVRFRUUHQWHFRQ
LOFRGLFHGHOSURJUDPPDVSHFLILFDWR
PDQWLHQHORVWHVVRSLG
SDVVDLSDUDPHWULDOSURFHVVRFRQLOQXRYR
FRGLFHDWWUDYHUVRODOLQHDGLFRPDQGRDUJFH
DUJY YHGLDSSHQGLFH
HVLVWRQRQXPHURVLYDULDQWLFRQVLGHUHUHPROD
IXQ]LRQHH[HFO
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLH[HFO
6LQWDVVL
LQWH[HFOFKDU SDWKBSURJUDPPD
FKDU DUJFKDU DUJ«FKDU DUJQ18//
UHVWLWXLVFHLQW
SDWKBSURJUDPPDSDWKFRPSOHWRGHOILOH
DUJDUJ«DUJQSXQWDWRULDVWULQJKHFKHYHUUDQQRSDVVDWH
FRPHSDUDPHWULDOPDLQGHOSURJUDPPD DUJ GHYHHVVHUHLOQRPHGHOSURJUDPPD
O¶XOWLPRHOHPHQWRGHYHHVVHUHXQSXQWDWRUHD18//
LOYDORUHUHVWLWXLWRq
VHO¶RSHUD]LRQHqVWDWDHVHJXLWDFRUUHWWDPHQWH
VHF¶qVWDWRXQHUURUHHO¶RSHUD]LRQHGLVRVWLWX]LRQHGHO
FRGLFHqIDOOLWD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
8WLOL]]RGLH[HFO
#include <stdio.h>
#include <unistd.h>
void main(int argc, char * argv[]) {
int retstatus;
char par0[] = “my_main1”;
char par1[] = “primo parametro”;
char par2[] = “secondo parametro”;
retstatus = execl(“/usr/home/pozzi/main1", par0, par1, par2, NULL);
}
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
if (s_pid == 0) {
compito del figlio;
exec(“my_prog”,…)}
else {w_pid = wait(&stato);}
seguito del padre;
Process ID = a
if (s_pid == 0) {...}
else {w_pid = wait(&stato);
il padre attende la terminazione del figlio
};
padre
if (s_pid == 0) {...}
else {w_pid = wait(&stato);
dopo la terminazione del figlio il padre procede l’esecuzione };
Dopo la terminazione di my_prog
main(int argc, char **argv) {
exit(0);
}
figlio (con exec sostituisco il codice)
Termine del processo figlio if (s_pid == 0) {
compito del figlio exec(“my_prog,…”);}
else {};
figlio
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
H[LW
3RQHWHUPLQHDOSURFHVVRFRUUHQWHILJOLR UHVWLWXHQGRXQFRGLFHDOSURFHVVRSDGUH
6HLOSURFHVVRFKHqWHUPLQDWRQRQKDXQ
SURFHVVRSDGUHLOFRGLFHGHOODH[LWYLHQH
UHVWLWXLWRDOO¶LQWHUSUHWHFRPDQGL
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6LQWDVVLGLH[LW
6LQWDVVL
YRLGH[LWLQWVWDWXV
QRQUHVWLWXLVFHQXOODDO
SURFHVVRFKHHVHJXHODH[LW LOSURFHVVRSDGUHSXzDFFHGHUHDOFRGLFHGL
WHUPLQD]LRQHGHOILJOLR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
8WLOL]]RGLH[LW
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void main(int argc, char * argv[]) { pid_t pid;
int status,retstatus;
pid = fork();
if (pid==0) {
/* il figlio restituisce al padre lo stato di terminazione */
retstatus = 250;
exit(retstatus);}
else { /* pid != 0, sono nel padre */
pid = wait(&status);
printf("E’ terminato il processo %d con esito
%d\n”,pid,status/256);
/* stampera’ il numero del pid del figlio e il numero 250 */
} }
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/DSURJUDPPD]LRQHGLUHWH LQDPELHQWHPXOWLSURFHVVR
,OSDUDOOHOLVPRQHLVHUYHU
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
1HFHVVLWjGLSDUDOOHOLVPR QHLVHUYHU
6HUYHUVHTXHQ]LDOL
DFFHWWDQRXQDVROD FRQQHVVLRQHDOODYROWD
QRQVRQRSHUWDQWRSDUWLFRODUPHQWHXWLOL(¶
VRORXQDFRPXQLFD]LRQHWUDGXHSURFHVVL
SHUYROWDHYHQWXDOPHQWHDFFRGDQGRDOWUL
SURFHVVLFKHYRJOLDQRFRQQHWWHUVLDOOR
VWHVVRVHUYHUOLVWHQ
VRQRDQFKHGHWWLPRQRFRQQHVVLRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
1HFHVVLWjGLSDUDOOHOLVPR QHLVHUYHU
6HUYHUSDUDOOHOL
VXSHUDQRLOLPLWLGHLVHUYHUVHTXHQ]LDOL
VIUXWWDQGRLOPHFFDQLVPRGLSDUDOOHOLVPR
XWLOL]]HUHPRLOSDUDOOHOLVPRGL8QL[
WUDVFXUDQGRTXHOORGL:LQGRZV
LOFOLHQWQRQKDPRGRGLGLVWLQJXHUHVHVLq
FRQQHVVRDGXQVHUYHUVHTXHQ]LDOHRDGXQ
VHUYHUSDUDOOHORSXzVRORDFFRUJHUVLGLXQD
FRQQHVVLRQHULILXWDWD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
)XQ]LRQDPHQWR GLXQVHUYHUSDUDOOHOR
,OVHUYHUVLSRQHLQDWWHVDGLULFKLHVWHGL
FRQQHVVLRQLDFFHSWVXXQSRUWVUYSRUW
DOODULFH]LRQHGLXQDULFKLHVWDGL
FRQQHVVLRQHFRQQHFW GHOFOLHQWVX
VUYSRUWLOVHUYHUFUHDWUDPLWHODIRUN XQ
QXRYRSURFHVVRGHWWRILJOLRLGHQWLFRD
VHVWHVVRSURFHVVRSDGUHLPSURSULD
PHQWHGHWWRDQFKHVHUYHUSULQFLSDOH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$OO¶LQWHUQRGHOVHUYHUSDUDOOHOR
'RSRODFUHD]LRQHGHOSURFHVVRILJOLRLO
SDGUHFKLXGHODFRQQHVVLRQHFROFOLHQWH
ULPDQHLQDWWHVDGLQXRYHULFKLHVWHGL
FRQQHFWFKHXWLOL]]HUDQQRVHPSUHOR
VWHVVRVUYSRUW
,OILJOLRXWLOL]]DLOVRFNHWDSHUWRGDO
SDGUHDOODFRQQHFW$OWHUPLQHLOILJOLR
FKLXGHODFRQQHVVLRQHFORVHHWHUPLQD
H[LW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
)XQ]LRQDPHQWRGLEDVH GLXQVHUYHUSDUDOOHOR
while (1) /* il server è in un ciclo perenne */
{
new_sd = accept(sd, ...) pid = fork();
if (pid==0) /*sono nel figlio */
{ /*esegui le richieste del client utilizzando il socket connesso new_sd; alla fine chiudi new_sd ed esegui exit */
}
else /* sono nel padre */
{ /*chiudi new_sd e
riprendi ad eseguire la accept su sd */
} }
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
5HDOL]]D]LRQH
GLXQVHUYHUSDUDOOHOR
0RGLILFDUH6HUYHUFRVuGDUHQGHUORXQ
VHUYHUSDUDOOHOR6HUYHUSDU
QEVXLFDOFRODWRUL8QL[LOWLSRSLGBWFRLQFLGHFRQLOWLSR
LQW9HUUjTXLQGLXWLOL]]DWDODGLFKLDUD]LRQHGHOWLSR
int p_id;
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU3DU L
/* programma Server3Par */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 4000
#define MAXCONN 5
void addr_initialize();
void main(int argc, char * argv[])
{ int sd,new_sd,bind_result,listen_result; int pid; char inbuf;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int client_len=sizeof(client_addr);
char rispostaA[]="**il Server ha eseguito il comando A**";
char rispostaB[]="**il Server ha eseguito il comando B**";
char errmessage[]="**comando errato**";
char terminatore[2]={’*’,’\n’};
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU3DULL
addr_initialize(&server_addr, PORT, INADDR_ANY);
sd=socket(AF_INET,SOCK_STREAM,0);
bind_result=bind(sd,(struct sockaddr*) &server_addr,sizeof(server_addr));
listen_result=listen(sd,MAXCONN);
while (1) {
printf("\nMi pongo in attesa di richieste di connessione\n");
new_sd=accept(sd,(struct sockaddr*) &client_addr,
&client_len);
printf("Ho accettato una connessione da: %d\n", ntohs(client_addr.sin_port));
pid=fork();
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU3DULLL
if (pid==0){
do{ recv(new_sd,&inbuf,1,0);
printf("Ho ricevuto il comando %c ",inbuf);
printf("da: %d \n", ntohs(client_addr.sin_port));
switch (inbuf) { case ’e’:break;
case ’a’:{send(new_sd,rispostaA, sizeof(rispostaA),0);
send(new_sd,terminatore,2,0);break;}
case ’b’:{printf("i parametri sono: ");
do{recv(new_sd,&inbuf,1,0);
printf("%c",inbuf);
}while (inbuf!=’\0’);
printf(" ");
do {recv(new_sd,&inbuf,1,0);
printf("%c",inbuf);
}while (inbuf!=’\0’);
printf(" \n");
send(new_sd,rispostaB,sizeof(rispostaB),0);
send(new_sd,terminatore,2,0);break;}
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU3DULY
default:{send(new_sd,errmessage, sizeof(errmessage),0);
send(new_sd,terminatore,2,0);break;}
}
} while (inbuf!=’e’);
printf("\nChiudo la connessione con: %d\n\n", ntohs(client_addr.sin_port));
close(new_sd);
exit();
} /* chiude if (pid == 0) */
close(new_sd); /* il padre chiude il socket che */
/* viene utilizzato dal figlio */
} /* chiude while (1) */
} /* chiude main */
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
(VHFX]LRQHGL6HUYHU3DU
&RQVLGHULDPRRUDXQHVHPSLRGL
HVHFX]LRQHGL6HUYHU3DUFKHDFFHWWD
FRQQHVVLRQLGDGLVWLQWLSURFHVVL
ULVSHWWLYDPHQWH&&H&
&&H&VRQRHVHFX]LRQLGHO
SURJUDPPD&OLHQWR:&OLHQW
&OLHQWQRQKDPRGRGLULFRQRVFHUHVHLO
VHUYHUFXLVLFROOHJDqVHTXHQ]LDOHR
SDUDOOHOR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
(VHFX]LRQHGL6HUYHU3DU
,SURFHVVLILJOLGL6HUYHU3DUXWLOL]]DQR
ODVWHVVDVHVVLRQHGLWHUPLQDOHGHO
SURFHVVRSDGUH
,PHVVDJJLGHOSDGUHHGHLILJOLVDUDQQR
DOWHUQDWLVXXQDXQLFDILQHVWUD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$YYLRGL6HUYHU3DU
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGRD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$YYLRGL&
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLFRPDQGLDHE
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGR[
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGR\
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$YYLRGL&
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGRD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&FKLXGHODFRQQHVVLRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGRE
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&HVHJXHLOFRPDQGR
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&FKLXGHODFRQQHVVLRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&FKLXGHODFRQQHVVLRQH
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
,QYRFD]LRQHGLSURJUDPPL GLVHUYL]LR
8QVHUYHUSUHVHQWDXQ¶LQWHUIDFFLDDWWUDYHUVR
FXLGLIIHUHQWLFOLHQWULFKLHGRQRDTXHOVHUYHU
O¶HVHFX]LRQHGLSURJUDPPLJLjHVLVWHQWL
,OVHUYHUSDUDOOHORIRUN HJHQHUD]LRQHGL
ILJOLRSHURJQLFRQQHVVLRQHULFHYXWDGHYH
HVHJXLUHLOSURJUDPPDVSHFLILFDWRGDOFOLHQW
WUDPLWHXQDH[HF SDVVDQGRJOLLOGHVFULWWRUHGHO
VRFNHW
DWWHQGHUHLOWHUPLQHGHOSURJUDPPDZDLW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6HUYHU([HF
5LVSHWWRD6HUYHU3DU
qVHPSUHPXOWLSURFHVVRTXLQGLSHURJQL
FRQQHVVLRQHHVHJXHXQDIRUN
DGRJQLULFKLHVWDGDOFOLHQWJHQHUDXQ
XOWHULRUHSURFHVVRWUDPLWHXQDIRUNFKH
HVHJXHLOFRPDQGRLQGLFDWRGDOFOLHQW
WUDPLWHODH[HFO
SDVVDDOSURJUDPPDLQYRFDWR0DLQ$R
0DLQ%LOGHVFULWWRUHGHOVRFNHWSHU
FRPXQLFDUHFROFOLHQW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU([HFL
/* programma Server3Exec */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 4000
#define MAXCONN 5
void addr_initialize();
void main(int argc, char * argv[]) {
int sd,new_sd,bind_result,listen_result; char inbuf;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int client_len=sizeof(client_addr);
char errmessage[]="**comando errato**"; /* rispetto a Server3Pa mancano */
char terminatore[2]={’*’,’\n’}; /* rispostaA e rispostaB */
char sdstring[7]; /* nuovo rispetto a Server3Par */
int pid,my_pid,status;
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU([HFLL
addr_initialize(&server_addr, PORT, INADDR_ANY);
sd=socket(AF_INET,SOCK_STREAM,0);
bind_result=bind(sd,(struct sockaddr*) &server_addr,sizeof(server_addr));
listen_result=listen(sd,MAXCONN);
while (1) {
printf("\nMi pongo in attesa di richieste di connessione\n");
new_sd=accept(sd,(struct sockaddr*) &client_addr, &client_len);
printf("Ho accettato una connessione da: %d\n", ntohs(client_addr.sin_port));
pid=fork();
if (pid==0) { do
{
recv(new_sd,&inbuf,1,0);
printf("Ho ricevuto il comando %c ",inbuf);
printf("da: %d \n", ntohs(client_addr.sin_port));
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU([HFLLL
switch (inbuf) {
case ’e’:break;
case ’a’:{sprintf(sdstring,"%d",new_sd);
pid=fork();
if (pid==0) {
execlp(“./MainA", “MainA”, sdstring, NULL);
printf(“errore di execl”); exit(255)}
else {my_pid = wait(&status); break;}}
case 'b':{sprintf(sdstring,"%d",new_sd);
pid=fork();
if (pid==0) {
execlp(“./MainB", “MainB”, sdstring, NULL);
printf(“errore di execl”); exit(255)}
else {my_pid = wait(&status); break;}}
default: {send(new_sd,errmessage, sizeof(errmessage),0);
send(new_sd,terminatore,2,0);break;}
} /* chiude switch */
} while (inbuf!='e'); /* chiude do */
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL6HUYHU([HFLY
printf("\nChiudo la connessione con: %d\n\n", ntohs(client_addr.sin_port));
close(new_sd);
exit();
} /* chiude if (pid == 0) */
close(new_sd); /* il padre chiude il socket che */
/* viene utilizzato dal figlio */
} /* chiude while (1) */
} /* chiude main */
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL0DLQ$
/* programma MainA */
void main(int argc, char * argv[]) {
int sd;
char terminatore[2] = {’*’,’\n’};
char rispostaA[] = "**MainA ha eseguito il comando A**";
printf(" MainA\n");
sd = atoi(argv[1]);
send(sd, rispostaA, sizeof(rispostaA),0);
send(sd, terminatore,2,0);
printf(" MainA: ho terminato\n");
exit(0);
}
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&RPXQLFD]LRQH&OLHQW0DLQ%
/DFRPXQLFD]LRQHWUD&OLHQWH0DLQ%
DYYLHQHDWWUDYHUVRLOGHVFULWWRUHGHO
VRFNHW
&OLHQWQRQVLDFFRUJHGLSDUODUHFRQ
0DLQ%qFRQYLQWRGLSDUODUHFRQ
6HUYHU([HF
0DLQ%ULFHYHVXOODOLQHDGLFRPDQGRLO
GHVFULWWRUHGHOVRFNHWSHUFROORTXLDUH
FRQ&OLHQW
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
/LVWDWRGL0DLQ%
/* programma MainB*/
void main(int argc, char * argv[]) { int sd; char inbuf;
char rispostaB[] = "**MainB ha eseguito il comando B**";
char terminatore[2] = {’*’,’\n’};
sd = atoi(argv[1]);
printf(" MainB: i parametri sono:");
do { recv(sd, &inbuf, 1, 0);
printf("%c", inbuf);
} while (inbuf != ’\0’);
prinf(" ");
do { recv(sd, &inbuf, 1, 0);
printf("%c",inbuf);
} while (inbuf != ’\0’);
printf("\n" );
send(sd, rispostaB, sizeof(rispostaB),0);
send(sd, terminatore, 2, 0);
printf(" MainB: ho terminato\n");
exit(0);
}
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
$YYLRGL6HUYHU([HF
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&OLHQWULFKLHGHLOFRPDQGRH
ORLQYLDDOVHUYHU
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
6HUYHU([HFULFHYH
LOFRPDQGREHODQFLDO¶HVFX]LRQH
GL0DLQ%
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&OLHQWULFHYHLPHVVDJJL
GD0DLQ%
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&OLHQWHVHJXHLOFRPDQGR[
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&OLHQWHVHJXHLOFRPDQGRD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD
&OLHQWWHUPLQD
,QIRUPDWLFD,, 3URJUDPPD]LRQHGL5HWHHGL6LVWHPD