X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=092d40fdc6bc27f655f8a1b35802a49ac7399613;hp=f742380f1de5a128c6759d1051e09fc497e9c83c;hb=7b43a7843d483c826a6ed13224208c615a23c4d6;hpb=9b7af600ff0f73bc946c9d160c320667c7a91347 diff --git a/ipc.tex b/ipc.tex index f742380..092d40f 100644 --- a/ipc.tex +++ b/ipc.tex @@ -228,14 +228,14 @@ direzione del flusso dei dati è data dalle frecce continue. Si potrebbe obiettare che sarebbe molto più semplice salvare il risultato intermedio su un file temporaneo. Questo però non tiene conto del fatto che un \textit{CGI} può essere eseguito più volte in contemporanea, e si avrebbe una -evidente \itindex{race~condition} \textit{race condition} in caso di accesso -simultaneo a detto file da istanze diverse. Il problema potrebbe essere -superato utilizzando un sempre diverso per il file temporaneo, che verrebbe -creato all'avvio di ogni istanza, utilizzato dai sottoprocessi, e cancellato -alla fine della sua esecuzione; ma a questo punto le cose non sarebbero più -tanto semplici. L'uso di una \textit{pipe} invece permette di risolvere il -problema in maniera semplice ed elegante, oltre ad essere molto più -efficiente, dato che non si deve scrivere su disco. +evidente \textit{race condition} in caso di accesso simultaneo a detto file da +istanze diverse. Il problema potrebbe essere superato utilizzando un sempre +diverso per il file temporaneo, che verrebbe creato all'avvio di ogni istanza, +utilizzato dai sottoprocessi, e cancellato alla fine della sua esecuzione; ma +a questo punto le cose non sarebbero più tanto semplici. L'uso di una +\textit{pipe} invece permette di risolvere il problema in maniera semplice ed +elegante, oltre ad essere molto più efficiente, dato che non si deve scrivere +su disco. Il programma ci servirà anche come esempio dell'uso delle funzioni di duplicazione dei file descriptor che abbiamo trattato in @@ -2594,10 +2594,10 @@ portabile. Il secondo flag aggiuntivo, introdotto a partire dal kernel 2.6.15, è \const{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE} di \func{mmap} (vedi sez.~\ref{sec:file_memory_map}): non vengono riservate -delle pagine di swap ad uso del meccanismo del \textit{copy on write} -\itindex{copy~on~write} per mantenere le modifiche fatte sul segmento. Questo -significa che caso di scrittura sul segmento quando non c'è più memoria -disponibile, si avrà l'emissione di un \signal{SIGSEGV}. +delle pagine di swap ad uso del meccanismo del \textit{copy on write} per +mantenere le modifiche fatte sul segmento. Questo significa che caso di +scrittura sul segmento quando non c'è più memoria disponibile, si avrà +l'emissione di un \signal{SIGSEGV}. Infine l'argomento \param{size} specifica la dimensione del segmento di memoria condivisa; il valore deve essere specificato in byte, ma verrà @@ -3341,12 +3341,12 @@ directory, \file{/var/lock}, nella standardizzazione del \textit{Filesystem prevede\footnote{questo è quanto dettato dallo standard POSIX.1, ciò non toglie che in alcune implementazioni questa tecnica possa non funzionare; in particolare per Linux, nel caso di NFS, si è comunque soggetti alla - possibilità di una \itindex{race~condition} \textit{race condition}.} che -essa ritorni un errore quando usata con i flag di \const{O\_CREAT} e -\const{O\_EXCL}. In tal modo la creazione di un \textsl{file di lock} può -essere eseguita atomicamente, il processo che crea il file con successo si può -considerare come titolare del lock (e della risorsa ad esso associata) mentre -il rilascio si può eseguire con una chiamata ad \func{unlink}. + possibilità di una \textit{race condition}.} che essa ritorni un errore +quando usata con i flag di \const{O\_CREAT} e \const{O\_EXCL}. In tal modo la +creazione di un \textsl{file di lock} può essere eseguita atomicamente, il +processo che crea il file con successo si può considerare come titolare del +lock (e della risorsa ad esso associata) mentre il rilascio si può eseguire +con una chiamata ad \func{unlink}. Un esempio dell'uso di questa funzione è mostrato dalle funzioni \func{LockFile} ed \func{UnlockFile} riportate in fig.~\ref{fig:ipc_file_lock} @@ -4145,12 +4145,12 @@ che se si vuole mantenere il meccanismo di notifica occorre ripetere la registrazione chiamando nuovamente \func{mq\_notify} all'interno del gestore del segnale di notifica. A differenza della situazione simile che si aveva con i segnali non affidabili (l'argomento è stato affrontato in -\ref{sec:sig_semantics}) questa caratteristica non configura una -\itindex{race~condition} \textit{race condition} perché l'invio di un segnale -avviene solo se la coda è vuota; pertanto se si vuole evitare di correre il -rischio di perdere eventuali ulteriori segnali inviati nel lasso di tempo che -occorre per ripetere la richiesta di notifica basta avere cura di eseguire -questa operazione prima di estrarre i messaggi presenti dalla coda. +\ref{sec:sig_semantics}) questa caratteristica non configura una \textit{race + condition} perché l'invio di un segnale avviene solo se la coda è vuota; +pertanto se si vuole evitare di correre il rischio di perdere eventuali +ulteriori segnali inviati nel lasso di tempo che occorre per ripetere la +richiesta di notifica basta avere cura di eseguire questa operazione prima di +estrarre i messaggi presenti dalla coda. L'invio del segnale di notifica avvalora alcuni campi di informazione restituiti al gestore attraverso la struttura \struct{siginfo\_t} (definita in @@ -4875,12 +4875,12 @@ notazione ottale). Infine il semaforo verrà inizializzato ad un valore nullo A questo punto (\texttt{\small 22}) si potrà inizializzare il messaggio posto nel segmento di memoria condivisa usando la stringa passata come argomento al programma. Essendo il semaforo stato creato già bloccato non ci si dovrà -preoccupare di eventuali \itindex{race~condition} \textit{race condition} -qualora il programma di modifica del messaggio venisse lanciato proprio in -questo momento. Una volta inizializzato il messaggio occorrerà però -rilasciare il semaforo (\texttt{\small 24-27}) per consentirne l'uso; in -tutte queste operazioni si provvederà ad uscire dal programma con un opportuno -messaggio in caso di errore. +preoccupare di eventuali \textit{race condition} qualora il programma di +modifica del messaggio venisse lanciato proprio in questo momento. Una volta +inizializzato il messaggio occorrerà però rilasciare il semaforo +(\texttt{\small 24-27}) per consentirne l'uso; in tutte queste operazioni si +provvederà ad uscire dal programma con un opportuno messaggio in caso di +errore. Una volta completate le inizializzazioni il ciclo principale del programma (\texttt{\small 29-47}) viene ripetuto indefinitamente (\texttt{\small 29}) @@ -4951,8 +4951,8 @@ argomento. Una volta completate con successo le precedenti inizializzazioni, il passo seguente (\texttt{\small 21-24}) è quello di acquisire il semaforo, dopo di che sarà possibile eseguire la sostituzione del messaggio (\texttt{\small 25}) -senza incorrere in possibili \itindex{race~condition} \textit{race condition} -con la stampa dello stesso da parte di \file{message\_getter}. +senza incorrere in possibili \textit{race condition} con la stampa dello +stesso da parte di \file{message\_getter}. Una volta effettuata la modifica viene stampato (\texttt{\small 26}) il tempo di attesa impostato con l'opzione ``\texttt{-t}'' dopo di che (\texttt{\small