X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=3069d292982dddf97840eb29484c09a5d403ca41;hp=d708c2eacf895761bd872e5069c3f15866a6b0a8;hb=0345bbfd866e46d3c76d0df7f37a83f9a3924926;hpb=d88ea986fbf6b84a802fd8a5665af4324a6c89b3 diff --git a/process.tex b/process.tex index d708c2e..3069d29 100644 --- a/process.tex +++ b/process.tex @@ -467,20 +467,20 @@ prototipi sono i seguenti: La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \const{ENOMEM}. + \var{errno} assumerà il valore \errval{ENOMEM}. \funcdecl{void *malloc(size\_t size)} Alloca \var{size} byte nello heap. La memoria non viene inizializzata. La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \const{ENOMEM}. + \var{errno} assumerà il valore \errval{ENOMEM}. \funcdecl{void *realloc(void *ptr, size\_t size)} Cambia la dimensione del blocco allocato all'indirizzo \var{ptr} portandola a \var{size}. La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \const{ENOMEM}. + \var{errno} assumerà il valore \errval{ENOMEM}. \funcdecl{void free(void *ptr)} Disalloca lo spazio di memoria puntato da \var{ptr}. @@ -627,7 +627,7 @@ stack della funzione corrente. La sintassi La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \const{ENOMEM}. + \var{errno} assumerà il valore \errval{ENOMEM}. \end{prototype} \noindent ma in questo caso non è più necessario liberare la memoria (e quindi non esiste un analogo della \func{free}) in quanto essa viene rilasciata @@ -679,7 +679,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono: \var{end\_data\_segment}. La funzione restituisce 0 in caso di successo e -1 in caso di - fallimento, nel qual caso \var{errno} assumerà il valore \const{ENOMEM}. + fallimento, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}. \funcdecl{void *sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un programma di \var{increment}. Un valore zero restituisce l'attuale posizione @@ -687,7 +687,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono: La funzione restituisce il puntatore all'inizio della nuova zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual - caso \var{errno} assumerà il valore \const{ENOMEM}. + caso \var{errno} assumerà il valore \errval{ENOMEM}. \end{functions} \noindent in genere si usa \func{sbrk} con un valore zero per ottenere l'attuale posizione della fine del segmento dati. @@ -754,20 +754,22 @@ sbloccarla due volte, una pagina o Il \textit{memory lock} persiste fintanto che il processo che 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 suoi \textit{memory lock}. - -I \textit{memory lock} non sono ereditati dai processi figli.\footnote{ma - siccome Linux usa il \textit{copy on write}\index{copy on write} (vedi - \secref{sec:proc_fork}) gli indirizzi virtuali del figlio sono mantenuti - sullo stesso segmento di RAM del padre, quindi fintanto che un figlio non - scrive su un segmento, può usufruire del memory lock del padre.} Siccome la -presenza di un \textit{memory lock} riduce la memoria disponibile al sistema, -con un impatto su tutti gli altri processi, solo l'amministratore ha la -capacità di bloccare una pagina. Ogni processo può però sbloccare le pagine +tutti i suoi \textit{memory lock}. Infine \textit{memory lock} non sono +ereditati dai processi figli.\footnote{ma siccome Linux usa il \textit{copy on + write}\index{copy on write} (vedi \secref{sec:proc_fork}) gli indirizzi + virtuali del figlio sono mantenuti sullo stesso segmento di RAM del padre, + quindi fintanto che un figlio non scrive su un segmento, può usufruire del + memory lock del padre.} + +Siccome la richiesta di un \textit{memory lock} da parte di un processo riduce +la memoria fisica disponibile nel sistema, questo ha un evidente impatto su +tutti gli altri processi, per cui solo un processo con i privilegi di +amministratore (vedremo in \secref{sec:proc_perms} cosa significa) ha la +capacità di bloccare una pagina. Ogni processo può però sbloccare le pagine relative alla propria memoria. 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, lo +essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il \textit{memory locking} e la costante \const{PAGESIZE} in \file{limits.h} per @@ -796,7 +798,7 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono il numero massimo consentito di pagine bloccate. \item[\errcode{EINVAL}] \var{len} non è un valore positivo. \end{errlist} - e, per \func{mlock}, anche \const{EPERM} quando il processo non ha i + e, per \func{mlock}, anche \errval{EPERM} quando il processo non ha i privilegi richiesti per l'operazione.} \end{functions} @@ -1062,16 +1064,21 @@ pi \end{figure} Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo -\textsl{\texttt{nome=valore}}. Inoltre alcune variabili, come quelle elencate +\textsl{\texttt{nome=valore}}. Inoltre alcune variabili, come quelle elencate in \figref{fig:proc_envirno_list}, sono definite dal sistema per essere usate da diversi programmi e funzioni: per queste c'è l'ulteriore convenzione di -usare nomi espressi in caratteri maiuscoli. +usare nomi espressi in caratteri maiuscoli.\footnote{la convenzione vuole che + si usino dei nomi maiuscoli per le variabili di ambiente di uso generico, i + nomi minuscoli sono in genere riservati alle variabili interne degli script + di shell.} Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è riservata alle applicazioni e ad alcune funzioni di libreria; in genere esse costituiscono un modo comodo per definire un comportamento specifico senza dover ricorrere all'uso di opzioni a linea di comando o di file di -configurazione. +configurazione. É di norma cura della shell, quando esegue un comando, passare +queste variabili al programma messo in esecuzione attraverso un uso opportuno +delle relative chiamate (si veda \secref{sec:proc_exec}). La shell ad esempio ne usa molte per il suo funzionamento (come \var{PATH} per la ricerca dei comandi, o \cmd{IFS} per la scansione degli argomenti), e @@ -1102,24 +1109,27 @@ controllare \cmd{man environ}. Directory base dell'utente\\ \val{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\ \val{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory - dei programmi\\ + dei programmi\\ \val{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\ \val{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\ \val{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\ \val{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i - testi\\ + testi\\ \val{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor preferito\\ \val{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser preferito\\ + \val{TMPDIR} & $\bullet$ & $\bullet$ & $\bullet$ & Directory dei file + temporanei\\ \hline \end{tabular} - \caption{Variabili di ambiente più comuni definite da vari standard.} + \caption{Esempi di variabili di ambiente più comuni definite da vari + standard.} \label{tab:proc_env_var} \end{table} -Lo standard ANSI C prevede l'esistenza di un ambiente, pur non entrando nelle -specifiche di come sono strutturati i contenuti, e definisce la funzione -\func{getenv} che permette di ottenere i valori delle variabili di ambiente, -il cui prototipo è: +Lo standard ANSI C prevede l'esistenza di un ambiente, e pur non entrando +nelle specifiche di come sono strutturati i contenuti, definisce la funzione +\func{getenv} che permette di ottenere i valori delle variabili di ambiente; +il suo prototipo è: \begin{prototype}{stdlib.h}{char *getenv(const char *name)} Esamina l'ambiente del processo cercando una stringa che corrisponda a quella specificata da \param{name}. @@ -1160,10 +1170,11 @@ in \tabref{tab:proc_env_func}. \label{tab:proc_env_func} \end{table} -In Linux solo le prime quattro funzioni di \tabref{tab:proc_env_func} sono -definite, \func{getenv} l'abbiamo già esaminata; delle tre restanti le prime -due, \func{putenv} e \func{setenv}, servono per assegnare nuove variabili di -ambiente, i loro prototipi sono i seguenti: +In Linux sono definite solo le prime quattro delle funzioni elencate in +\tabref{tab:proc_env_func}. La prima, \func{getenv}, l'abbiamo appena +esaminata; delle tre restanti le prime due, \func{putenv} e \func{setenv}, +servono per assegnare nuove variabili di ambiente, i loro prototipi sono i +seguenti: \begin{functions} \headdecl{stdlib.h} @@ -1174,7 +1185,7 @@ ambiente, i loro prototipi sono i seguenti: all'ambiente. \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un - errore, che è sempre \const{ENOMEM}.} + errore, che è sempre \errval{ENOMEM}.} \end{functions} \noindent la terza, \func{unsetenv}, serve a cancellare una variabile di ambiente; il suo prototipo è: @@ -1333,7 +1344,7 @@ stati scritti. Per fare questo in \file{stdarg.h} sono definite delle apposite macro; la procedura da seguire è la seguente: \begin{enumerate*} \item Inizializzare un puntatore alla lista degli argomenti di tipo - \type{va\_list} attraverso la macro \macro{va\_start}. + \macro{va\_list} attraverso la macro \macro{va\_start}. \item Accedere ai vari argomenti opzionali con chiamate successive alla macro \macro{va\_arg}, la prima chiamata restituirà il primo argomento, la seconda il secondo e così via. @@ -1558,8 +1569,16 @@ Uno dei punti critici dei salti non-locali variabili, ed in particolare quello delle variabili automatiche della funzione a cui si ritorna. In generale le variabili globali e statiche mantengono i valori che avevano al momento della chiamata di \func{longjmp}, ma quelli -delle variabili automatiche (o di quelle dichiarate \code{register}) sono in -genere indeterminati. +delle variabili automatiche (o di quelle dichiarate +\direct{register}\footnote{la direttiva \direct{register} del compilatore + chiede che la variabile dichiarata tale sia mantenuta, nei limiti del + possibile, all'interno di un registro del processore. Questa direttiva + origina dai primi compilatori, quando stava al programmatore scrivere codice + ottimizzato, riservando esplicitamente alle variabili più usate l'uso dei + registri del processore. Oggi questa direttiva oggi è in disuso dato che + tutti i compilatori sono normalmente in grado di valutare con maggior + efficacia degli stessi programmatori quando sia il caso di eseguire questa + ottimizzazione.}) sono in genere indeterminati. Quello che succede infatti è che i valori delle variabili che sono tenute in memoria manterranno il valore avuto al momento della chiamata di @@ -1568,7 +1587,13 @@ chiamata ad un'altra funzioni vengono salvati nel contesto nello stack) torneranno al valore avuto al momento della chiamata di \func{setjmp}; per questo quando si vuole avere un comportamento coerente si può bloccare l'ottimizzazione che porta le variabili nei registri dichiarandole tutte come -\code{volatile}. +\direct{volatile}\footnote{la direttiva \ctyp{volatile} informa il compilatore + che la variabile che è dichiarata può essere modificata, durante + l'esecuzione del nostro, da altri programmi. Per questo motivo occorre dire + al compilatore che non deve essere mai utilizzata l'ottimizzazione per cui + quanto opportuno essa viene mantenuta in un registro, poiché in questo modo + si perderebbero le eventuali modifiche fatte dagli altri programmi (che + avvengono solo in una copia posta in memoria).}.