X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=62cabeeff1b3f5d094b51fa70de4379f72861a5b;hp=c321dd31d830eb99338af28c28cf2e9fc0733588;hb=33a54e1bfa5e62cb90d84c2d5f2d0c53864f6bec;hpb=1351fcd88ac4db6a4350bd7c3dfdc7e74ab461aa diff --git a/prochand.tex b/prochand.tex index c321dd3..62cabee 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1,6 +1,6 @@ %% prochand.tex %% -%% Copyright (C) 2000-2009 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -497,6 +497,9 @@ fosse stato creato solo per eseguire una \func{exec}, in tal caso infatti si invocherebbe un altro programma scartando completamente lo spazio degli indirizzi, rendendo superflua la copia della memoria modificata dal padre. +% TODO spiegare l'ulteriore cambiamento in ponte con il 2.6.32, che fa girare +% prima il padre per questioni di caching nella CPU + Eseguendo sempre per primo il figlio la \func{exec} verrebbe effettuata subito avendo così la certezza che il \itindex{copy~on~write} \textit{copy on write} viene utilizzato solo quando necessario. Quanto detto in precedenza vale @@ -663,13 +666,13 @@ Le differenze fra padre e figlio dopo la \func{fork} invece sono:\footnote{a \item gli aggiustamenti fatti dal padre ai semafori con \func{semop} (vedi sez.~\ref{sec:ipc_sysv_sem}). \item le notifiche sui cambiamenti delle directory con \textit{dnotify} (vedi - sez.~\ref{sec:sig_notification}), che non vengono ereditati dal figlio; + sez.~\ref{sec:sig_notification}), che non vengono ereditate dal figlio; \item le mappature di memoria marcate come \const{MADV\_DONTFORK} (vedi sez.~\ref{sec:file_memory_map}) che non vengono ereditate dal figlio; -\item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:xxx_prctl}) che +\item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:prctl_xxx}) che notifica al figlio la terminazione del padre viene cancellata; \item il segnale di terminazione del figlio è sempre \const{SIGCHLD} anche - qualora nel padre fosse stato modicato (vedi sez.~\ref{sec:process_clone}). + qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}). \end{itemize*} Una seconda funzione storica usata per la creazione di un nuovo processo è @@ -1450,7 +1453,7 @@ indicato dall'argomento \param{path}, che viene interpretato come il \begin{figure}[htb] \centering - \includegraphics[width=15cm]{img/exec_rel} + \includegraphics[width=12cm]{img/exec_rel} \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.} \label{fig:proc_exec_relat} \end{figure} @@ -1464,9 +1467,9 @@ sez.~\ref{sec:proc_environ}) del processo di partenza per costruire l'ambiente. Oltre a mantenere lo stesso \acr{pid}, il nuovo programma fatto partire da -\func{exec} assume anche una serie di altre proprietà del processo chiamante; -la lista completa è la seguente: -\begin{itemize} +\func{exec} mantiene la gran parte delle proprietà del processo chiamante; una +lista delle più significative è la seguente: +\begin{itemize*} \item il \textit{process id} (\acr{pid}) ed il \textit{parent process id} (\acr{ppid}); \item l'\textsl{user-ID reale}, il \textit{group-ID reale} ed i @@ -1480,43 +1483,99 @@ la lista completa \item la maschera di creazione dei file \itindex{umask} (\textit{umask}, vedi sez.~\ref{sec:file_perm_management}) ed i \textit{lock} sui file (vedi sez.~\ref{sec:file_locking}); -\item i segnali sospesi (\textit{pending}) e la maschera dei segnali (si veda - sez.~\ref{sec:sig_sigmask}); \item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}); -\item i valori delle variabili \var{tms\_utime}, \var{tms\_stime}, - \var{tms\_cutime}, \var{tms\_ustime} (vedi sez.~\ref{sec:sys_cpu_times}). -\end{itemize} - -Inoltre i segnali che sono stati impostati per essere ignorati nel processo -chiamante mantengono la stessa impostazione pure nel nuovo programma, tutti -gli altri segnali vengono impostati alla loro azione predefinita. Un caso -speciale è il segnale \const{SIGCHLD} che, quando impostato a -\const{SIG\_IGN}, può anche non essere reimpostato a \const{SIG\_DFL} (si veda -sez.~\ref{sec:sig_gen_beha}). - -La gestione dei file aperti dipende dal valore che ha il flag di -\itindex{close-on-exec} \textit{close-on-exec} (vedi anche -sez.~\ref{sec:file_fcntl}) per ciascun file descriptor. I file per cui è -impostato vengono chiusi, tutti gli altri file restano aperti. Questo -significa che il comportamento predefinito è che i file restano aperti -attraverso una \func{exec}, a meno di una chiamata esplicita a \func{fcntl} -che imposti il suddetto flag. Per le directory, lo standard POSIX.1 richiede -che esse vengano chiuse attraverso una \func{exec}, in genere questo è fatto -dalla funzione \func{opendir} (vedi sez.~\ref{sec:file_dir_read}) che effettua -da sola l'impostazione del flag di \itindex{close-on-exec} -\textit{close-on-exec} sulle directory che apre, in maniera trasparente -all'utente. - -Abbiamo detto che l'\textsl{user-ID reale} ed il \textsl{group-ID reale} -restano gli stessi all'esecuzione di \func{exec}; normalmente vale lo stesso -anche per l'\textsl{user-ID effettivo} ed il \textsl{group-ID effettivo} (il -significato di questi identificatori è trattato in -sez.~\ref{sec:proc_access_id}), tranne quando il file di cui viene chiesta -l'esecuzione ha o il \itindex{suid~bit} \acr{suid} bit o lo \itindex{sgid~bit} -\acr{sgid} bit impostato, in questo caso l'\textsl{user-ID effettivo} ed il -\textsl{group-ID effettivo} vengono impostati rispettivamente all'utente o al -gruppo cui il file appartiene (per i dettagli di questo comportamento si veda -sez.~\ref{sec:proc_perms}). +\item i valori delle variabili \var{tms\_utime}, \var{tms\_stime}; + \var{tms\_cutime}, \var{tms\_ustime} (vedi sez.~\ref{sec:sys_cpu_times}); +% TODO ===========Importante============= +% TODO questo sotto è incerto, verificare +% TODO ===========Importante============= +\item la maschera dei segnali (si veda sez.~\ref{sec:sig_sigmask}). +\end{itemize*} + +Una serie di proprietà del processo originale, che non avrebbe senso mantenere +in un programma che esegue un codice completamente diverso in uno spazio di +indirizzi totalmente indipendente e ricreato da zero, vengono perse con +l'esecuzione di \func{exec}; lo standard POSIX.1-2001 prevede che le seguenti +proprietà non vengano preservate: +\begin{itemize*} +\item l'insieme dei segnali pendenti (vedi sez.~\ref{sec:sig_gen_beha}), che + viene cancellato; +\item gli eventuali stack alternativi per i segnali (vedi + sez.~\ref{sec:sig_specific_features}); +\item i \textit{directory stream} (vedi sez.~\ref{sec:file_dir_read}), che + vengono chiusi; +\item le mappature dei file in memoria (vedi sez.~\ref{sec:file_memory_map}); +\item i segmenti di memoria condivisa SysV (vedi sez.~\ref{sec:ipc_sysv_shm}) + e POSIX (vedi sez.~\ref{sec:ipc_posix_shm}); +\item i blocchi sulla memoria (vedi sez.~\ref{sec:proc_mem_lock}); +\item le funzioni registrate all'uscita (vedi sez.~\ref{sec:proc_atexit}); +\item i semafori e le code di messaggi POSIX (vedi + sez.~\ref{sec:ipc_posix_sem} e sez.~\ref{sec:ipc_posix_mq}); +\item i timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}). +\end{itemize*} + +I segnali che sono stati impostati per essere ignorati nel processo chiamante +mantengono la stessa impostazione pure nel nuovo programma, ma tutti gli altri +segnali, ed in particolare quelli per i quali è stato installato un gestore +vengono impostati alla loro azione predefinita (vedi +sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \const{SIGCHLD} +che, quando impostato a \const{SIG\_IGN}, potrebbe anche essere reimpostato a +\const{SIG\_DFL}, anche se questo con Linux non avviene.\footnote{lo standard + POSIX.1-2001 prevede che questo comportamento sia deciso dalla singola + implementazione, quella di Linux è di non modificare l'impostazione + precedente.} + +Oltre alle precedenti che sono completamente generali e disponibili anche su +altri sistemi unix-like, esistono altre proprietà dei processi, attinenti +caratteristiche specifiche di Linux, che non vengono preservate +nell'esecuzione della funzione \func{exec}, queste sono: +\begin{itemize*} +\item le operazione di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) + pendenti vengono cancellate; +\item le \itindex{capabilities} \textit{capabilities} vengono modificate come + illustrato in sez.~\ref{sec:proc_capabilities}; +\item tutti i \itindex{thread} \textit{thread} tranne il chiamante (vedi + sez.~\ref{sec:thread_xxx}) sono cancellati e tutti gli oggetti ad essi + relativi (vedi sez.~\ref{sec:thread_xxx}) rimossi; +\item viene impostato il flag \const{PR\_SET\_DUMPABLE} di \func{prctl} (vedi + sez.~\ref{sec:prctl_xxx}) a meno che il programma da eseguire non sia + \itindex{suid~bit} \acr{suid} o \itindex{sgid~bit} \acr{sgid} (vedi + sez.~\ref{sec:proc_access_id}); +\item il flag \const{PR\_SET\_KEEPCAPS} di \func{prctl} (vedi + sez.~\ref{sec:prctl_xxx}) viene cancellato; +\item il nome del processo viene impostato al nome del file contenente il + programma messo in esecuzione; +\item il segnale di terminazione viene reimpostato a \const{SIGCHLD}; +\item l'ambiente viene reinizializzato impostando le variabili attinenti alla + localizzazione al valore di default POSIX. +\end{itemize*} + +La gestione dei file aperti nel passaggio al nuovo programma lanciato con +\func{exec} dipende dal valore che ha il flag di \itindex{close-on-exec} +\textit{close-on-exec} (vedi anche sez.~\ref{sec:file_fcntl}) per ciascun file +descriptor. I file per cui è impostato vengono chiusi, tutti gli altri file +restano aperti. Questo significa che il comportamento predefinito è che i file +restano aperti attraverso una \func{exec}, a meno di una chiamata esplicita a +\func{fcntl} che imposti il suddetto flag. Per le directory, lo standard +POSIX.1 richiede che esse vengano chiuse attraverso una \func{exec}, in genere +questo è fatto dalla funzione \func{opendir} (vedi +sez.~\ref{sec:file_dir_read}) che effettua da sola l'impostazione del flag di +\itindex{close-on-exec} \textit{close-on-exec} sulle directory che apre, in +maniera trasparente all'utente. + +Il comportamento della funzione in relazione agli identificatori relativi al +controllo di accesso verrà trattato in dettaglio in sez.~\ref{sec:proc_perms}, +qui è sufficiente anticipare (si faccia riferimento a +sez.~\ref{sec:proc_access_id} per la definizione di questi identificatori) +come l'\textsl{user-ID reale} ed il \textsl{group-ID reale} restano sempre gli +stessi, mentre l'\textsl{user-ID salvato} ed il \textsl{group-ID salvato} +vengono impostati rispettivamente all'\textsl{user-ID effettivo} ed il +\textsl{group-ID effettivo}, questi ultimi normalmente non vengono modificati, +a meno che il file di cui viene chiesta l'esecuzione non abbia o il +\itindex{suid~bit} \acr{suid} bit o lo \itindex{sgid~bit} \acr{sgid} bit +impostato, in questo caso l'\textsl{user-ID effettivo} ed il \textsl{group-ID + effettivo} vengono impostati rispettivamente all'utente o al gruppo cui il +file appartiene. Se il file da eseguire è in formato \emph{a.out} e necessita di librerie condivise, viene lanciato il \textit{linker} dinamico \cmd{/lib/ld.so} prima @@ -2433,8 +2492,8 @@ impostare la priorit {int setpriority(int which, int who, int prio)} Imposta la priorità per l'insieme dei processi specificati. - \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} può assumere i valori: + \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, + nel qual caso \var{errno} può assumere i valori: \begin{errlist} \item[\errcode{ESRCH}] non c'è nessun processo che corrisponda ai valori di \param{which} e \param{who}. @@ -2551,8 +2610,8 @@ la funzione {int sched\_setscheduler(pid\_t pid, int policy, const struct sched\_param *p)} Imposta priorità e politica di scheduling. - \bodydesc{La funzione ritorna la priorità in caso di successo e $-$1 in caso - di errore, nel qual caso \var{errno} può assumere i valori: + \bodydesc{La funzione ritorna 0 in caso di successo e $-$1 in caso di + errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} \item[\errcode{ESRCH}] il processo \param{pid} non esiste. \item[\errcode{EINVAL}] il valore di \param{policy} non esiste o il @@ -2594,7 +2653,7 @@ per \param{policy} mantiene la politica di scheduling corrente. \label{tab:proc_sched_policy} \end{table} -\footnotetext[41]{introdotto con il kernel 2.6.16.} +\footnotetext[44]{introdotto con il kernel 2.6.16.} \footnotetext{introdotto con il kernel 2.6.23.} Con le versioni più recenti del kernel sono state introdotte anche delle @@ -3208,6 +3267,7 @@ l'amministratore\footnote{o un processo con la capacit impostare un processo ad una priorità di I/O nella classe \const{IOPRIO\_CLASS\_RT} o \const{IOPRIO\_CLASS\_IDLE}. +%TODO verificare http://lwn.net/Articles/355987/ %TODO trattare le funzionalità per il NUMA % vedi man numa e le pagine di manuale relative @@ -3424,7 +3484,9 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % LocalWords: SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO % LocalWords: Completely Fair compat Uniform CFQ Queuing elevator dev cfq RT % LocalWords: Documentation block syscall ioprio IPRIO CLASS class best effort - +% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL +% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS + %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil"