X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=af655984f8244982e2b9817928cac9bd9ab753e7;hp=04b24efd31f50c0151c5b8e42ad9fe9f67ef5bdf;hb=933c31be4afaf6d54c982bd493195f9fb1b5c9b6;hpb=c21ecd755b45e99ed8b1524e03444bf189bfcc06 diff --git a/prochand.tex b/prochand.tex index 04b24ef..af65598 100644 --- a/prochand.tex +++ b/prochand.tex @@ -120,7 +120,7 @@ contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture usate a questo scopo sono dichiarate nell'header file \file{linux/sched.h}, ed uno schema semplificato, che riporta la struttura delle principali informazioni contenute nella \type{task\_struct} (che in seguito incontreremo a più -riprese), è mostrato in \nfig. +riprese), è mostrato in \figref{fig:proc_task_struct}. \begin{figure}[htb] \centering @@ -219,12 +219,14 @@ Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero positivo memorizzato in un intero a 16 bit, arriva ad un massimo di 32767. Oltre questo valore l'assegnazione riparte dal numero più basso disponibile a -partire da un minimo di 300,\footnote{questi valori sono definiti dalla macro - \macro{PID\_MAX} in \file{threads.h} e direttamente in \file{fork.c} nei - sorgenti del kernel.} che serve a riservare i \acr{pid} più bassi ai processi -eseguiti dal direttamente dal kernel. Per questo motivo, come visto in -\secref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il -\acr{pid} uguale a uno. +partire da un minimo di 300,\footnote{questi valori, fino al kernel 2.4.x, + sono definiti dalla macro \macro{PID\_MAX} in \file{threads.h} e + direttamente in \file{fork.c}, con il kernel 2.5.x e la nuova interfaccia + per i thread creata da Ingo Molnar anche il meccanismo di allocazione dei + \acr{pid} è stato modificato.} che serve a riservare i \acr{pid} più bassi +ai processi eseguiti dal direttamente dal kernel. Per questo motivo, come +visto in \secref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha +sempre il \acr{pid} uguale a uno. Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui sono stati creati, questo viene chiamato in genere \acr{ppid} (da @@ -689,13 +691,14 @@ eseguite alla chiusura di un processo \cmd{init}). \item viene inviato il segnale \macro{SIGCHLD} al processo padre (vedi \secref{sec:sig_sigchld}). -\item se il processo è un leader di sessione viene mandato un segnale di - \macro{SIGHUP} a tutti i processi in background e il terminale di - controllo viene disconnesso (vedi \secref{sec:sess_xxx}). +\item se il processo è un leader di sessione ed il suo terminale di controllo + è quello della sessione viene mandato un segnale di \macro{SIGHUP} a tutti i + processi del gruppo di foreground e il terminale di controllo viene + disconnesso (vedi \secref{sec:sess_ctrl_term}). \item se la conclusione di un processo rende orfano un \textit{process group} ciascun membro del gruppo viene bloccato, e poi gli vengono inviati in successione i segnali \macro{SIGHUP} e \macro{SIGCONT} - (vedi \secref{sec:sess_xxx}). + (vedi ancora \secref{sec:sess_ctrl_term}). \end{itemize*} Oltre queste operazioni è però necessario poter disporre di un meccanismo @@ -767,15 +770,15 @@ informazioni riguardo ai processi che sta terminando. Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati -dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di -terminazione\footnote{NdA verificare esattamente cosa c'è!}, mentre la memoria -in uso ed i file aperti vengono rilasciati immediatamente. I processi che sono -terminati, ma il cui stato di terminazione non è stato ancora ricevuto dal -padre sono chiamati \textit{zombie}, essi restano presenti nella tabella dei -processi ed in genere possono essere identificati dall'output di \cmd{ps} per -la presenza di una \texttt{Z} nella colonna che ne indica lo stato. Quando il -padre effettuerà la lettura dello stato di uscita anche questa informazione, -non più necessaria, verrà scartata e la terminazione potrà dirsi completamente +dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di terminazione, +mentre la memoria in uso ed i file aperti vengono rilasciati immediatamente. I +processi che sono terminati, ma il cui stato di terminazione non è stato +ancora ricevuto dal padre sono chiamati \textit{zombie}, essi restano presenti +nella tabella dei processi ed in genere possono essere identificati +dall'output di \cmd{ps} per la presenza di una \texttt{Z} nella colonna che ne +indica lo stato (vedi \tabref{tab:proc_proc_states}). Quando il padre +effettuerà la lettura dello stato di uscita anche questa informazione, non più +necessaria, verrà scartata e la terminazione potrà dirsi completamente conclusa. Possiamo utilizzare il nostro programma di prova per analizzare anche questa @@ -925,12 +928,16 @@ specchietto riportato in \tabref{tab:proc_waidpid_pid}: Il comportamento di \func{waitpid} può inoltre essere modificato passando delle opportune opzioni tramite l'argomento \param{option}. I valori possibili sono il già citato \macro{WNOHANG}, che previene il blocco della funzione -quando il processo figlio non è terminato, e \macro{WUNTRACED} (usata per il -controllo di sessione, trattato in \secref{sec:sess_job_control}) che fa -ritornare la funzione anche per i processi figli che sono bloccati ed il cui -stato non è stato ancora riportato al padre. Il valore dell'opzione deve -essere specificato come maschera binaria ottenuta con l'OR delle suddette -costanti con zero. +quando il processo figlio non è terminato, e \macro{WUNTRACED}. Quest'ultimo +viene generalmente usato per il controllo di sessione, (trattato in +\secref{sec:sess_job_control}) in quanto permette di identificare i processi +bloccati. La funzione infatti in tal caso ritorna, restituendone il \acr{pid}, +se c'è un processo figlio che è entrato in stato di sleep (vedi +\tabref{tab:proc_proc_states}) di cui non si è ancora letto lo stato (con +questa stessa opzione). Il valore dell'opzione deve essere specificato come +maschera binaria ottenuta con l'OR delle suddette costanti con zero. In Linux +sono previste altre opzioni non standard relative al comportamento con i +thread, che saranno trattate in \secref{sec:thread_xxx}. La terminazione di un processo figlio è chiaramente un evento asincrono rispetto all'esecuzione di un programma e può avvenire in un qualunque @@ -1184,7 +1191,7 @@ indicato dal parametro \var{path}, che viene interpretato come il \begin{figure}[htb] \centering - \includegraphics[width=13cm]{img/exec_rel} + \includegraphics[width=15cm]{img/exec_rel} \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.} \label{fig:proc_exec_relat} \end{figure} @@ -1287,8 +1294,12 @@ problematiche connesse ad una gestione accorta dei privilegi. Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in realtà già esistono estensioni di questo modello base, che lo rendono più flessibile e controllabile, come le \textit{capabilities}, le ACL per i file - o il \textit{Mandatory Access Control} di SELinux.} di sicurezza di un -sistema unix-like è fondato sui concetti di utente e gruppo, e sulla + o il \textit{Mandatory Access Control} di SELinux; inoltre basandosi sul + lavoro effettuato con SELinux, a partire dal kernel 2.5.x, è iniziato lo + sviluppo di una infrastruttura di sicurezza, il \textit{Linux Security + Modules}, ol LSM, in grado di fornire diversi agganci a livello del kernel + per modularizzare tutti i possibili controlli di accesso.} di sicurezza di +un sistema unix-like è fondato sui concetti di utente e gruppo, e sulla separazione fra l'amministratore (\textsl{root}, detto spesso anche \textit{superuser}) che non è sottoposto a restrizioni, ed il resto degli utenti, per i quali invece vengono effettuati i vari controlli di accesso. @@ -1874,6 +1885,7 @@ sia la sua priorit fintanto che esso si trova in uno qualunque degli altri stati. \begin{table}[htb] + \footnotesize \centering \begin{tabular}[c]{|p{2.8cm}|c|p{10cm}|} \hline