X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=process.tex;h=6058959bdd6986fb0e9f711ef396db1019148dde;hb=80894586ca62d615c374e26f769d52143bb1ae77;hp=9cf5f869df8143e9cfee78d62a87f1e36db58fa1;hpb=f0cf1e6f39cc8e46cadf4a6cfe1420bd81f088c0;p=gapil.git diff --git a/process.tex b/process.tex index 9cf5f86..6058959 100644 --- a/process.tex +++ b/process.tex @@ -435,7 +435,7 @@ maniera indiretta attraverso dei puntatori. Le funzioni previste dallo standard ANSI C per la gestione della memoria sono quattro, i prototipi sono i seguenti: -\begin{prototypes} +\begin{functions} \headdecl{stdlib.h} \funcdecl{void *calloc(size\_t size)} Alloca \texttt{size} bytes nello heap. La memoria viene inizializzata a 0. @@ -460,36 +460,7 @@ quattro, i prototipi sono i seguenti: Disalloca lo spazio di memoria puntato da \texttt{ptr}. La funzione non ritorna nulla. - -\end{prototypes} -\begin{prototype}{stdlib.h}{void *calloc(size\_t size)} - Alloca \texttt{size} bytes nello heap. La memoria viene inizializzata a 0. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} -\begin{prototype}{stdlib.h}{void *malloc(size\_t size)} - Alloca \texttt{size} bytes nello heap. La memoria non viene inizializzata. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} -\begin{prototype}{stdlib.h}{void free(void *ptr)} - Disalloca lo spazio di memoria puntato da \texttt{ptr}. - - La funzione non ritorna nulla. -\end{prototype} -\begin{prototype}{stdlib.h}{void *realloc(void *ptr, size\_t size)} - Cambia la dimensione del blocco allocato all'indirizzo \texttt{ptr} - portandola a \texttt{size}. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} - +\end{functions} Il puntatore che le funzioni di allocazione ritornano è garantito essere sempre correttamente allineato per tutti i tipi di dati; ad esempio sulle macchine a 32 bit in genere è allineato a multipli di 4 bytes e sulle macchine @@ -672,6 +643,33 @@ si possono avere queste necessit richiedono il blocco di alcune pagine di memoria. \end{itemize} +Il meccanismo che previene la paginazione di parte della memoria virtuale di +un processo è chiamato \textit{memory locking} (blocco della memoria), il +blocco è sempre associato alle pagine della memoria virtuale del processo, non +con il segmento reale di ram su cui essa viene mantenuta. + +La regola è che se un segmento di ram fa da supporto ad almeno una pagina +bloccata allora esso viene escluso dal meccanismo della paginazione. I blocchi +non si accumulano, se si blocca due volte la stessa pagina non è necessario +sbloccarla due volte, una pagina o è bloccata o no. + +Il blocco di memoria persiste fintanto che il processo che lo detiene la +memoria bloccata non la sblocca. Chiaramente la terminazione del processo +comporta anche la fine dell'uso della sua memoria virtuale, e quindi anche di +tutti i blocchi di memoria. + +I memory lock non sono ereditati dai processi figli\footnote{ma siccome Linux + usa il copy on write gli indirizzi virtuali del figlio sono mantenuti sullo + stesso segmento di ram del padre, quindi usufruiscono dei memory lock di + questo}. Siccome la presenza di memory lock ha un impatto sugli altri +processi solo root ha la capacità di bloccare una pagina, ogni processo può +però sbloccare le sue pagine. Il sistema pone dei limiti all'ammontare di +memoria di un processo che può essere bloccata e al totale di memoria fisica +che può dedicare a questo. + + + + \section{Il controllo di flusso non locale} \label{sec:proc_longjmp} @@ -682,8 +680,8 @@ per efficiente, quello dell'uscita in caso di errore. Il C però non consente di effettuare un salto ad una label definita in -un'altra funzione, per cui se l'errore avviene in funzioni profondamente -annidate +un'altra funzione, per cui se l'errore avviene in funzioni profondamente +annidate occorre usare la funzione \func{longjump}. \section{La gestione di parametri e opzioni}