X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=f742380f1de5a128c6759d1051e09fc497e9c83c;hp=35095a445dd71e487e2f049d3fa23b9fa40f9f0c;hb=9b7af600ff0f73bc946c9d160c320667c7a91347;hpb=88d22f4971adcbdb816c405a1375ae0a8d57bdde diff --git a/ipc.tex b/ipc.tex index 35095a4..f742380 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1844,14 +1844,13 @@ successivo potrebbe ricevere un messaggio non indirizzato a lui. I semafori non sono propriamente meccanismi di intercomunicazione come \textit{pipe}, \textit{fifo} e code di messaggi, poiché non consentono di scambiare dati fra processi, ma servono piuttosto come meccanismi di -sincronizzazione o di protezione per le \index{sezione~critica} -\textsl{sezioni critiche} del codice (si ricordi quanto detto in -sez.~\ref{sec:proc_race_cond}). Un semaforo infatti non è altro che un -contatore mantenuto nel kernel che determina se consentire o meno la -prosecuzione dell'esecuzione di un programma. In questo modo si può -controllare l'accesso ad una risorsa condivisa da più processi, associandovi -un semaforo che assicuri che non possa essere usata da più di un processo alla -volta. +sincronizzazione o di protezione per le \textsl{sezioni critiche} del codice +(si ricordi quanto detto in sez.~\ref{sec:proc_race_cond}). Un semaforo +infatti non è altro che un contatore mantenuto nel kernel che determina se +consentire o meno la prosecuzione dell'esecuzione di un programma. In questo +modo si può controllare l'accesso ad una risorsa condivisa da più processi, +associandovi un semaforo che assicuri che non possa essere usata da più di un +processo alla volta. Il concetto di semaforo è uno dei concetti base nella programmazione ed è assolutamente generico, così come del tutto generali sono modalità con cui lo @@ -2585,12 +2584,12 @@ di gestione del segmento di memoria condivisa in relazione al sistema della memoria virtuale. Il primo dei due flag è \const{SHM\_HUGETLB} che consente di richiedere la -creazione del segmento usando una \itindex{huge~page} \textit{huge page}, le -pagine di memoria di grandi dimensioni introdotte con il kernel 2.6 per -ottimizzare le prestazioni nei sistemi più recenti che hanno grandi quantità -di memoria. L'operazione è privilegiata e richiede che il processo abbia la -\textit{capability} \const{CAP\_IPC\_LOCK}. Questa funzionalità è specifica di -Linux e non è portabile. +creazione del segmento usando una \textit{huge page}, le pagine di memoria di +grandi dimensioni introdotte con il kernel 2.6 per ottimizzare le prestazioni +nei sistemi più recenti che hanno grandi quantità di memoria. L'operazione è +privilegiata e richiede che il processo abbia la \textit{capability} +\const{CAP\_IPC\_LOCK}. Questa funzionalità è specifica di Linux e non è +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} @@ -2772,19 +2771,18 @@ consentono di estendere le funzionalità, ovviamente non devono essere usati se si ha a cuore la portabilità. Questi comandi aggiuntivi sono: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SHM\_LOCK}] Abilita il \itindex{memory~locking} \textit{memory - locking} sul segmento di memoria condivisa, impedendo che la memoria usata - per il segmento venga salvata su disco dal meccanismo della memoria - virtuale. Come illustrato in sez.~\ref{sec:proc_mem_lock} fino al kernel - 2.6.9 solo l'amministratore poteva utilizzare questa capacità,\footnote{che - richiedeva la \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal - dal kernel 2.6.10 anche gli utenti normali possono farlo fino al limite - massimo determinato da \const{RLIMIT\_MEMLOCK} (vedi +\item[\const{SHM\_LOCK}] Abilita il \textit{memory locking} sul segmento di + memoria condivisa, impedendo che la memoria usata per il segmento venga + salvata su disco dal meccanismo della memoria virtuale. Come illustrato in + sez.~\ref{sec:proc_mem_lock} fino al kernel 2.6.9 solo l'amministratore + poteva utilizzare questa capacità,\footnote{che richiedeva la + \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal dal kernel + 2.6.10 anche gli utenti normali possono farlo fino al limite massimo + determinato da \const{RLIMIT\_MEMLOCK} (vedi sez.~\ref{sec:sys_resource_limit}). -\item[\const{SHM\_UNLOCK}] Disabilita il \itindex{memory~locking} - \textit{memory locking} sul segmento di memoria condivisa. Fino al kernel - 2.6.9 solo l'amministratore poteva utilizzare questo comando in - corrispondenza di un segmento da lui bloccato. +\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento + di memoria condivisa. Fino al kernel 2.6.9 solo l'amministratore poteva + utilizzare questo comando in corrispondenza di un segmento da lui bloccato. \end{basedescript} A questi due, come per \func{msgctl} e \func{semctl}, si aggiungono tre @@ -2815,7 +2813,7 @@ il suo prototipo è: } {La funzione ritorna l'indirizzo del segmento in caso di successo e $-1$ (in - un cast a \type{void *}) per un errore, nel qual caso \var{errno} assumerà + un cast a \ctyp{void *}) per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EACCES}] il processo non ha i privilegi per accedere al @@ -2880,12 +2878,12 @@ indirizzo come arrotondamento. 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 \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. +caso un tentativo di scrivere sul segmento comporterà una violazione di +accesso con l'emissione di un 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. Infine \const{SHM\_REMAP} è una estensione specifica di Linux (quindi non portabile) che indica che la mappatura del segmento deve rimpiazzare ogni @@ -3034,10 +3032,10 @@ 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 \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}. +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}. \begin{figure}[!htbp] \footnotesize \centering @@ -3049,11 +3047,11 @@ sorgenti allegati nel file \file{DirMonitor.c}. \label{fig:ipc_dirmonitor_main} \end{figure} -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 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, dopo la sezione, omessa, relativa alla gestione delle opzioni da riga di comando (che si limitano alla eventuale stampa di un messaggio di @@ -3131,11 +3129,11 @@ esse la funzione \func{ComputeValues}, che esegue tutti i calcoli necessari. 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 +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 -\index{variabili!globali} variabile globale \var{shmptr}. +contatori nella memoria condivisa, cui accede grazie alla variabile globale +\var{shmptr}. Dato che la funzione è chiamata da \myfunc{dir\_scan}, si è all'interno del ciclo principale del programma, con un mutex acquisito, perciò non è @@ -4761,12 +4759,11 @@ il semaforo deve essere utilizzato dai \itindex{thread} \textit{thread} di uno stesso processo (con un valore nullo) o condiviso fra processi diversi (con un valore non nullo). -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 \index{variabili!globali} variabile globale o una -variabile allocata dinamicamente nello \itindex{heap} \textit{heap}. +Qualora il semaforo debba essere condiviso dai \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 +\textit{thread}, si dovrà usare cioè una variabile globale o una variabile +allocata dinamicamente nello \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 @@ -4847,9 +4844,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 -\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. +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