X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=cb30002d1525f2a3e83f798b88eb76bc3625c4b3;hp=25f0f301bedd7480c59dbddf8faed23d3885171a;hb=4e1da5b259a86278710be32441de7b88b9287ec1;hpb=8a9eb0b97e2e52a5774b5aca4b20bd7cf29759ee diff --git a/ipc.tex b/ipc.tex index 25f0f30..cb30002 100644 --- a/ipc.tex +++ b/ipc.tex @@ -74,7 +74,7 @@ illustrato in fig.~\ref{fig:ipc_pipe_singular}, in cui sono illustrati i due capi della pipe, associati a ciascun file descriptor, con le frecce che indicano la direzione del flusso dei dati. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[height=5cm]{img/pipe} \caption{Schema della struttura di una pipe.} @@ -90,7 +90,7 @@ compresi quelli associati ad una pipe (secondo la situazione illustrata in fig.~\ref{fig:ipc_pipe_fork}). In questo modo se uno dei processi scrive su un capo della pipe, l'altro può leggere. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[height=5cm]{img/pipefork} \caption{Schema dei collegamenti ad una pipe, condivisi fra processo padre e @@ -159,7 +159,7 @@ JPEG. Usando una pipe potremo inviare l'output del primo sull'input del secondo, secondo lo schema mostrato in fig.~\ref{fig:ipc_pipe_use}, in cui la direzione del flusso dei dati è data dalle frecce continue. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[height=5cm]{img/pipeuse} \caption{Schema dell'uso di una pipe come mezzo di comunicazione fra @@ -190,9 +190,9 @@ fig.~\ref{fig:ipc_barcodepage_code} abbiamo riportato il corpo del programma, il cui codice completo è disponibile nel file \file{BarCodePage.c} che si trova nella directory dei sorgenti. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/BarCodePage.c} \end{minipage} \normalsize @@ -375,9 +375,9 @@ per primo, si bloccherà in attesa di ricevere sullo standard input il risultato dell'elaborazione del precedente, benché quest'ultimo venga invocato dopo. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/BarCode.c} \end{minipage} \normalsize @@ -496,7 +496,7 @@ illustrata in fig.~\ref{fig:ipc_fifo_server_arch} in cui i client inviano le richieste al server su una fifo nota mentre le risposte vengono reinviate dal server a ciascuno di essi su una fifo temporanea creata per l'occasione. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[height=9cm]{img/fifoserver} \caption{Schema dell'utilizzo delle fifo nella realizzazione di una @@ -516,9 +516,9 @@ ed \var{n}, che indica il numero di frasi tenute in memoria, ad un valore diverso da quelli preimpostati. Il codice completo è nel file \file{FortuneServer.c}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/FortuneServer.c} \end{minipage} \normalsize @@ -607,9 +607,9 @@ stampa a video le informazioni di utilizzo ed esce, riportando solo la sezione principale del programma e le definizioni delle variabili. Il codice completo è nel file \file{FortuneClient.c} dei sorgenti allegati. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/FortuneClient.c} \end{minipage} \normalsize @@ -839,7 +839,7 @@ mantiene varie proprietà ed informazioni associate all'oggetto. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/ipc_perm.h} \end{minipage} \normalsize @@ -886,8 +886,8 @@ che deve specificare il \itindex{pathname} \textit{pathname} di un file effettivamente esistente e di un numero di progetto \param{proj\_id)}, che di norma viene specificato come carattere, dato che ne vengono utilizzati solo gli 8 bit meno significativi.\footnote{nelle libc4 e libc5, come avviene in - SunOS, l'argomento \param{proj\_id} è dichiarato tipo \ctyp{char}, le - \acr{glibc} usano il prototipo specificato da XPG4, ma vengono lo stesso + SunOS, l'argomento \param{proj\_id} è dichiarato tipo \ctyp{char}, la + \acr{glibc} usa il prototipo specificato da XPG4, ma vengono lo stesso utilizzati gli 8 bit meno significativi.} Il problema è che anche così non c'è la sicurezza che il valore della chiave @@ -1036,9 +1036,9 @@ di quel tipo,\footnote{questo vale fino ai kernel della serie 2.2.x, dalla valore è 32768.} si evita così il riutilizzo degli stessi numeri, e si fa sì che l'identificatore assuma tutti i valori possibili. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/IPCTestId.c} \end{minipage} \normalsize @@ -1186,7 +1186,7 @@ file \procrelfile{/proc/sys/kernel}{msgmax}, \procrelfile{/proc/sys/kernel}{msgmnb} e \procrelfile{/proc/sys/kernel}{msgmni} di \file{/proc/sys/kernel/}. -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=13cm]{img/mqstruct} \caption{Schema della struttura di una coda messaggi.} \label{fig:ipc_mq_schema} @@ -1213,7 +1213,7 @@ cui queste strutture vengono mantenute dal kernel.\footnote{lo schema \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/msqid_ds.h} \end{minipage} \normalsize @@ -1377,7 +1377,7 @@ dovrà essere pari a \const{LENGTH}). \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/msgbuf.h} \end{minipage} \normalsize @@ -1531,9 +1531,9 @@ server di \textit{fortunes} usando queste al posto delle fifo. In questo caso useremo una sola coda di messaggi, usando il tipo di messaggio per comunicare in maniera indipendente con client diversi. -\begin{figure}[!bht] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/MQFortuneServer.c} \end{minipage} \normalsize @@ -1605,9 +1605,9 @@ parte di un segnale; in tal caso verrà eseguito (\texttt{\small 45--48}) il gestore \code{HandSIGTERM}, che semplicemente si limita a cancellare la coda (\texttt{\small 46}) ed ad uscire (\texttt{\small 47}). -\begin{figure}[!bht] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/MQFortuneClient.c} \end{minipage} \normalsize @@ -1796,7 +1796,7 @@ semaforo all'uscita del processo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/semid_ds.h} \end{minipage} \normalsize @@ -1838,7 +1838,7 @@ funzioni di controllo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sem.h} \end{minipage} \normalsize @@ -1928,7 +1928,7 @@ specificata con \param{cmd}, ed opera o sull'intero insieme specificato da \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/semun.h} \end{minipage} \normalsize @@ -2074,7 +2074,7 @@ effettivamente eseguite se e soltanto se è possibile effettuarle tutte quante. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sembuf.h} \end{minipage} \normalsize @@ -2183,7 +2183,7 @@ struttura del \textit{SysV IPC} è stata modificata, ma le definizioni relative a queste strutture restano per compatibilità.\footnote{in particolare con le vecchie versioni delle librerie del C, come le libc5.} -\begin{figure}[htb] +\begin{figure}[!htb] \centering \includegraphics[width=13cm]{img/semtruct} \caption{Schema della struttura di un insieme di semafori.} \label{fig:ipc_sem_schema} @@ -2250,9 +2250,9 @@ creare un insieme contenente un singolo semaforo, per il quale poi useremo un valore unitario per segnalare la disponibilità della risorsa, ed un valore nullo per segnalarne l'indisponibilità. -\begin{figure}[!bht] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/Mutex.c} \end{minipage} \normalsize @@ -2380,7 +2380,7 @@ norma, significa insieme a dei semafori. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/shmid_ds.h} \end{minipage} \normalsize @@ -2567,9 +2567,8 @@ particolare l'indirizzo finale del segmento dati (quello impostato da Si tenga presente infine che la funzione ha successo anche se il segmento è stato marcato per la cancellazione. -\begin{figure}[htb] - \centering - \includegraphics[height=10cm]{img/sh_memory_layout} +\begin{figure}[!htb] + \centering \includegraphics[height=10cm]{img/sh_memory_layout} \caption{Disposizione dei segmenti di memoria di un processo quando si è agganciato un segmento di memoria condivisa.} \label{fig:ipc_shmem_layout} @@ -2578,7 +2577,7 @@ stato marcato per la cancellazione. L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{lo standard SVID prevede che l'argomento \param{shmaddr} sia di tipo \ctyp{char *}, così come il valore di ritorno della funzione; in Linux è stato così con le - \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il tipo di + \acr{libc4} e le \acr{libc5}, con il passaggio alla \acr{glibc} il tipo di \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di ritorno un \ctyp{void *}.} deve essere associato il segmento, se il valore specificato è \val{NULL} è il sistema a scegliere opportunamente un'area di @@ -2668,9 +2667,9 @@ In caso di successo la funzione aggiorna anche i seguenti campi di inoltre la regione di indirizzi usata per il segmento di memoria condivisa viene tolta dallo spazio di indirizzi del processo. -\begin{figure}[!bht] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/SharedMem.c} \end{minipage} \normalsize @@ -2755,9 +2754,9 @@ riguarda la gestione delle opzioni e la stampa delle istruzioni di uso a video; al solito il codice completo si trova con i sorgenti allegati nel file \file{DirMonitor.c}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/DirMonitor.c} \end{minipage} \normalsize @@ -2809,9 +2808,9 @@ sarà vista nella forma data da \struct{DirProp}. Infine (\texttt{\small di interfaccia già descritte in sez.~\ref{sec:ipc_sysv_sem}, anche un mutex, che utilizzeremo per regolare l'accesso alla memoria condivisa. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ComputeValues.c} \end{minipage} \normalsize @@ -2869,9 +2868,9 @@ i dati, dopo di che (\texttt{\small 20}) distacca e rimuove il segmento di memoria condivisa usando \func{ShmRemove}. Infine (\texttt{\small 21}) rimuove il mutex con \func{MutexRemove} ed esce (\texttt{\small 22}). -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6 cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ReadMonitor.c} \end{minipage} \normalsize @@ -2987,7 +2986,7 @@ key msqid owner perms used-bytes messages %% condivisa; uno schema semplificato della struttura è illustrato in %% fig.~\ref{fig:ipc_shm_struct}. -%% \begin{figure}[htb] +%% \begin{figure}[!htb] %% \centering %% \includegraphics[width=10cm]{img/shmstruct} %% \caption{Schema dell'implementazione dei segmenti di memoria condivisa in @@ -3071,9 +3070,9 @@ guida) che permettono rispettivamente di creare e rimuovere un \textsl{file di 9}) nella modalità descritta, mentre la seconda (\texttt{\small 11--17}) lo cancella con \func{unlink}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/LockFile.c} \end{minipage} \normalsize @@ -3135,9 +3134,9 @@ non consuma risorse permanentemente allocate nel sistema. Lo svantaggio è che, dovendo fare ricorso a delle operazioni sul filesystem, esso è in genere leggermente più lento. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/MutexLocking.c} \end{minipage} \normalsize @@ -3270,7 +3269,7 @@ una interfaccia completamente nuova, che tratteremo in questa sezione. Oggi Linux supporta tutti gli oggetti definito nello standard POSIX per l'IPC, ma a lungo non è stato così; la memoria condivisa è presente a partire dal -kernel 2.4.x, i semafori sono forniti dalle \acr{glibc} nella sezione che +kernel 2.4.x, i semafori sono forniti dalla \acr{glibc} nella sezione che implementa i \itindex{thread} \textit{thread} POSIX di nuova generazione che richiedono il kernel 2.6, le code di messaggi sono supportate a partire dal kernel 2.6.6. @@ -3348,7 +3347,7 @@ relativi patch) occorre utilizzare la libreria \file{libmqueue}\footnote{i programmi che usano le code di messaggi cioè devono essere compilati aggiungendo l'opzione \code{-lmqueue} al comando \cmd{gcc}; in corrispondenza all'inclusione del supporto nel kernel ufficiale anche - \file{libmqueue} è stata inserita nelle \acr{glibc}, a partire dalla + \file{libmqueue} è stata inserita nella \acr{glibc}, a partire dalla versione 2.3.4 delle medesime.} che contiene le funzioni dell'interfaccia POSIX.\footnote{in realtà l'implementazione è realizzata tramite delle opportune chiamate ad \func{ioctl} sui file del filesystem speciale su cui @@ -3454,7 +3453,7 @@ cui definizione è riportata in fig.~\ref{fig:ipc_mq_attr}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/mq_attr.h} \end{minipage} \normalsize @@ -3792,9 +3791,9 @@ il filesystem \texttt{tmpfs}, uno speciale filesystem che mantiene tutti i suoi contenuti in memoria, che viene attivato abilitando l'opzione \texttt{CONFIG\_TMPFS} in fase di compilazione del kernel. -Per potere utilizzare l'interfaccia POSIX per la memoria condivisa le -\acr{glibc}\footnote{le funzioni sono state introdotte con le glibc-2.2.} -richiedono di compilare i programmi con l'opzione \code{-lrt}; inoltre è +Per potere utilizzare l'interfaccia POSIX per la memoria condivisa la +\acr{glibc}\footnote{le funzioni sono state introdotte con la versione 2.2.} +richiede di compilare i programmi con l'opzione \code{-lrt}; inoltre è necessario che in \file{/dev/shm} sia montato un filesystem \texttt{tmpfs}; questo di norma viene fatto aggiungendo una riga del tipo di: \begin{verbatim} @@ -3903,9 +3902,9 @@ con lo stesso nome, la chiamata a \func{shm\_open} fallirà, a meno di non aver usato \const{O\_CREAT}, in quest'ultimo caso comunque si otterrà un file descriptor che fa riferimento ad un segmento distinto da eventuali precedenti. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/MemShared.c} \end{minipage} \normalsize @@ -3967,7 +3966,7 @@ dei semafori POSIX che li realizzava solo a livello di \itindex{thread} erano visibili solo all'interno dei \itindex{thread} \textit{thread} creati da un singolo processo, e non potevano essere usati come meccanismo di sincronizzazione fra processi diversi.} fornita attraverso la sezione delle -estensioni \textit{real-time} delle \acr{glibc}.\footnote{quelle che si +estensioni \textit{real-time} della \acr{glibc}.\footnote{quelle che si accedono collegandosi alla libreria \texttt{librt}.} Esisteva inoltre una libreria che realizzava (parzialmente) l'interfaccia POSIX usando le funzioni dei semafori di SysV IPC (mantenendo così tutti i problemi sottolineati in @@ -3977,7 +3976,7 @@ A partire dal kernel 2.5.7 è stato introdotto un meccanismo di sincronizzazione completamente nuovo, basato sui cosiddetti \textit{futex},\footnote{la sigla sta per \textit{fast user mode mutex}.} con il quale è stato possibile implementare una versione nativa dei semafori -POSIX. Grazie a questo con i kernel della serie 2.6 e le nuove versioni delle +POSIX. Grazie a questo con i kernel della serie 2.6 e le nuove versioni della \acr{glibc} che usano questa nuova infrastruttura per quella che viene quella che viene chiamata \textit{New Posix Thread Library}, sono state implementate anche tutte le funzioni dell'interfaccia dei semafori POSIX. @@ -4371,9 +4370,9 @@ scritti due semplici programmi con i quali è possibile rispettivamente monitorare il contenuto di un segmento di memoria condivisa e modificarne il contenuto. -\begin{figure}[!h] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/message_getter.c} \end{minipage} \normalsize @@ -4444,9 +4443,9 @@ controllo. Il primo passo (\texttt{\small 30--34}) è quello di acquisire (con semaforo ad inizio del ciclo; seguito (\texttt{\small 35--36}) dal tempo corrente. -\begin{figure}[!h] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/HandSigInt.c} \end{minipage} \normalsize @@ -4471,9 +4470,9 @@ semplice e richiama le funzioni di rimozione sia per il segmento di memoria condivisa che per il semaforo, garantendo così che possa essere riaperto ex-novo senza errori in un futuro riutilizzo del comando. -\begin{figure}[!h] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/message_setter.c} \end{minipage} \normalsize