+Entrambe le funzioni permettono di specificare su quale risorsa si vuole
+operare attraverso \param{resource}, i cui possibili valori sono elencati in
+\secref{tab:sys_rlimit_values}, e utilizzano una struttura \var{rlimit} per
+specificarne i valori.
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|l|p{12cm}|}
+ \hline
+ \textbf{Valore} & \textbf{Significato}\\
+ \hline
+ \hline
+ \macro{RLIMIT\_CPU} & Il massimo tempo di CPU che il processo può
+ usare. Il superamento del limite comporta
+ l'emissione di un segnale di \macro{SIGXCPU}.\\
+ \macro{RLIMIT\_FSIZE} & La massima dimensione di un file che un processo
+ può usare. Se il processo cerca di scrivere
+ oltre questa dimensione riceverà un segnale di
+ \macro{SIGXFSZ}.\\
+ \macro{RLIMIT\_DATA} & La massima dimensione della memoria dati di un
+ processo. Il tentatico di allocare più memoria
+ causa il fallimento della funzione di
+ allocazione. \\
+ \macro{RLIMIT\_STACK} & La massima dimensione dello stack del
+ processo. Se il processo esegue operazioni che
+ estendano lo stack oltre questa dimensione
+ riceverà un segnale di \macro{SIGSEGV}.\\
+ \macro{RLIMIT\_CORE} & La massima dimensione di un file di \textit{core
+ dump} creato da un processo. Nel caso le
+ dimensioni dovessero essere maggiori il file non
+ verrebbe generato.\footnotemark\\
+ \macro{RLIMIT\_RSS} & L'ammontare massimo di memoria fisica dato al
+ processo. Il limite è solo una indicazione per
+ il kernel, qualora ci fosse un surplus di
+ memoria questa verrebbe assegnata.\\
+ \macro{RLIMIT\_NPROC} & Il numero massimo di processi che possono essere
+ creati sullo stesso user id. Se il limite viene
+ raggiunto \func{fork} fallirà con un
+ \macro{EAGAIN}.\\
+ \macro{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può
+ aprire. L'apertura di un ulteriore file fallirà
+ con un errore \macro{EMFILE}.\\
+ \macro{RLIMIT\_MEMLOCK}& L'ammontare massimo di memoria che può essere
+ bloccata (vedi \secref{sec:proc_mem_lock}).\\
+ \macro{RLIMIT\_AS} & La dimensione massima di tutta la memoria che il
+ processo può ottenere. Se il processo tenta di
+ allocarne di più funzioni come \func{brk},
+ \func{malloc} o \func{mmap} falliranno. \\
+ \hline
+ \end{tabular}
+ \caption{Valori possibili dell'argomento \param{resource} delle funzioni
+ \func{getrlimit} e \func{setrlimit}.}
+ \label{tab:sys_rlimit_values}
+\end{table}
+
+\footnotetext{Settare questo limite a zero è la maniera più semplice per
+ evitare la creazione di \file{core} file.}
+
+È inoltre definita la costante \macro{RLIM\_INFINITY} che permette di
+sbloccare l'uso di una risorsa, ma solo un processo con i privilegi di
+amministratore può innalzare un limite al di sopra del valore corrente del
+limite massimo. Si tenga conto infine che tutti i limiti vengono ereditati dal
+processo padre attraverso una \func{fork} (vedi \secref{sec:proc_fork}) e
+mantenuti attraverso una \func{exec} (vedi \secref{sec:proc_exec}).
+
+
+\subsection{Le risorse di memoria e processore}
+\label{sec:sys_memory_res}
+
+La gestione della memoria è già stata affrontata in dettaglio in
+\secref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
+meccanismo della memoria virtuale attraverso la divisione della memoria fisica
+in pagine.
+
+In genere questo è del tutto trasparente al singolo processo, ma in certi
+casi, come per l'I/O mappato in memoria (vedi \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 allocata con il
+meccanismo della paginazione.
+
+Di solito la dimensione delle pagine di memoria è fissata dall'architettura
+hardware, per cui in genere la dimensione delle pagine di memoria era una
+costante definita in fase di compilazione, ma oggi alcune architetture (ad
+esempio su Sun Sparc) permettono di variare questa dimensione, e non volendo
+dover fornire binari diversi per ogni possibile modello, è necessario poter
+utilizzare una funzione.
+
+In genere questa dimensione può essere ottenuta attraverso una chiamata a
+\func{sysconf} come \func{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
+introdotta una apposita funzione, \func{getpagesize}, che restituisce la
+dimensione delle pagine di memoria; il suo prototipo è:
+\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
+ sono previsti errori.}
+\end{prototype}
+
+La funzione è prevista in SVr4, 4.4BSD e SUSv2, anche se questo ultimo
+standard la etichetta come obsoleta, mentre lo standard POSIX 1003.1-2001 la
+ha eliminata. In Linux è implementata come una system call nelle architetture
+in cui essa è necessaria, ed in genere restituisce il valore del simbolo
+\macro{PAGE\_SIZE} del kernel, anche se le versioni delle librerie del C
+precedenti le \acr{glibc} 2.1 implementavano questa funzione restituendo
+sempre un valore statico.
+
+Le \acr{glibc} forniscono, come specifica estensione GNU, altre due funzioni,
+\func{get\_phys\_pages} e \func{get\_avphys\_pages} che permettono di ottenere
+informazioni riguardo la memoria; i loro prototipi sono:
+\begin{functions}
+ \headdecl{sys/sysinfo.h}
+
+ \funcdecl{long int get\_phys\_pages(void)}
+
+ Legge il numero totale di pagine di memoria disponibili per il sistema.
+
+ \funcdecl{long int get\_avphys\_pages(void)}
+
+ Legge il numero di pagine di memoria disponibili nel sistema.
+
+ \bodydesc{Le funzioni restituiscono il numero di pagine, }
+\end{functions}
+
+Queste funzioni sono equivalenti all'uso della funzione \func{sysconf}
+rispettivamente con i parametri \macro{\_SC\_PHYS\_PAGES} e
+\macro{\_SC\_AVPHYS\_PAGES}. La prima restituisce il numero totale di pagine
+corrispondenti alla RAM della macchina; la seconda invece la memoria
+effettivamente disponibile per i processi.
+
+Le \acr{glibc} supportano inoltre, come estenzioni GNU, due funzioni che
+restituiscono il numero di processori della macchina (e quello dei processori
+attivi); anche queste sono informazioni comunque ottenibili attraverso
+\func{sysconf} utilizzando rispettivamente i parametri
+\macro{\_SC\_NPROCESSORS\_CONF} e \macro{\_SC\_NPROCESSORS\_ONLN}.
+
+Infine le \acr{glibc} riprendono da BSD la funzione \func{getloadavg} che
+permette di ottenere il carico di processore della macchina, in questo modo è
+possibile prendere decisioni su quando far partire eventuali nuovi processi.
+Il suo prototipo è:
+\begin{prototype}{stdlib.h}{int getloadavg(double loadavg[], int nelem)}
+ Legge il carico medio della macchina.
+
+ \bodydesc{La funzione ritorna il numero di elementi scritti o -1 in caso di
+ errore.}
+\end{prototype}
+
+La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
+di processi attivi sulla coda dello scheduler, calcolato su un diverso
+intervalli di tempo. Il numero di intervalli che si vogliono leggere è
+specificato da \param{nelem}, dato che nel caso di Linux il carico viene
+valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti), questo è
+anche il massimo valore che può essere assegnato a questo argomento.