X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=8120b9f6f55b8794c4ba694f6637922196b5a72c;hp=78ad88dc6a075976334798c187b67e4d38c74f03;hb=60e682c9d632073938de25c85bc9a984528d349a;hpb=07e172e1a0a23e896faa1b87bea92bf4871ae01b diff --git a/prochand.tex b/prochand.tex index 78ad88d..8120b9f 100644 --- a/prochand.tex +++ b/prochand.tex @@ -310,9 +310,9 @@ affrontato in dettaglio in sez.~\ref{sec:proc_perms}. La funzione \funcd{fork} è la funzione fondamentale della gestione dei processi: come si è detto tradizionalmente l'unico modo di creare un nuovo processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la - system call usata più comunemente da Linux per creare nuovi processi è - \func{clone} (vedi \ref{sec:process_clone}) , anche perché a partire dalle - \acr{glibc} 2.3.3 non viene più usata la system call originale, ma la stessa + \textit{system call} usata da Linux per creare nuovi processi è \func{clone} + (vedi \ref{sec:process_clone}), anche perché a partire dalle \acr{glibc} + 2.3.3 non viene più usata la \textit{system call} originale, ma la stessa \func{fork} viene implementata tramite \func{clone}, cosa che consente una migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo centrale tutte le volte che si devono scrivere programmi che usano il @@ -693,8 +693,8 @@ venne introdotta in BSD per migliorare le prestazioni. Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la perdita di prestazioni è assolutamente trascurabile, e l'uso di questa -funzione, che resta un caso speciale della system call \func{clone} (che -tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per +funzione, che resta un caso speciale della \textit{system call} \func{clone} +(che tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per questo eviteremo di trattarla ulteriormente. @@ -983,9 +983,9 @@ deve essere specificato come maschera binaria dei flag riportati nella prima parte in tab.~\ref{tab:proc_waitpid_options} che possono essere combinati fra loro con un OR aritmetico. Nella seconda parte della stessa tabella si sono riportati anche alcuni valori non standard specifici di Linux, che consentono -un controllo più dettagliato per i processi creati con la system call generica -\func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente per la -gestione della terminazione dei \itindex{thread} \textit{thread} (vedi +un controllo più dettagliato per i processi creati con la \textit{system call} +generica \func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente +per la gestione della terminazione dei \itindex{thread} \textit{thread} (vedi sez.~\ref{sec:thread_xxx}). \begin{table}[!htb] @@ -3288,15 +3288,60 @@ Nelle precedenti sezioni si sono trattate la gran parte delle funzioni che attengono alla gestione ordinaria dei processi e delle loro proprietà più comuni. Tratteremo qui alcune \textit{system call} dedicate alla gestione di funzionalità dei processi molto specifiche ed avanzate, il cui uso è in genere -piuttosto ridotto. Trattandosi di problematiche relativamente complesse, che -spesso presuppongono la conoscenza di altri argomenti trattati più avanti -nella guida, si può saltare questa lezione ad una prima lettura, tornando su +piuttosto ridotto. Trattandosi di problematiche abbastanza complesse, che +spesso presuppongono la conoscenza di altri argomenti trattati nel seguito +della guida, si può saltare questa sezione in una prima lettura, tornando su di essa in un secondo tempo. \subsection{La system call \func{clone}} \label{sec:process_clone} -Da fare +La funzione tradizionale con cui creare un nuovo processo in un sistema +Unix-like è, come illustrato in sez.~\ref{sec:proc_fork}, \func{fork}, ma con +l'introduzione del supporto del kernel per i \textit{thread} (vedi +cap.~\ref{cha:threads}), si è avuta la necessità di una interfaccia che +consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi +processi, che poi è stata utilizzata anche per fornire ulteriore supporto per +le varie tecnologie di virtualizzazione dei processi (i cosidetti +\textit{container}). + +Per far questo l'interfaccia per la creazione di un nuovo processo è stata +implementata una nuova \textit{system call}, \texttt{sys\_clone}, che consente +di reimplementare anche la tradizionale \func{fork}. La \textit{system call} +richiede due argomenti, \param{flags}, che consente di controllare le modalità +di creazione del nuovo processo e \param{child\_stack}, che deve essere +indicato se si intende creare un \textit{thread} in cui la memoria viene +condivisa fra il processo chiamante ed il nuovo processo creato. L'esecuzione +del programma creato da \param{child\_stack} riprende, come per \func{fork}, +da dopo l'esecuzione della stessa. + +La necessità di avere uno \itindex{stack} \textit{stack} alternativo c'è solo +quando si intende creare un \textit{thread}, in tal caso infatti il nuovo +processo vede esattamente la stessa memoria del processo chiamante, e nella +sua esecuzione andrebbe a scrivere sullo \textit{stack} usato anche da questi, +il che comporterebbe immediatamente la presenza di \itindex{race~condition} +\textit{race conditions} all'esecuzione di una funzione da parte di entrambi +(si ricordi quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso +dello \textit{stack}). + +Per evitare questo è allora necessario che il chiamante allochi +preventivamente un'area di memoria (in genere lo si fa con una \func{malloc}) +che la funzione imposterà come \textit{stack} del nuovo processo, avendo +ovviamente cura di non utilizzarla direttamente. Si tenga presente inoltre che +in molte architetture lo \textit{stack} cresce verso il basso, pertanto in tal +caso non si dovrà specificare per \param{child\_stack} il puntatore restituito +da \func{malloc}, ma un puntatore alla fine del buffer con essa allocato. + +Dato che tutto ciò serve solo per i \textit{thread} che condividono la +memoria, la \textit{system call}, a differenza della funzione di libreria che +vedremo a breve, consente anche di passare il valore \val{NULL} +per \param{child\_stack}, nel qual caso si applicherà la semantica del +\itindex{copy-on-write} \textit{copy on write} illustrata in +sez.~\ref{sec:proc_fork}, le pagine dello \textit{stack} verranno +automaticamente copiate come le altre e il nuovo processo avrà un suo +\textit{stack}. + + \subsection{La funzione \func{prctl}} \label{sec:process_prctl}