X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=c7af63283aa8f317c9b47ccd05779bfefaf91b3a;hp=bb9e0b06cece8f401be8ca380b54c8c570ef5960;hb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39 diff --git a/ipc.tex b/ipc.tex index bb9e0b0..c7af632 100644 --- a/ipc.tex +++ b/ipc.tex @@ -9,7 +9,7 @@ %% License". %% -\chapter{La comunicazione fra processi} +\chapter{L'intercomunicazione fra processi} \label{cha:IPC} @@ -27,7 +27,7 @@ complessi ed evoluti come le RPC (\textit{Remote Procedure Calls}) e CORBA implementati con un ulteriore livello sopra i meccanismi elementari. -\section{La comunicazione fra processi tradizionale} +\section{L'intercomunicazione fra processi tradizionale} \label{sec:ipc_unix} Il primo meccanismo di comunicazione fra processi introdotto nei sistemi Unix, @@ -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 @@ -114,7 +114,7 @@ essere bloccante (qualora non siano presenti dati), inoltre se si legge da una pipe il cui capo in scrittura è stato chiuso, si avrà la ricezione di un EOF (vale a dire che la funzione \func{read} ritornerà restituendo 0). Se invece si esegue una scrittura su una pipe il cui capo in lettura non è aperto il -processo riceverà il segnale \const{SIGPIPE}, e la funzione di scrittura +processo riceverà il segnale \signal{SIGPIPE}, e la funzione di scrittura restituirà un errore di \errcode{EPIPE} (al ritorno del gestore, o qualora il segnale sia ignorato o bloccato). @@ -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 @@ -707,7 +707,7 @@ complessa e continua ad avere vari inconvenienti\footnote{lo stesso Stevens, che esamina questa architettura in \cite{APUE}, nota come sia impossibile per il server sapere se un client è andato in crash, con la possibilità di far restare le fifo temporanee sul filesystem, di come sia necessario - intercettare \const{SIGPIPE} dato che un client può terminare dopo aver + intercettare \signal{SIGPIPE} dato che un client può terminare dopo aver fatto una richiesta, ma prima che la risposta sia inviata (cosa che nel nostro esempio non è stata fatta).}; in generale infatti l'interfaccia delle fifo non è adatta a risolvere questo tipo di problemi, che possono essere @@ -779,7 +779,7 @@ all'interno di uno stesso processo, ma fra processi distinti (torneremo su questa funzionalità in sez.~\ref{sec:sock_fd_passing}). -\section{Il sistema di comunicazione fra processi di System V} +\section{L'intercomunicazione fra processi di System V} \label{sec:ipc_sysv} Benché le pipe e le fifo siano ancora ampiamente usate, esse scontano il @@ -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 @@ -2609,7 +2608,7 @@ L'uso di \const{SHM\_RDONLY} permette di agganciare il segmento in sola lettura (si ricordi che anche le pagine di memoria hanno dei permessi), in tal caso un tentativo di scrivere sul segmento comporterà una \itindex{segment~violation} violazione di accesso con l'emissione di un -segnale di \const{SIGSEGV}. Il comportamento usuale di \func{shmat} è quello +segnale di \signal{SIGSEGV}. Il comportamento usuale di \func{shmat} è quello di agganciare il segmento con l'accesso in lettura e scrittura (ed il processo deve aver questi permessi in \var{shm\_perm}), non è prevista la possibilità di agganciare un segmento in sola scrittura. @@ -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 @@ -2750,14 +2749,14 @@ ricavare la parte di informazione che interessa. In fig.~\ref{fig:ipc_dirmonitor_main} si è riportata la sezione principale del corpo del programma server, insieme alle definizioni delle altre funzioni -usate nel programma e delle variabili globali, omettendo tutto quello che -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}. +usate nel programma e delle \index{variabili!globali} variabili globali, +omettendo tutto quello che 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 @@ -2765,11 +2764,11 @@ video; al solito il codice completo si trova con i sorgenti allegati nel file \label{fig:ipc_dirmonitor_main} \end{figure} -Il programma usa delle variabili globali (\texttt{\small 2--14}) per mantenere -i valori relativi agli oggetti usati per la comunicazione inter-processo; si è -definita inoltre una apposita struttura \struct{DirProp} che contiene i dati -relativi alle proprietà che si vogliono mantenere nella memoria condivisa, per -l'accesso da parte dei client. +Il programma usa delle \index{variabili!globali} variabili globali +(\texttt{\small 2--14}) per mantenere i valori relativi agli oggetti usati per +la comunicazione inter-processo; si è definita inoltre una apposita struttura +\struct{DirProp} che contiene i dati relativi alle proprietà che si vogliono +mantenere nella memoria condivisa, per l'accesso da parte dei client. Il programma, dopo la sezione, omessa, relativa alla gestione delle opzioni da riga di comando (che si limitano alla eventuale stampa di un messaggio di @@ -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 @@ -2847,8 +2846,8 @@ Il codice di quest'ultima è riportato in fig.~\ref{fig:ipc_dirmonitor_sub}. Come si vede la funzione (\texttt{\small 2--16}) è molto semplice e si limita a chiamare (\texttt{\small 5}) la funzione \func{stat} sul file indicato da ciascuna voce, per ottenerne i dati, che poi utilizza per incrementare i vari -contatori nella memoria condivisa, cui accede grazie alla variabile globale -\var{shmptr}. +contatori nella memoria condivisa, cui accede grazie alla +\index{variabili!globali} variabile globale \var{shmptr}. Dato che la funzione è chiamata da \func{DirScan}, si è all'interno del ciclo principale del programma, con un mutex acquisito, perciò non è necessario @@ -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 @@ -2959,7 +2958,7 @@ Totale 72 file, per 489887 byte %$ A questo punto possiamo far uscire il server inviandogli un segnale di -\const{SIGTERM} con il comando \code{killall dirmonitor}, a questo punto +\signal{SIGTERM} con il comando \code{killall dirmonitor}, a questo punto ripetendo la lettura, otterremo un errore: \begin{Verbatim} [piccardi@gont sources]$ ./readmon @@ -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 @@ -3028,6 +3027,12 @@ combinato della memoria condivisa e dei meccanismi di sincronizzazione, per cui alla fine l'uso delle code di messaggi classiche è relativamente poco diffuso. +% TODO: trattare qui, se non ssis trova posto migliore, copy_from_process e +% copy_to_process, introdotte con il kernel 3.2. Vedi +% http://lwn.net/Articles/405346/ e +% http://ozlabs.org/~cyeoh/cma/process_vm_readv.txt + + \subsection{I \textsl{file di lock}} \label{sec:ipc_file_lock} @@ -3065,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 @@ -3129,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 @@ -3249,7 +3254,7 @@ sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete. % TODO fare esempio di mmap anonima -\section{Il sistema di comunicazione fra processi di POSIX} +\section{L'intercomunicazione fra processi di POSIX} \label{sec:ipc_posix} Per superare i numerosi problemi del \textit{SysV IPC}, evidenziati per i suoi @@ -3264,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. @@ -3342,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 @@ -3448,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 @@ -3786,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} @@ -3897,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 @@ -3961,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 @@ -3971,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. @@ -4309,8 +4314,8 @@ Qualora il semaforo debba essere condiviso dai \itindex{thread} \textit{thread} di uno stesso processo (nel qual caso si parla di \textit{thread-shared semaphore}), occorrerà che \param{sem} sia l'indirizzo di una variabile visibile da tutti i \itindex{thread} \textit{thread}, si -dovrà usare cioè una variabile globale o una variabile allocata dinamicamente -nello \itindex{heap} \textit{heap}. +dovrà usare cioè una \index{variabili!globali} variabile globale o una +variabile allocata dinamicamente nello \itindex{heap} \textit{heap}. Qualora il semaforo debba essere condiviso fra più processi (nel qual caso si parla di \textit{process-shared semaphore}) la sola scelta possibile per @@ -4365,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 @@ -4392,9 +4397,9 @@ dall'altro programma prima di averla finita di stampare. La parte iniziale del programma contiene le definizioni (\texttt{\small 1--8}) del gestore del segnale usato per liberare le risorse utilizzate, delle -variabili globali contenenti i nomi di default del segmento di memoria -condivisa e del semaforo (il default scelto è \texttt{messages}), e delle -altre variabili utilizzate dal programma. +\index{variabili!globali} variabili globali contenenti i nomi di default del +segmento di memoria condivisa e del semaforo (il default scelto è +\texttt{messages}), e delle altre variabili utilizzate dal programma. Come prima istruzione (\texttt{\small 10}) si è provveduto ad installare un gestore di segnale che consentirà di effettuare le operazioni di pulizia @@ -4438,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 @@ -4458,16 +4463,16 @@ ciclo. Per uscire in maniera corretta dal programma sarà necessario interromperlo con il break da tastiera (\texttt{C-c}), che corrisponde all'invio del segnale -\const{SIGINT}, per il quale si è installato (\texttt{\small 10}) una +\signal{SIGINT}, per il quale si è installato (\texttt{\small 10}) una opportuna funzione di gestione, riportata in fig.~\ref{fig:ipc_posix_sem_shm_message_server_handler}. La funzione è molto 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