Revisione
[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
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 e quello che viene correntemente usato di più, è quello delle \textit{pipe},
25 che sono una delle caratteristiche peculiari del sistema, in particolar modo
26 dell'interfaccia a linea di comando. In questa sezione descriveremo le sue
27 basi, le funzioni che ne gestiscono l'uso e le varie forme in cui si è
28 evoluto.
29
30
31 \subsection{Le \textit{pipe} standard}
32 \label{sec:ipc_pipes}
33
34 Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, ed uno dei
35 più usati, meccanismi di comunicazione fra processi. Si tratta in sostanza uno
36 speciale tipo di file\footnote{più precisamente un file descriptor; le pipe
37   sono create dal kernel e non risiedono su disco.} in cui un processo scrive
38 ed un altro legge. Si viene così a costituire un canale di comunicazione fra i
39 due processi, nella forma di un \textsl{tubo} (da cui il nome) in cui uno dei
40 processi immette dati che poi arriveranno all'altro.
41
42
43 La funzione che permette di creare una pipe è appunto \func{pipe}; il suo
44 prototipo è:
45 \begin{prototype}{unistd.h}
46 {int pipe(int filedes[2])} 
47   
48 Crea una coppia di file descriptor associati ad una pipe.
49   
50   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
51     errore, nel qual caso \var{errno} potrà assumere i valori \macro{EMFILE},
52     \macro{ENFILE} e \macro{EFAULT}.}
53 \end{prototype}
54
55 La funzione restituisce una coppia di file descriptor nell'array
56 \param{filedes}; il primo aperto in lettura ed il secondo in scrittura. Il
57 concetto di funzionamento di una pipe è relativamente semplice, quello che si
58 scrive nel file descriptor aperto in scrittura viene ripresentato tale e quale
59 nel file descriptor aperto in lettura, da cui può essere riletto.
60
61 I file descriptor infatti non sono connessi a nessun file reale, ma ad un
62 buffer nel kernel, la cui dimensione è specificata dalla costante
63 \macro{PIPE\_BUF}, (vedi \secref{sec:sys_file_limits}); lo schema di
64 funzionamento di una pipe è illustrato in \figref{fig:ipc_pipe_singular}, in
65 cui sono illustrati i due capi della pipe, associati a ciascun file
66 descriptor, con le frecce che indicano la direzione del flusso dei dati
67 attaverso la pipe.
68
69 \begin{figure}[htb]
70   \centering
71   \includegraphics[height=5cm]{img/pipe}
72   \caption{Schema della struttura di una pipe.}
73   \label{fig:ipc_pipe_singular}
74 \end{figure}
75
76 Chiaramente creare una pipe all'interno di un processo non serve a niente; se
77 però ricordiamo quanto esposto in \secref{sec:file_sharing} riguardo al
78 comportamento dei file descriptor nei processi figli, è immediato capire come
79 una pipe possa diventare un meccanismo di intercomunicazione. Un processo
80 figlio infatti condivide gli stessi file descriptor del padre, compresi quelli
81 associati ad una pipe (secondo la situazione illustrata in
82 \figref{fig:ipc_pipe_fork}). In questo modo se uno dei processi scrive su un
83 capo della pipe, l'altro può leggere.
84
85 \begin{figure}[htb]
86   \centering
87   \includegraphics[height=5cm]{img/pipefork}
88   \caption{Schema dell'uso di una pipe come mezzo di comunicazione fra
89   processo attraverso una \func{fork}.}
90   \label{fig:ipc_pipe_fork}
91 \end{figure}
92
93 Tutto ciò ci mostra come sia immediato realizzare un meccanismo di
94 comunicazione fra processi attraverso una pipe, utilizzando le ordinarie
95 proprietà dei file, ma ci mostra anche qual'è il principale\footnote{Stevens
96   riporta in APUE come limite anche il fatto che la comunicazione è
97   unidirezionale, in realtà questo è un limite facilemente risolvibile usando
98   una coppia di pipe.} limite nell'uso delle pipe. È necessario infatti che i
99 processi possano condividere i file descriptor della pipe, e per questo essi
100 devono comunque derivare da uno stesso processo padre che ha aperto la pipe,
101 o, più comunemente, essere nella relazione padre/figlio.
102
103 Per capire meglio il funzionamento di una pipe faremo un esempio di quello che
104 è il loro uso più comune, analogo a quello effettuato della shell, e che
105 consiste nell'inviare l'output di un processo (usando lo standard output)
106 sull'input di un'altro.
107
108
109
110 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
111 \label{sec:ipc_named_pipe}
112
113 Per poter superare il problema delle \textit{pipe}, illustrato in
114 \secref{sec:ipc_pipes}, che ne consente l'uso solo fra procesi con un
115 progenitore comune o nella relazione padre/figlio, lo standard POSIX.1
116 definisce dei nuovi oggetti, le \textit{fifo}, che invece possono risiedere
117 sul filesystem, e che i processi possono usare per le comunicazioni senza
118 dovere per forza essere in relazione diretta.
119
120
121
122   
123 \section{La comunicazione fra processi di System V}
124 \label{sec:ipc_sysv}
125
126 Per ovviare ai vari limiti dei meccanismo tradizionale di comunicazione fra
127 processi visto in \secref{sec:ipc_unix}, nello sviluppo di System V vennero
128 introdotti una serie di nuovi oggetti e relative interdacce che garantissero
129 una maggiore flessibilità; in questa sezione esamineremo quello che viene
130 ormai chiamato il \textit{System V Inter-Process Comunication System}, più
131 comunemente noto come \textit{SystemV IPC}.
132  
133
134 \subsection{Code di messaggi}
135 \label{sec:ipc_messque}
136
137 Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di
138 messaggi.
139
140 \subsection{Semafori}
141 \label{sec:ipc_semaph}
142
143 Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori.
144
145
146 \subsection{Memoria condivisa}
147 \label{sec:ipc_shar_mem}
148
149 Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria
150 condivisa.
151
152 %%% Local Variables: 
153 %%% mode: latex
154 %%% TeX-master: "gapil"
155 %%% End: