1331c9c70790e324cd95962e011fb9a1a025a104
[gapil.git] / ipc.tex
1 \chapter{La comunicazione fra processi}
2 \label{cha:IPC}
3
4
5 Uno degli aspetti fondamentali della programmazione in un sistema unix-like è
6 la comunicazione fra processi. In questo capitolo affronteremo solo i
7 meccanismi più elementari che permettono di mettere in comunicazione processi
8 diversi, come quelli tradizionali che coinvolgono \textit{pipe} e
9 \textit{fifo} e i meccanismi di intercomunicazione di System V.
10
11 Tralasceremo invece tutte le problematiche relative alla comunicazione
12 attraverso la rete (e le relative interfacce) che saranno affrontate in gran
13 dettaglio in un secondo tempo.  Non affronteremo invece meccanismi più
14 complessi ed evoluti come le RPC (\textit{Remote Procedure Calls}) e CORBA
15 (\textit{Common Object Request Brocker Architecture}) che in genere sono
16 implementati con un ulteriore livello sopra i meccanismi elementari.
17
18
19
20 \section{La comunicazione fra processi tradizionale}
21 \label{sec:ipc_unix}
22
23 Il primo meccanismo di comunicazione fra processi usato dai sistemi unix-like
24 è quello delle \textit{pipe}, in questa sezione descriveremo le sue basi, le
25 funzioni che ne gestiscono l'uso e le varie forme in cui si è evoluto.
26
27
28 \subsection{Le \textit{pipe} standard}
29 \label{sec:ipc_pipes}
30
31 Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, ed uno dei
32 più usati, meccanismi di comunicazione fra processi. Si tratta in sostanza uno
33 speciale tipo di file\footnote{più precisamente un file descriptor; le pipe
34   sono create dal kernel e non risiedono su disco.} in cui un processo scrive
35 ed un altro legge. Si viene così a costituire un canale di comunicazione fra i
36 due processi, nella forma di un \textsl{tubo} (da cui il nome) in cui uno dei
37 processi immette dati che poi arriveranno all'altro.
38
39
40 La funzione che permette di creare una \textit{pipe} è appunto \func{pipe}; il
41 suo prototipo è:
42 \begin{prototype}{unistd.h}
43 {int pipe(int filedes[2])} 
44   
45 Crea una coppia di file descriptor associati ad una \textit{pipe}.
46   
47   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
48     errore, nel qual caso \var{errno} potrà assumere i valori \macro{EMFILE},
49     \macro{ENFILE} e \macro{EFAULT}.}
50 \end{prototype}
51
52 La funzione restituisce una coppia di file descriptor nell'array
53 \param{filedes}; il primo aperto in lettura ed il secondo in scrittura. Il
54 concetto di funzionamento di una \textit{pipe} è relativamente semplice,
55 quello che si scrive nel file descriptor aperto in scrittura viene
56 ripresentato tale e quale nel file descriptor aperto in lettura, da cui può
57 essere riletto.
58
59 I file descriptor infatti non sono connessi a nessun file reale, ma ad un
60 buffer nel kernel (la cui dimensione è specificata dalla costante
61 \macro{PIPE\_BUF}, vedi \secref{sec:sys_file_limits}), di modo che scrivendo
62 in uno si può rileggere dall'altro.
63
64 Chiaramente creare una pipe all'interno di un processo non serve a niente; se
65 però ricordiamo quanto esposto in \secref{sec:file_sharing} riguardo al
66 comportamento dei file descriptor nei processi figli, è immediato capire come
67 una pipe possa diventare un meccanismo di intercomunicazione. Un processo
68 figlio infatti condivide gli stessi file descriptor del padre, compresi quelli
69 associati ad una pipe; in questo modo se uno dei processi scrive su un capo
70 della pipe, l'altro può leggere. 
71
72 Tutto ciò ci mosta come sia immediato realizzare un meccanismo di
73 comunicazione fra processi attraverso una pipe utilizzando le ordinarie
74 proprietà dei file, ma ci mostra anche qual'è il principale\footnote{Stevens
75   riporta in APUE come limite anche il fatto che la comunicazione è
76   unidirezionale, in realtà questo è un limite facilemente risolvibile usando
77   una coppia di \textit{pipe}.} limite nell'uso delle \textit{pipe}. È
78 necessario infatti che i processi possano condividere i file descriptor della
79 \textit{pipe}; e per questo essi devono comunque derivare da uno stesso
80 processo padre che ha aperto la pipe, o, più comunemente, essere nella
81 relazione padre/figlio.
82
83
84
85 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
86 \label{sec:ipc_named_pipe}
87
88 Per poter superare il problema delle \textit{pipe} originali, che consentono
89 la comunicazione solo fra processi correlati, passando attraverso strutture
90 interne del kernel, sono stati introdotti dei nuovi oggetti, le \textit{fifo},
91 che invece possono risiedere sul filesystem, e che i processi possono usare
92 per le comunicazioni senza dovere per forza essere in relazione diretta. 
93
94
95
96   
97 \section{La comunicazione fra processi di System V}
98 \label{sec:ipc_sysv}
99
100 Per ovviare ai vari limiti dei meccanismo tradizionale di comunicazione fra
101 processi visto in \secref{sec:ipc_unix}, nello sviluppo di System V vennero
102 introdotti una serie di nuovi oggetti e relative interdacce che garantissero
103 una maggiore flessibilità; in questa sezione esamineremo quello che viene
104 ormai chiamato il \textit{System V Inter-Process Comunication System}, più
105 comunemente noto come \textit{SystemV IPC}.
106  
107
108 \subsection{Code di messaggi}
109 \label{sec:ipc_messque}
110
111 Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di
112 messaggi.
113
114 \subsection{Semafori}
115 \label{sec:ipc_semaph}
116
117 Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori.
118
119
120 \subsection{Memoria condivisa}
121 \label{sec:ipc_shar_mem}
122
123 Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria
124 condivisa.
125
126 %%% Local Variables: 
127 %%% mode: latex
128 %%% TeX-master: "gapil"
129 %%% End: