From 82ce0a191503219a9b0ca2eca17a5242dae2954f Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 15 Apr 2009 16:13:23 +0000 Subject: [PATCH] Lavoro fatto a Nizza --- fileadv.tex | 2 ++ process.tex | 98 +++++++++++++++++++++++++++++++++++++++++------------ system.tex | 18 ++++++---- 3 files changed, 90 insertions(+), 28 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 8b9e0b4..8a9434e 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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} diff --git a/process.tex b/process.tex index 15dea09..270b78f 100644 --- a/process.tex +++ b/process.tex @@ -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} diff --git a/system.tex b/system.tex index 624a542..e77104e 100644 --- a/system.tex +++ b/system.tex @@ -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 -- 2.30.2