Lavoro fatto a Nizza
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 15 Apr 2009 16:13:23 +0000 (16:13 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 15 Apr 2009 16:13:23 +0000 (16:13 +0000)
fileadv.tex
process.tex
system.tex

index 8b9e0b4f02c4c2d6cf2959ae044f0b995d501284..8a9434e8242210abcdfd9342d6f3a402fb1eb099 100644 (file)
@@ -2734,6 +2734,8 @@ mappatura che gi
 
 \itindend{memory~mapping}
 
+% TODO documentare \func{madvise}
+
 \subsection{I/O vettorizzato: \func{readv} e \func{writev}}
 \label{sec:file_multiple_io}
 
index 15dea095766b37b273fb868dc0683e40feed4412..270b78f8c93f0bd5c072468785aded6345c89f64 100644 (file)
@@ -844,6 +844,67 @@ motivi per cui si possono avere di queste necessit
   crittografia richiedono il blocco di alcune pagine di memoria.
 \end{itemize}
 
+Per ottenere informazioni sulle modalità in cui un programma sta usando la
+memoria virtuale è disponibile una apposita funzione, \funcd{mincore}, che
+però non è standardizzata da POSIX e pertanto non è disponibile su tutte le
+versioni di kernel unix-like;\footnote{nel caso di Linux devono essere
+  comunque definite le macro \macro{\_BSD\_SOURCE} e \macro{\_SVID\_SOURCE}.}
+il suo prototipo è:
+\begin{functions}
+  \headdecl{unistd.h} 
+  \headdecl{sys/mman.h} 
+
+  \funcdecl{int mincore(void *addr, size\_t length, unsigned char *vec)}
+  Ritorna lo stato delle pagine di memoria occupate da un processo.
+  
+  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori seguenti:
+  \begin{errlist}
+  \item[\errcode{ENOMEM}] o \param{addr} + \param{lenght} eccede la dimensione
+    della memoria usata dal processo o l'intervallo di indirizzi specificato
+    non è mappato.
+  \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
+    una pagina.
+  \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
+  \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire
+    una risposta.
+  \end{errlist}
+}
+\end{functions}
+
+La funzione permette di ottenere le informazioni sullo stato della mappatura
+della memoria per il processo chiamante, specificando l'intervallo da
+esaminare con l'indirizzo iniziale (indicato con l'argomento \param{addr}) e
+la lunghezza (indicata con l'argomento \param{length}). L'indirizzo iniziale
+deve essere un multiplo delle dimensioni di una pagina, mentre la lunghezza
+può essere qualunque, fintanto che si resta nello spazio di indirizzi del
+processo,\footnote{in caso contrario si avrà un errore di \errcode{ENOMEM};
+  fino al kernel 2.6.11 in questo caso veniva invece restituito
+  \errcode{EINVAL}, in considerazione che il caso più comune in cui si
+  verifica questo errore è quando si usa per sbaglio un valore negativo
+  di \param{length}, che nel caso verrebbe interpretato come un intero
+  positivo di grandi dimensioni.}  ma il risultato verrà comunque fornito per
+l'intervallo compreso fino al multiplo successivo.
+
+I risultati della funzione vengono forniti nel vettore puntato da \param{vec},
+che deve essere allocato preventivamente e deve essere di dimensione
+sufficiente a contenere tanti byte quante sono le pagine contenute
+nell'intervallo di indirizzi specificato.\footnote{la dimensione cioè deve
+  essere almeno pari a \code{(length+PAGE\_SIZE-1)/PAGE\_SIZE}. } Al ritorno
+della funzione il bit meno significativo di ciascun byte del vettore sarà
+acceso se la pagina di memoria corrispondente è al momento residente in
+memoria, o cancellato altrimenti. Il comportamento sugli altri bit è
+indefinito, essendo questi al momento riservati per usi futuri. Per questo
+motivo in genere è comunque opportuno inizializzare a zero il contenuto del
+vettore, così che le pagine attualmente residenti in memoria saranno indicata
+da un valore non nullo del byte corrispondente.
+
+Dato che lo stato della memoria di un processo può cambiare continuamente, il
+risultato di \func{mincore} è assolutamente provvisorio e lo stato delle
+pagine potrebbe essere già cambiato al ritorno stesso della funzione, a meno
+che, come vedremo ora, non si sia attivato il meccanismo che forza il
+mantenimento di una pagina sulla memoria.  
+
 \itindbeg{memory~locking} 
 
 Il meccanismo che previene la \index{paginazione} paginazione di parte della
@@ -884,7 +945,6 @@ standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro
 in byte.\footnote{con Linux questo non avviene e si deve ricorrere alla
   funzione \func{getpagesize}, vedi sez.~\ref{sec:sys_memory_res}.} 
 
-
 A partire dal kernel 2.6.9 anche un processo normale può bloccare la propria
 memoria\footnote{la funzionalità è stata introdotta per non essere costretti a
   dare privilegi eccessivi a programmi di crittografia, che necessitano di
@@ -986,7 +1046,6 @@ ci si scrive sopra.
 
 \itindend{memory~locking}
 
-
 \index{memoria~virtuale|)} 
 
 
@@ -1041,7 +1100,7 @@ liberata con \func{free}, cosa che non 
 implementazioni.
 
 Nessuna delle due funzioni ha una chiara standardizzazione (nessuna delle due
-compare in POSIX.1), ed inoltre ci sono indicazione discordi sui file che ne
+compare in POSIX.1), ed inoltre ci sono indicazioni discordi sui file che ne
 contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in
   \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e
   \acr{lic5} la dichiarano in \texttt{malloc.h}, lo stesso vale per
@@ -1099,13 +1158,8 @@ sia stampato il messaggio d'errore che abortito il programma. In genere 
 opportuno definire la variabile ad un valore diverso da zero che consente di
 rilevare un errore nel momento in cui avviene.
 
-
-
-% TODO: trattare le funzionalità avanzate di \func{malloc}
-
-% TODO documentare \func{madvise}
-% TODO documentare \func{mincore}
-
+% TODO: trattare le altre funzionalità avanzate di \func{malloc}, mallopt,
+% mtrace, muntrace, mcheck, mallinfo e gli hook
 
 
 \section{Argomenti, opzioni ed ambiente di un processo}
@@ -1129,13 +1183,13 @@ manipolare ed utilizzare le variabili di ambiente.
 \subsection{Il formato degli argomenti}
 \label{sec:proc_par_format}
 
-In genere il passaggio degli argomenti al programma viene effettuato dalla
+In genere il passaggio degli argomenti ad un programma viene effettuato dalla
 shell, che si incarica di leggere la linea di comando e di effettuarne la
 scansione (il cosiddetto \textit{parsing}) per individuare le parole che la
 compongono, ciascuna delle quali viene considerata un argomento. Di norma per
-individuare le parole viene usato come carattere di separazione lo spazio o il
-tabulatore, ma il comportamento è modificabile attraverso l'impostazione della
-variabile di ambiente \cmd{IFS}.
+individuare le parole che andranno a costituire la lista degli argomenti viene
+usato come carattere di separazione lo spazio o il tabulatore, ma la cosa
+dipende ovviamente dalle modalità con cui si effettua il lancio.
 
 \begin{figure}[htb]
   \centering
@@ -1145,11 +1199,13 @@ variabile di ambiente \cmd{IFS}.
   \label{fig:proc_argv_argc}
 \end{figure}
 
-Nella scansione viene costruito il vettore di puntatori \param{argv} inserendo
-in successione il puntatore alla stringa costituente l'$n$-simo argomento; la
-variabile \param{argc} viene inizializzata al numero di argomenti trovati, in
-questo modo il primo argomento è sempre il nome del programma; un esempio di
-questo meccanismo è mostrato in fig.~\ref{fig:proc_argv_argc}.
+Indipendentemente da come viene eseguita, il risultato della scansione deve
+essere la costruzione del vettore di puntatori \param{argv} in cui si devono
+inserire in successione i puntatori alle stringhe costituenti i vari
+argomenti, e della variabile \param{argc} che deve essere inizializzata al
+numero di argomenti trovati. Nel caso della shell questo comporta che il primo
+argomento sia sempre il nome del programma; un esempio di questo meccanismo è
+mostrato in fig.~\ref{fig:proc_argv_argc}.
 
 
 \subsection{La gestione delle opzioni}
@@ -1485,9 +1541,7 @@ qualcosa del tipo di ``\texttt{-{}-option-name=parameter}''.
 
 (NdA: questa parte verrà inserita in seguito).
 
-% TODO opzioni in formato esteso 
-
-
+% TODO opzioni in formato esteso
 
 \section{Problematiche di programmazione generica}
 \label{sec:proc_gen_prog}
index 624a5429e00cfcac5c4f54093f51fe3dc20d3760..e77104ef59fa1092726f33493c0d571428dd850f 100644 (file)
@@ -1496,9 +1496,11 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
                               sez.~\ref{sec:sys_cpu_times}) che il processo può
                               usare. Il superamento del limite corrente
                               comporta l'emissione di un segnale di
-                              \const{SIGXCPU} la cui azione predefinita (vedi
+                              \const{SIGXCPU}, la cui azione predefinita (vedi
                               sez.~\ref{sec:sig_classification}) è terminare
-                              il processo. Il superamento del limite massimo
+                              il processo, una volta al secondo fino al
+                              raggiungimento del limite massimo. Il
+                              superamento del limite massimo 
                               comporta l'emissione di un segnale di
                               \const{SIGKILL}.\footnotemark\\
     \const{RLIMIT\_DATA}   &  La massima dimensione del \index{segmento!dati}
@@ -1529,6 +1531,12 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
                               sez.~\ref{sec:ipc_sysv_shm}) che viene
                               contabilizzata separatamente ma sulla quale
                               viene applicato questo stesso limite.\\ 
+% TODO trattare i seguenti...
+%    \const{RLIMIT\_MSGQUEUE}& Il numero massimo di \\
+%    \const{RLIMIT\_NICE}& Il numero massimo di \\
+%    \const{RLIMIT\_RTPRIO}& Il numero massimo di \\
+% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
+% vedi file include/asm-generic/resource.h
     \const{RLIMIT\_NOFILE} &  Il numero massimo di file che il processo può
                               aprire. L'apertura di un ulteriore file farà
                               fallire la funzione (\func{open}, \func{dup} o
@@ -1566,14 +1574,12 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
 \footnotetext[18]{questo è quanto avviene per i kernel dalla serie 2.2 fino ad
   oggi (la 2.6.x); altri kernel possono avere comportamenti diversi per quanto
   avviene quando viene superato il \textit{soft limit}; perciò per avere
-  operazioni portabili è sempre opportuno intercettare \const{SIGXCPU} e
-  terminare in maniera ordinata il processo.}
+  operazioni portabili è sempre opportuno intercettare il primo
+  \const{SIGXCPU} e terminare in maniera ordinata il processo.}
 
 \footnotetext{il limite su questa risorsa è stato introdotto con il kernel
   2.6.8.}
 
-% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
-% vedi file include/asm-generic/resource.h
 
 In generale il superamento di un limite corrente\footnote{di norma quanto
   riportato in tab.~\ref{tab:sys_rlimit_values} fa riferimento a quanto