X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=7ce8852ff95dbc841d50d4c5eab1359f2ad4e263;hp=88f897af64da1ee0b43aba4a2aabd3562860f41e;hb=b2fde72b2f308cb35873f1fd050501af6a742bc0;hpb=6ca77550fb420b3948b95a60ff79f7e282c12d34 diff --git a/prochand.tex b/prochand.tex index 88f897a..7ce8852 100644 --- a/prochand.tex +++ b/prochand.tex @@ -248,13 +248,13 @@ massimo di 32768. Oltre questo valore l'assegnazione riparte dal numero pi basso disponibile a partire da un minimo di 300,\footnote{questi valori, fino al kernel 2.4.x, sono definiti dalla macro \const{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; il valore massimo è - impostabile attraverso il file \procfile{/proc/sys/kernel/pid\_max} e di - default vale 32768.} che serve a riservare i \acr{pid} più bassi ai processi -eseguiti direttamente dal kernel. Per questo motivo, come visto in -sez.~\ref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il -\acr{pid} uguale a uno. + nuova interfaccia per i \itindex{thread} \textit{thread} creata da Ingo + Molnar anche il meccanismo di allocazione dei \acr{pid} è stato modificato; + il valore massimo è impostabile attraverso il file + \procfile{/proc/sys/kernel/pid\_max} e di default vale 32768.} che serve a +riservare i \acr{pid} più bassi ai processi eseguiti direttamente dal kernel. +Per questo motivo, come visto in sez.~\ref{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 @@ -331,7 +331,7 @@ Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che il processo figlio continuano ad essere eseguiti normalmente a partire dall'istruzione successiva alla \func{fork}; il processo figlio è però una copia del padre, e riceve una copia dei \index{segmento!testo} segmenti di -testo, \itindex{stack} stack e \index{segmento!dati} dati (vedi +testo, \itindex{stack} \textit{stack} e \index{segmento!dati} dati (vedi sez.~\ref{sec:proc_mem_layout}), ed esegue esattamente lo stesso codice del padre. Si tenga presente però che la memoria è copiata, non condivisa, pertanto padre e figlio vedono variabili diverse. @@ -949,8 +949,9 @@ funzione delle opportune opzioni tramite l'argomento \param{options}; questo deve essere specificato come maschera binaria dei flag riportati in tab.~\ref{tab:proc_waitpid_options},\footnote{oltre a queste in Linux sono previste del altre opzioni non standard, relative al comportamento con i - thread, che riprenderemo in sez.~\ref{sec:thread_xxx}.} che possono essere -combinati fra loro con un OR aritmetico. + \itindex{thread} \textit{thread}, che riprenderemo in + sez.~\ref{sec:thread_xxx}.} che possono essere combinati fra loro con un OR +aritmetico. L'uso dell'opzione \const{WNOHANG} consente di prevenire il blocco della funzione qualora nessun figlio sia uscito (o non si siano verificate le altre @@ -3496,10 +3497,11 @@ o periferiche) pu avviene nelle architetture NUMA). Infine se un gruppo di processi accede alle stesse risorse condivise (ad -esempio una applicazione con più thread) può avere senso usare lo stesso -processore in modo da sfruttare meglio l'uso della sua cache; questo -ovviamente riduce i benefici di un sistema multiprocessore nell'esecuzione -contemporanea dei thread, ma in certi casi (quando i thread sono inerentemente +esempio una applicazione con più \itindex{thread} \textit{thread}) può avere +senso usare lo stesso processore in modo da sfruttare meglio l'uso della sua +cache; questo ovviamente riduce i benefici di un sistema multiprocessore +nell'esecuzione contemporanea dei \itindex{thread} \textit{thread}, ma in +certi casi (quando i \itindex{thread} \textit{thread} sono inerentemente serializzati nell'accesso ad una risorsa) possono esserci sufficienti vantaggi nell'evitare la perdita della cache da rendere conveniente l'uso dell'affinità di processore. @@ -3698,19 +3700,22 @@ eseguire in maniera atomica le operazioni necessarie. \subsection{Le funzioni rientranti} \label{sec:proc_reentrant} +\index{funzioni!rientranti|(} + Si dice \textsl{rientrante} una funzione che può essere interrotta in qualunque punto della sua esecuzione ed essere chiamata una seconda volta da -un altro thread di esecuzione senza che questo comporti nessun problema -nell'esecuzione della stessa. La problematica è comune nella programmazione -multi-thread, ma si hanno gli stessi problemi quando si vogliono chiamare -delle funzioni all'interno dei gestori dei segnali. +un altro \itindex{thread} \textit{thread} di esecuzione senza che questo +comporti nessun problema nell'esecuzione della stessa. La problematica è +comune nella programmazione \itindex{thread} \textit{multi-thread}, ma si +hanno gli stessi problemi quando si vogliono chiamare delle funzioni +all'interno dei gestori dei segnali. Fintanto che una funzione opera soltanto con le variabili locali è rientrante; -queste infatti vengono allocate nello \itindex{stack} stack, ed un'altra -invocazione non fa altro che allocarne un'altra copia. Una funzione può non -essere rientrante quando opera su memoria che non è nello \itindex{stack} -stack. Ad esempio una funzione non è mai rientrante se usa una variabile -globale o statica. +queste infatti vengono allocate nello \itindex{stack} \textit{stack}, ed +un'altra invocazione non fa altro che allocarne un'altra copia. Una funzione +può non essere rientrante quando opera su memoria che non è nello +\itindex{stack} \textit{stack}. Ad esempio una funzione non è mai rientrante +se usa una variabile globale o statica. Nel caso invece la funzione operi su un oggetto allocato dinamicamente, la cosa viene a dipendere da come avvengono le operazioni: se l'oggetto è creato @@ -3724,16 +3729,20 @@ parte del programmatore. In genere le funzioni di libreria non sono rientranti, molte di esse ad esempio utilizzano variabili statiche, le \acr{glibc} però mettono a -disposizione due macro di compilatore, \macro{\_REENTRANT} e +disposizione due macro di compilatore,\footnote{si ricordi quanto illustrato + in sez.~\ref{sec:intro_gcc_glibc_std}.} \macro{\_REENTRANT} e \macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di varie funzioni di libreria, che sono identificate aggiungendo il suffisso \code{\_r} al nome della versione normale. +\index{funzioni!rientranti|)} + + % LocalWords: multitasking like VMS child process identifier pid sez shell fig % LocalWords: parent kernel init pstree keventd kswapd table struct linux call % LocalWords: nell'header scheduler system interrupt timer HZ asm Hertz clock % LocalWords: l'alpha tick fork wait waitpid exit exec image glibc int pgid ps -% LocalWords: sid threads thread Ingo Molnar ppid getpid getppid sys unistd LD +% LocalWords: sid thread Ingo Molnar ppid getpid getppid sys unistd LD % LocalWords: void ForkTest tempnam pathname sibling cap errno EAGAIN ENOMEM % LocalWords: stack read only copy write tab client spawn forktest sleep PATH % LocalWords: source LIBRARY scheduling race condition printf descriptor dup