From b2892e085134716ccc35f0f0d247ca40356a81ff Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 9 Apr 2012 19:38:07 +0000 Subject: [PATCH] Piccole correzioni e completata la parte sui limiti aggiungendo prlimit. --- prochand.tex | 11 +- system.tex | 336 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 218 insertions(+), 129 deletions(-) diff --git a/prochand.tex b/prochand.tex index b0144e7..9677726 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1127,9 +1127,10 @@ tradizionalmente gli 8 bit meno significativi sono riservati per memorizzare lo \itindex{exit~status} stato di uscita del processo, e gli altri per indicare il segnale che ha causato la terminazione (in caso di conclusione anomala), uno per indicare se è stato generato un \itindex{core~dump} -\textit{core dump}, ecc.\footnote{le definizioni esatte si possono trovare in - \file{} ma questo file non deve mai essere usato - direttamente, esso viene incluso attraverso \file{}.} +\textit{core dump} (vedi sez.~\ref{sec:sig_standard}), ecc.\footnote{le + definizioni esatte si possono trovare in \file{} ma + questo file non deve mai essere usato direttamente, esso viene incluso + attraverso \file{}.} \begin{table}[!htb] \centering @@ -1318,8 +1319,8 @@ campi: \const{CLD\_STOPPED}, \const{CLD\_CONTINUED}, \const{CLD\_TRAPPED} e \const{CLD\_DUMPED} a indicare la ragione del ritorno della funzione, il cui significato è, nell'ordine: uscita normale, terminazione da segnale, - processo fermato, processo riavviato, processo terminato in \textit{core - dump}. + processo fermato, processo riavviato, processo terminato in + \itindex{core~dump} \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). \end{basedescript} Infine Linux, seguendo un'estensione di BSD, supporta altre due funzioni per diff --git a/system.tex b/system.tex index 5ad544d..313aceb 100644 --- a/system.tex +++ b/system.tex @@ -20,7 +20,7 @@ quelle per la gestione ed il controllo dei filesystem, degli utenti, dei tempi e degli errori. -\section{La gestione di catteristiche e parametri del sistema} +\section{La gestione di caratteristiche e parametri del sistema} \label{sec:sys_characteristics} In questa sezione tratteremo le varie modalità con cui un programma può @@ -883,7 +883,7 @@ sistema del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} e sono completamente generiche. Si noti però che non c'è una funzione che permetta di impostare direttamente una password.\footnote{in realtà questo può essere fatto ricorrendo alle funzioni della libreria PAM, ma questo non è un - argomento che trattremo qui.} Dato che POSIX non prevede questa possibilità + argomento che tratteremo qui.} Dato che POSIX non prevede questa possibilità esiste un'altra interfaccia che lo fa, derivata da SVID le cui funzioni sono riportate in tab.~\ref{tab:sys_passwd_func}. Questa interfaccia però funziona soltanto quando le informazioni sono mantenute su un apposito file di @@ -1048,7 +1048,7 @@ fig.~\ref{fig:sys_utmp_struct}. Le prime tre funzioni servono per leggere una voce dal registro: \func{getutent} legge semplicemente la prima voce disponibile, le altre due permettono di eseguire una ricerca. Aprendo il registro con \func{setutent} ci si posiziona al suo inizio, ogni chiamata di -queste funzioni eseguirà la lettura sulle voci seguenti, portanto la posizione +queste funzioni eseguirà la lettura sulle voci seguenti, pertanto la posizione sulla voce appena letta, in modo da consentire una scansione del file. Questo vale anche per \func{getutid} e \func{getutline}, il che comporta che queste funzioni effettuano comunque una ricerca ``\textsl{in avanti}''. @@ -1203,7 +1203,7 @@ lo spegnimento effettivo della macchina, occorre che il kernel effettui le opportune operazioni interagendo con il BIOS ed i dispositivi che controllano l'erogazione della potenza. -Ia funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri +La funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri aspetti della relativa procedura) è \funcd{reboot},\footnote{la funzione illustrata è quella fornita dalla \acr{glibc} che maschera i dettagli di basso livello della \textit{system call} la quale richiede attualmente tre @@ -1266,7 +1266,7 @@ illustra i comandi attualmente disponibili: kernel che è stato opportunamente caricato in memoria da una \func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel - corrente è stato compilato inlcudendo il relativo supporto.\footnote{deve + corrente è stato compilato includendo il relativo supporto.\footnote{deve essere stata abilitata l'opzione di compilazione \texttt{CONFIG\_KEXEC}.} Questo meccanismo consente di eseguire una sorta di riavvio rapido che evita di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del @@ -1285,7 +1285,7 @@ illustra i comandi attualmente disponibili: messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata immediatamente la procedura di riavvio usando il comando fornito nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'} - (veniva usato per lanciare un altro programma al posto di \cmd{init}. Nelle + (veniva usato per lanciare un altro programma al posto di \cmd{init}). Nelle versioni recenti questo argomento viene ignorato ed il riavvio può essere controllato dall'argomento di avvio del kernel \texttt{reboot=...} Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi @@ -1295,7 +1295,7 @@ illustra i comandi attualmente disponibili: Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si può eseguire un riavvio immediato pre-caricando una immagine del kernel, che -verrà eseguita direttettamente. Questo meccanismo consente di evitare la +verrà eseguita direttamente. Questo meccanismo consente di evitare la reinizializzazione della macchina da parte del BIOS, ed oltre a velocizzare un eventuale riavvio, ha il vantaggio poter accedere allo stato corrente della macchina e della memoria, per cui viene usato spesso per installare un kernel @@ -1348,13 +1348,13 @@ secondi indirizzo e dimensione in \textit{kernel space}. \label{fig:kexec_segment} \end{figure} -L'argomento \param{flags} è una maschera binaria che contiene i flag che -consentono di indicare alcune specifiche relative alle modalità con cui dovrà -essere eseguito il nuovo kernel. La parte meno significativa viene usata per -impostare l'architettura di esecuzione, il valore \const{KEXEC\_ARCH\_DEFAULT} -indica l'architettura corrente, ma se ne può specificare anche una diversa, -con i valori della seconda parte di tab.~\ref{tab:kexec_load_flags}, e questa -verrà usato posto che sia effettivamente eseguibile sul proprio processore. +L'argomento \param{flags} è una maschera binaria contenente i flag che +consentono di indicare le modalità con cui dovrà essere eseguito il nuovo +kernel. La parte meno significativa viene usata per impostare l'architettura +di esecuzione. Il valore \const{KEXEC\_ARCH\_DEFAULT} indica l'architettura +corrente, ma se ne può specificare anche una diversa, con i valori della +seconda parte di tab.~\ref{tab:kexec_load_flags}, e questa verrà usato posto +che sia effettivamente eseguibile sul proprio processore. \begin{table}[htb] \footnotesize @@ -1393,13 +1393,12 @@ verrà usato posto che sia effettivamente eseguibile sul proprio processore. \end{table} I due valori più importanti sono però quelli della parte più significativa -di \param{flags} (riportati nella prima sezione di -tab.~\ref{tab:kexec_load_flags}). Il primo, \const{KEXEC\_ON\_CRASH}, consente -di impostare l'esecuzione automatica del nuovo kernel caricato in caso di -crollo del sistema, e viene usato quando si carica un kernel di emergenza da -utilizzare per poter raccogliere informazioni diagnostiche che altrimenti -verrebbero perdute non essendo il kernel ordinario più in grado di essere -eseguito in maniera coerente. Il secondo valore, +(riportati nella prima sezione di tab.~\ref{tab:kexec_load_flags}). Il primo, +\const{KEXEC\_ON\_CRASH}, consente di impostare l'esecuzione automatica del +nuovo kernel caricato in caso di crollo del sistema, e viene usato quando si +carica un kernel di emergenza da utilizzare per poter raccogliere informazioni +diagnostiche che altrimenti verrebbero perdute non essendo il kernel ordinario +più in grado di essere eseguito in maniera coerente. Il secondo valore, \const{KEXEC\_PRESERVE\_CONTEXT}, indica invece di preservare lo stato dei programmi e dei dispositivi, e viene in genere usato per realizzare la cosiddetta ibernazione in RAM. @@ -1452,24 +1451,10 @@ da BSD 4.3,\footnote{questo non ha a nulla a che fare con il cosiddetto processo in maniera molto più dettagliata.} ma attualmente solo alcuni dei campi definiti sono effettivamente mantenuti. Con i kernel della serie 2.4 i soli campi che sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime}, -\var{ru\_minflt}, \var{ru\_majflt}, e \var{ru\_nswap}. Con i kernel della -serie 2.6 si aggiungono anche \var{ru\_nvcsw} e \var{ru\_nivcsw}, e a partire -dal 2.6.22 anche \var{ru\_inblock} e \var{ru\_oublock}. - -I campi più utilizzati sono comunque \var{ru\_utime} e \var{ru\_stime} che -indicano rispettivamente il tempo impiegato dal processo nell'eseguire le -istruzioni in user space, e quello impiegato dal kernel nelle \textit{system - call} eseguite per conto del processo. I campi \var{ru\_minflt} e -\var{ru\_majflt} servono a quantificare l'uso della memoria -virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di -\itindex{page~fault} \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen}) -avvenuti senza richiedere I/O su disco (i cosiddetti \textit{minor page - fault}), a quelli che invece han richiesto I/O su disco (detti invece -\textit{major page fault}), mentre \var{ru\_nswap} ed al numero di volte che -il processo è stato completamente tolto dalla memoria per essere inserito -nello swap. - -% TODO verificare \var{ru\_nswap} non citato nelle pagine di manuali recenti +\var{ru\_minflt} e \var{ru\_majflt}. Con i kernel della serie 2.6 si +aggiungono anche \var{ru\_nvcsw} e \var{ru\_nivcsw}, a partire dal 2.6.22 +anche \var{ru\_inblock} e \var{ru\_oublock} e dal 2.6.32 anche +\var{ru\_maxrss}. In genere includere esplicitamente \file{} non è più strettamente necessario, ma aumenta la portabilità, e serve comunque quando, come nella @@ -1497,7 +1482,7 @@ essa può anche essere letta direttamente utilizzando la funzione di sistema \begin{errlist} \item[\errcode{EINVAL}] l'argomento \param{who} non è valido \end{errlist} - ed inoltre \errval{EFAULT} nel suo significato generico. + ed inoltre \errval{EFAULT} nel suo significato generico. } \end{funcproto} @@ -1534,12 +1519,40 @@ recepita nello standard POSIX.1-2001, che però indica come campi di \caption{Valori per l'argomento \param{who} di \func{getrusage}.} \label{tab:getrusage_who} \end{table} + +I campi più utilizzati sono comunque \var{ru\_utime} e \var{ru\_stime} che +indicano rispettivamente il tempo impiegato dal processo nell'eseguire le +istruzioni in user space, e quello impiegato dal kernel nelle \textit{system + call} eseguite per conto del processo. I campi \var{ru\_minflt} e +\var{ru\_majflt} servono a quantificare l'uso della memoria +virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di +\itindex{page~fault} \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen}) +avvenuti senza richiedere I/O su disco (i cosiddetti \textit{minor page + fault}), a quelli che invece han richiesto I/O su disco (detti invece +\textit{major page fault}).% mentre \var{ru\_nswap} ed al numero di volte che +% il processo è stato completamente tolto dalla memoria per essere inserito +% nello swap. +% TODO verificare \var{ru\_nswap} non citato nelle pagine di manuali recenti e +% dato per non utilizzato. + +I campi \var{ru\_nvcsw} e \var{ru\_nivcsw} indicano il numero di volte che un +processo ha subito un \textit{context switch} da parte dello +\textit{scheduler} rispettivamente nel caso un cui questo avviene prima +dell'esaurimento della propria \textit{time-slice} (in genere a causa di una +\textit{system call} bloccante), o per averla esaurita o essere stato +interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e +\var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una +attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed +infine \var{ru\_maxrss} indica il valore più alto della +\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal +processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno +dei suoi figli. Si tenga conto che per un errore di implementazione nei i kernel precedenti il 2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1, l'uso di \const{RUSAGE\_CHILDREN} comportava l'inserimento dell'ammontare delle risorse usate dai processi figli anche quando si era impostata una -azione di \const{SIG\_ING} per il segnale \const{SIGCHLD} (per i segnali si +azione di \const{SIG\_IGN} per il segnale \const{SIGCHLD} (per i segnali si veda cap.~\ref{cha:signals}). Il comportamento è stato corretto per aderire allo standard a partire dal kernel 2.6.9. @@ -1567,8 +1580,9 @@ In generale il superamento di un limite corrente comporta o l'emissione di uno specifico segnale o il fallimento della \textit{system call} che lo ha provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU} in cui si ha in comportamento diverso per il superamento dei due limiti e -\const{RLIMIT\_CORE} che influenza soltanto la dimensione (o l'eventuale -creazione) dei file di \itindex{core~dump} \textit{core dump}. +\const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale +creazione dei file di \itindex{core~dump} \textit{core dump} (vedi +sez.~\ref{sec:sig_standard}). Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit} @@ -1579,15 +1593,17 @@ e \funcd{setrlimit}, i cui prototipi sono: \fhead{sys/resource.h} \fhead{unistd.h} \fdecl{int getrlimit(int resource, struct rlimit *rlim)} -\fdesc{Legge il limite corrente di una risorsa.} +\fdesc{Legge i limiti di una risorsa.} \fdecl{int setrlimit(int resource, const struct rlimit *rlim)} -\fdesc{Imposta il limite di una risorsa.} +\fdesc{Imposta i limiti di una risorsa.} } {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi. + \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi o + nell'impostazione si è specificato \var{rlim->rlim\_cur} maggiore di + \var{rlim->rlim\_max}. \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha cercato di innalzare i propri limiti. \end{errlist} @@ -1619,18 +1635,18 @@ Come accennato processo ordinario può alzare il proprio limite corrente fino al valore del limite massimo, può anche ridurre, irreversibilmente, il valore di quest'ultimo. Nello specificare un limite, oltre a fornire dei valori specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette -di sbloccare completamente l'uso di una risorsa; ma si ricordi che solo un +di sbloccare completamente l'uso di una risorsa. Si ricordi però che solo un processo con i privilegi di amministratore\footnote{per essere precisi in questo caso quello che serve è la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} può innalzare un limite al di sopra del valore corrente del limite massimo ed usare un valore qualsiasi per entrambi i limiti. -Come accennato ciascuna risorsa è identificata da uno specifico valore -dell'argomento \param{resource}, i valori possibili per questo argomento, ed -il significato della risorsa corrispondente, dei rispettivi limiti e gli -effetti causati dal superamento degli stessi sono riportati nel seguente -elenco: +Ciascuna risorsa su cui si possono applicare dei limiti è identificata da uno +specifico valore dell'argomento \param{resource}, i valori possibili per +questo argomento, ed il significato della risorsa corrispondente, dei +rispettivi limiti e gli effetti causati dal superamento degli stessi sono +riportati nel seguente elenco: \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}} \item[\const{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione @@ -1647,10 +1663,10 @@ elenco: \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi - sez.~\ref{sec:sig_prog_error}) creato nella terminazione di un - processo. File di dimensioni maggiori verranno troncati a questo valore, - mentre con un valore nullo si bloccherà la creazione dei \itindex{core~dump} - \textit{core dump}. + sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File + di dimensioni maggiori verranno troncati a questo valore, mentre con un + valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core + dump}. \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il @@ -1738,63 +1754,116 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa \errcode{EAGAIN}. \item[\const{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la - dimensione massima della memoria residente (il codiddetto RSS + dimensione massima della memoria residente (il cosiddetto RSS \itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè l'ammontare della memoria associata al processo che risiede effettivamente - in RAM (e non a quella eventualmente portata sulla \textit{swap} o non - ancora caricata dal filesystem (per il \index{segmento!testo} segmento testo - del programma). Ha effetto solo sulle chiamate a \func{madvise} con + in RAM e non a quella eventualmente portata sulla \textit{swap} o non ancora + caricata dal filesystem per il \index{segmento!testo} segmento testo del + programma. Ha effetto solo sulle chiamate a \func{madvise} con \const{MADV\_WILLNEED} (vedi sez.~\ref{sec:file_memory_map}). Presente solo sui i kernel precedenti il 2.4.30. -\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il +\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della + priorità statica che un processo può assegnarsi o assegnare con + \func{sched\_setscheduler} e \func{sched\_setparam} (vedi + sez.~\ref{sec:proc_real_time}). Il limite è stato introdotto a partire dal + kernel 2.6.12 (ma per un bug è effettivo solo a partire dal 2.6.13). In + precedenza solo i processi con privilegi amministrativi potevano avere una + priorità statica ed utilizzare una politica di \textit{scheduling} di tipo + \textit{real-time}. + +\item[\const{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo + massimo di CPU che un processo eseguito con una priorità statica può + consumare. Il superamento del limite corrente comporta l'emissione di un + segnale di \signal{SIGXCPU}, e quello del limite massimo di \signal{SIGKILL} + con le stesse regole viste \const{RLIMIT\_CPU}: se \signal{SIGXCPU} viene + intercettato ed ignorato il segnale verrà riemesso ogni secondo fino al + superamento del limite massimo. Questo limite è stato introdotto con il + kernel 2.6.25 per impedire che un processo \textit{real-time} possa bloccare + il sistema. % TODO trattare i seguenti... -% \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 -\item[\const{RLIMIT\_SIGPENDING}] Il numero massimo di segnali che possono - essere mantenuti in coda per ciascun utente, considerando sia i segnali - normali che real-time (vedi sez.~\ref{sec:sig_real_time}). Il limite è +\item[\const{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di + segnali che possono essere mantenuti in coda per ciascun utente, + identificato per \ids{UID} reale. Il limite comprende sia i segnali normali + che quelli \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) ed è attivo solo per \func{sigqueue}, con \func{kill} si potrà sempre inviare un - segnale che non sia già presente su una coda.\footnote{il limite su questa - risorsa è stato introdotto con il kernel 2.6.8.} + segnale che non sia già presente su una coda. Questo limite è stato + introdotto con il kernel 2.6.8. + +\item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima + dimensione dello \itindex{stack} \textit{stack} del processo. Se il processo + esegue operazioni che estendano lo \textit{stack} oltre questa dimensione + riceverà un segnale di \signal{SIGSEGV}. + + A partire dal kernel 2.6.23 questo stesso limite viene applicato per la gran + parte delle architetture anche ai dati che possono essere passati come + argomenti e variabili di ambiente ad un programma posto in esecuzione con + \func{execve}, nella misura di un quarto del valore indicato per lo + \textit{stack}. Questo valore in precedenza era fisso e pari a 32 pagine di + memoria, corrispondenti per la gran parte delle architetture a 128kb di + dati, dal 2.6.25, per evitare problemi di compatibilità quando + \const{RLIMIT\_STACK} è molto basso, viene comunque garantito uno spazio + base di 32 pagine qualunque sia l'architettura. +\end{basedescript} -\item[\const{RLIMIT\_RSS}] L'ammontare massimo di pagine di memoria dato al - \index{segmento!testo} testo del processo. Il limite è solo una indicazione - per il kernel, qualora ci fosse un surplus di memoria questa verrebbe - assegnata. +Si tenga conto infine che tutti i limiti eventualmente presenti su un processo +vengono ereditati dai figli da esso creati attraverso una \func{fork} (vedi +sez.~\ref{sec:proc_fork}) e mantenuti invariati per i programmi messi in +esecuzione attraverso una \func{exec} (vedi sez.~\ref{sec:proc_exec}). -\item[\const{RLIMIT\_STACK}] La massima dimensione dello \itindex{stack} - \textit{stack} del processo. Se il processo esegue operazioni che estendano - lo \textit{stack} oltre questa dimensione riceverà un segnale di - \signal{SIGSEGV}. +Si noti come le due funzioni \func{getrlimit} e \func{setrlimit} consentano di +operare solo sul processo corrente. Per questo motivo a partire dal kernel +2.6.36 (e dalla \acr{glibc} 2.13) è stata introdotta un'altra funzione di +sistema \funcd{prlimit} il cui scopo è quello di estendere e sostituire le +precedenti. Il suo prototipo è: -% TODO dal 2.6.23 il significato è cambiato, vedi anche man execve +\begin{funcproto}{ +\fhead{sys/resource.h} +\fdecl{int prlimit(pid\_t pid, int resource, const struct rlimit *new\_limit,\\ +\phantom{int prlimit(}struct rlimit *old\_limit} +\fdesc{Legge e imposta i limiti di una risorsa.} +} -% TODO: aggiungere a \const{RLIMIT\_STACK} i dati di execve: -% Questi fino al kernel 2.6.23 erano fissi e costituiti da -% 32 pagine di memoria (corrispondenti per la gran parte delle architetture a -% 128kb di dati). Dal 2.6.23 su molte architettire il limite viene stabilito in -% base al valore della risorsa \const{RLIMIT\_STACK} (vedi -% sez.~\ref{sec:sys_resource_limit}), ad un quarto dello spazio da essa -% indicato). Dal 2.6.25 viene comunque garantito uno spazio base di 32 pagine. +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi o + nell'impostazione si è specificato \var{rlim->rlim\_cur} maggiore di + \var{rlim->rlim\_max}. + \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha + cercato di innalzare i propri limiti o si è cercato di modificare i limiti + di un processo di un altro utente. + \item [\errcode{ESRCH}] il process \param{pid} non esiste. + \end{errlist} + ed inoltre \errval{EFAULT} nel suo significato generico. +} +\end{funcproto} -% TODO integrare con la roba di madvise -% TODO integrare con le ultime aggiunte, vedi pagina di manuale +La funzione è specifica di Linux e non portabile; per essere usata richiede +che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento +indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può +usare un valore nullo per indicare il processo chiamante. Per modificare i +limiti di un altro processo, a meno di non avere privilegi +amministrativi,\footnote{anche in questo caso la \itindex{capabilities} + \textit{capability} necessaria è \const{CAP\_SYS\_RESOURCE} (vedi + sez.~\ref{sec:proc_capabilities}).} l'\ids{UID} ed il \ids{GID} reale del +chiamante devono coincidere con \ids{UID} e \ids{GID} del processo indicato +per i tre gruppi reale, effettivo e salvato. -% TODO trattare prlimit64 introdotta con il 2.6.36 che dovrebbe sostituire -% setrlimit +Se \param{new\_limit} non è \val{NULL} verrà usato come puntatore alla +struttura \struct{rlimit} contenente i valori dei nuovi limiti da impostare, +mentre se \param{old\_limit} non è \val{NULL} verranno letti i valori correnti +del limiti nella struttura \struct{rlimit} da esso puntata. In questo modo è +possibile sia leggere che scrivere, anche in contemporanea, i valori dei +limiti. Il significato dell'argomento \param{resource} resta identico rispetto +a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti. -\end{basedescript} - -Si tenga conto infine che tutti i limiti vengono ereditati dal -processo padre attraverso una \func{fork} (vedi sez.~\ref{sec:proc_fork}) e -mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi -sez.~\ref{sec:proc_exec}). \subsection{Le risorse di memoria e processore} @@ -1803,29 +1872,42 @@ sez.~\ref{sec:proc_exec}). La gestione della memoria è già stata affrontata in dettaglio in sez.~\ref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il meccanismo della \index{memoria~virtuale} memoria virtuale attraverso la -divisione della memoria fisica in pagine. - -In genere tutto ciò è del tutto trasparente al singolo processo, ma in certi -casi, come per l'I/O mappato in memoria (vedi sez.~\ref{sec:file_memory_map}) -che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le -dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole -gestire in maniera ottimale l'interazione della memoria che si sta allocando -con il meccanismo della \index{paginazione} paginazione. - -Di solito la dimensione delle pagine di memoria è fissata dall'architettura -hardware, per cui il suo valore di norma veniva mantenuto in una costante che -bastava utilizzare in fase di compilazione, ma oggi, con la presenza di alcune -architetture (ad esempio Sun Sparc) che permettono di variare questa -dimensione, per non dover ricompilare i programmi per ogni possibile modello e -scelta di dimensioni, è necessario poter utilizzare una funzione. +divisione della memoria fisica in pagine. In genere tutto ciò è del tutto +trasparente al singolo processo, ma in certi casi, come per l'I/O mappato in +memoria (vedi sez.~\ref{sec:file_memory_map}) che usa lo stesso meccanismo per +accedere ai file, è necessario conoscere le dimensioni delle pagine usate dal +kernel. Lo stesso vale quando si vuole gestire in maniera ottimale +l'interazione della memoria che si sta allocando con il meccanismo della +\index{paginazione} paginazione. + +Un tempo la dimensione delle pagine di memoria era fissata una volta per tutte +dall'architettura hardware, per cui il relativo valore veniva mantenuto in una +costante che bastava utilizzare in fase di compilazione. Oggi invece molte +architetture permettono di variare questa dimensione (ad esempio sui PC +recenti si possono usare pagine di 4kb e di 4 Mb) per cui per non dover +ricompilare i programmi per ogni possibile caso e relativa scelta di +dimensioni, è necessario poter utilizzare una funzione. Dato che si tratta di una caratteristica generale del sistema, questa dimensione può essere ottenuta come tutte le altre attraverso una chiamata a -\func{sysconf}, \footnote{nel caso specifico si dovrebbe utilizzare il - parametro \const{\_SC\_PAGESIZE}.} ma in BSD 4.2 è stata introdotta una -apposita funzione, \funcd{getpagesize}, che restituisce la dimensione delle -pagine di memoria; il suo prototipo è: -\begin{prototype}{unistd.h}{int getpagesize(void)} +\func{sysconf} (nel caso specifico si dovrebbe utilizzare il parametro +\const{\_SC\_PAGESIZE}) ma in BSD 4.2 è stata introdotta una apposita funzione +di sistema \funcd{getpagesize} che restituisce la dimensione delle pagine di +memoria. La funzione è disponibile anche su Linux ed il suo prototipo è: + +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{int getpagesize(void)} +\fdesc{Legge la dimensione delle pagine di memoria.} +} + +{La funzione ritorna la dimensione di una pagina in byte, e non sono previsti + errori.} +\end{funcproto} + + +\begin{prototype}{unistd.h} +{int getpagesize(void)} Legge le dimensioni delle pagine di memoria. \bodydesc{La funzione ritorna la dimensione di una pagina in byte, e non @@ -2193,7 +2275,7 @@ Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a valere per qualunque funzione che vada a modificare l'orologio di sistema, quindi anche per quelle che tratteremo in seguito) può essere utilizzata solo da un processo coi privilegi di amministratore.\footnote{più precisamente la - capabitity \const{CAP\_SYS\_TIME}.} + capability \const{CAP\_SYS\_TIME}.} Il secondo argomento di entrambe le funzioni è una struttura \struct{timezone}, che storicamente veniva utilizzata per specificare appunto @@ -2822,7 +2904,7 @@ linea non vengano ripetuti. % LocalWords: SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG % LocalWords: Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE % LocalWords: ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc -% LocalWords: dall'header posix lim nell'header glibc run unistd name errno +% LocalWords: dall'header posix lim nell'header glibc run unistd name errno SC % LocalWords: NGROUP CLK TCK clock tick process PATH pathname BUF CANON path % LocalWords: pathconf fpathconf descriptor fd uname sys struct utsname info % LocalWords: EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc @@ -2830,7 +2912,7 @@ linea non vengano ripetuti. % LocalWords: newlen ENOTDIR EINVAL ENOMEM linux array oldvalue paging stack % LocalWords: TCP shell Documentation ostype hostname osrelease version mount % LocalWords: const source filesystemtype mountflags ENODEV ENOTBLK block read -% LocalWords: device EBUSY only EACCES NODEV ENXIO major +% LocalWords: device EBUSY only EACCES NODEV ENXIO major RTSIG syscall PID NSS % LocalWords: number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC % LocalWords: magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT % LocalWords: MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME @@ -2849,23 +2931,29 @@ linea non vengano ripetuti. % LocalWords: SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup % LocalWords: MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv % LocalWords: resource getrlimit setrlimit rlimit rlim INFINITY capabilities -% LocalWords: capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get +% LocalWords: capability CAP Sun Sparc PAGESIZE getpagesize SVr SUSv get IGN % LocalWords: phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double -% LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EUSER +% LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EUSER sizeof % LocalWords: ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT % LocalWords: Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz -% LocalWords: tms cutime cstime waitpid gettimeofday settimeofday timex -% LocalWords: timespec adjtime olddelta adjtimex David Mills RFC NTP ntp +% LocalWords: tms cutime cstime waitpid gettimeofday settimeofday timex NetBSD +% LocalWords: timespec adjtime olddelta adjtimex David Mills RFC NTP ntp cmd % LocalWords: nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL % LocalWords: esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP % LocalWords: second delete progress has occurred BAD broken tm gmtoff asctime % LocalWords: ctime timep gmtime localtime mktime tzname tzset daylight format % LocalWords: strftime thread EOF modifiable lvalue app errcode strerror LC at -% LocalWords: perror string errnum MESSAGES error message ErrCode strtol log +% LocalWords: perror string errnum MESSAGES error message strtol log % LocalWords: program invocation argv printf print progname exit count fname -% LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM -% LocalWords: CEST - +% LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM CAD +% LocalWords: CEST utmpxname Solaris updwtmpx reboot RESTART Ctrl OFF SIGINT +% LocalWords: HALT halted sync KEXEC kexec load bootloader POWER Power with nr +% LocalWords: Restarting command arg entry segments segment ARCH CRASH CONTEXT +% LocalWords: PRESERVE PPC IA ARM SH MIPS nvcsw nivcsw inblock oublock maxrss +% LocalWords: context switch slice Resident SIG SIGCHLD cur Gb lease mlock +% LocalWords: memory mlockall MAP LOCKED shmctl MSGQUEUE attr NICE nice MADV +% LocalWords: madvise WILLNEED RTPRIO sched setscheduler setparam scheduling +% LocalWords: RTTIME execve kb prlimit pid new old ESRCH EUSERS %%% Local Variables: -- 2.30.2