From bf78d63598adf72d71aeea3c32277dd63484bb02 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 17 Jul 2002 15:52:11 +0000 Subject: [PATCH] Inserita una nuova tabella per gli standard POSIX, introdotti i segnali POSIX.1b (real-time), inserito paragrafo per la IPC POSIX, messi i riferimenti corretti nella sezione sull'I/O asincrono. --- fileadv.tex | 56 +++++++++++++++++++-------------- intro.tex | 90 ++++++++++++++++++++++++++++++++++++++++------------- ipc.tex | 13 ++++++++ signal.tex | 71 ++++++++++++++++++++++++++++++++++-------- 4 files changed, 173 insertions(+), 57 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index d744a75..5b08162 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -31,12 +31,11 @@ disponibili sul descrittore su cui si sta operando. Questo comportamento causa uno dei problemi più comuni che ci si trova ad affrontare nelle operazioni di I/O, che è quello che si verifica quando si devono eseguire operazioni che possono bloccarsi su più file descriptor: -mentre si è bloccati su uno di questi file su di un'altro potrebbero essere -presenti dei dati, così che nel migliore dei casi si avrebbe una lettura -ritardata inutilmente, e nel peggiore si potrebbe addirittura arrivare ad un -deadlock. +mentre si è bloccati su uno di essi su di un'altro potrebbero essere presenti +dei dati; così che nel migliore dei casi si avrebbe una lettura ritardata +inutilmente, e nel peggiore si potrebbe addirittura arrivare ad un deadlock. -Abbiamo già accennato in \secref{sec:file_open} che però è possibile prevenire +Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire questo tipo di comportamento aprendo un file in modalità \textsl{non-bloccante}, attraverso l'uso del flag \macro{O\_NONBLOCK} nella chiamata di \func{open}. In questo caso le funzioni di input/output che @@ -325,7 +324,7 @@ del flag \macro{O\_ASYNC},\footnote{l'uso del flag di \macro{O\_ASYNC} e dei di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile attivare in un secondo tempo questa modalità settando questo flag attraverso l'uso di \func{fcntl} con il comando \macro{F\_SETFL} (vedi -\secref{sec:file_fcntl}). +\secref{sec:file_fcntl}). In realtà in questo caso non si tratta di I/O asincrono vero e proprio, quanto di un meccanismo asincrono di notifica delle variazione dello stato del file @@ -333,34 +332,39 @@ descriptor; quello che succede \macro{SIGIO}, ma è possibile usarne altri) tutte le volte che diventa possibile leggere o scrivere dal file descriptor che si è posto in questa modalità. Si può inoltre selezionare, con il comando \macro{F\_SETOWN} di -\func{fcntl}, quale processo (o gruppo di processi) riceverà il segnale. +\func{fcntl}, quale processo (o gruppo di processi) riceverà il segnale. + +In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select} +che normalmente quando vengono usate con un grande numero di file descriptor, +non hanno buone prestazioni, in quanto passano maggior parte del tempo ad +eseguire uno scan per determinare quali sono quelli (in genere un piccola +percentuale) che sono diventati attivi. Uno dei problemi che si presenta con l'implementazione usuale di questa modalità di I/O è che essa può essere usata in maniera immediata aprendo in modalità asincrona un solo file per processo, altrimenti ad ogni segnale si -dovrebbe provvedere ad effettuare un controllo (utilizzando di nuovo -\func{select}) su tutti i file tenuti in modalità asincrona per distinguere -quelli cui è dovuta l'emissione del segnale. +dovrebbe provvedere ad effettuare un controllo, utilizzando di nuovo +\func{poll} o \func{select} su tutti i file tenuti in modalità asincrona per +distinguere quelli cui è dovuta l'emissione del segnale. Linux però supporta una estensione che permette di evitare tutto questo facendo ricorso alle informazioni aggiuntive restituite attraverso la struttura \type{siginfo\_t} quando il manipolatore del segnale viene installato come \macro{SA\_SIGINFO} (si riveda quanto illustrato in -\secref{sec:sig_sigaction}). - -Per attivare questa caratteristica occorre settare esplicitamente il segnale -da inviare in caso di I/O asincrono (di norma sempre \macro{SIGIO}) con il -comando \macro{F\_SETSIG} di \func{fcntl}. In questo caso il manipolatore -tutte le volte che riceverà \macro{SI\_SIGIO} come valore del campo -\var{si\_code}\footnote{il valore resta \macro{SI\_SIGIO} qualunque sia il - segnale che si è associato all'I/O asincrono, ed indica appunto che il +\secref{sec:sig_sigaction}). + +Per attivare questa caratteristica occorre utilizzare le funzionalità dei +segnali real-time (vedi \secref{sec:sig_real_time}) settando esplicitamente con +il comando \macro{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare +in caso di I/O asincrono (di norma viene usato \macro{SIGIO}). In questo caso +il manipolatore tutte le volte che riceverà \macro{SI\_SIGIO} come valore del +campo \var{si\_code}\footnote{il valore resta \macro{SI\_SIGIO} qualunque sia + il segnale che si è associato all'I/O asincrono, ed indica appunto che il segnale è stato generato a causa di attività nell'I/O asincrono.} di \type{siginfo\_t}, troverà nel campo \var{si\_fd} il valore del file descriptor che ha generato il segnale. In questo modo è possibile identificare immediatamente il file evitando completamente l'uso di funzioni come -\func{poll} o \func{select}. Inoltre, a differenza degli altri segnali, il -sistema mantiene una coda per \macro{SIGIO}, in modo che arrivi un segnale per -ogni file attivo. +\func{poll} o \func{select}. Benché la modalità di apertura asincrona di un file possa risultare utile in varie occasioni (in particolar modo con i socket e gli altri file per i quali @@ -396,8 +400,14 @@ vari buffer. In questo caso \subsection{File mappati in memoria} \label{sec:file_memory_map} - - +Una modalità alternativa di I/O, che usa una interfaccia completamente diversa +rispetto a quella classica, è quella dei file \textsl{mappati in memoria}. In +sostanza quello che si fa è usare il meccanismo della +\textsl{paginazione}\index{paginazione} usato per la memoria virtuale (vedi +\secref{sec:proc_mem_gen}) per trasformare vedere il file in una sezione dello +spazio di indirizzi del processo, in modo che l'accesso a quest'ultimo con le +normali operazioni di lettura e scrittura delle variabili in memoria, si +trasformi in I/O sul file stesso. diff --git a/intro.tex b/intro.tex index 73f6761..b648bd0 100644 --- a/intro.tex +++ b/intro.tex @@ -313,21 +313,69 @@ standardizzare l'interfaccia con il sistema operativo. Ma gli standard POSIX non si limitano alla standardizzazione delle funzioni di libreria, e in seguito sono stati prodotti anche altri standard per la shell e i comandi di sistema (1003.2), per le estensioni realtime e per i thread -(1003.1d e 1003.1c) e vari altri. +(1003.1d e 1003.1c) e vari altri. In \tabref{tab:intro_posix_std} si è +riportata una classificazione sommaria dei principali documenti prodotti, e di +come sono identificati fra IEEE ed ISO; si tenga conto inoltre che molto +spesso si usa l'estensione IEEE anche come aggiunta al nome POSIX (ad esempio +si può parlare di POSIX.4 come di POSIX.1b). + +Si tenga presente però che nuove specificazioni e proposte di +standardizzazione si aggiungono continuamente, mentre le versioni precedenti +vengono riviste; talvolta poi i riferimenti cambiamo nome, per cui anche solo +seguire le denominazioni usate diventa particolarmente faticoso; una pagina +dove si possono recuperare varie (e di norma piuttosto intricate) informazioni +è: \href{http://www.pasc.org/standing/sd11.html} +{http://www.pasc.org/standing/sd11.html}. + + +\begin{table}[htb] + \centering + \begin{tabular}[c]{|l|l|l|l|} + \hline + \textbf{Standard} & \textbf{IEEE} & \textbf{ISO} & \textbf{Contenuto} \\ + \hline + \hline + POSIX.1 & 1003.1 & 9945-1& Interfacce di base \\ + POSIX.1a& 1003.1a& 9945-1& Estensioni a POSIX.1 \\ + POSIX.2 & 1003.2 & 9945-2& Comandi \\ + POSIX.3 & 2003 &TR13210& Metodi di test \\ + POSIX.4 & 1003.1b & --- & Estensioni real-time \\ + POSIX.4a& 1003.1c & --- & Threads \\ + POSIX.4b& 1003.1d &9945-1& Ulteriori estensioni real-time \\ + POSIX.5 & 1003.5 & 14519& Interfaccia per il linguaggio ADA \\ + POSIX.6 & 1003.2c,1e& 9945-2& Sicurezza \\ + POSIX.8 & 1003.1f& 9945-1& Accesso ai file via rete \\ + POSIX.9 & 1003.9 & --- & Intercaccia per il Fortran-77 \\ + POSIX.12& 1003.1g& 9945-1& Sockets \\ + \hline + \end{tabular} + \caption{Elenco dei vari standard POSIX e relative denominazioni.} + \label{tab:intro_posix_std} +\end{table} + +Benché l'insieme degli standard POSIX siano basati sui sistemi Unix essi +definiscono comunque un'interfaccia di programmazione generica e non fanno +riferimento ad una implementazione specifica (ad esempio esiste +un'implementazione di POSIX.1 anche sotto Windows NT). Lo standard principale +resta comunque POSIX.1, che continua ad evolversi; la versione più nota, cui +gran parte delle implementazioni fanno riferimento, e che costituisce una base +per molti altri tentativi di standardizzazione, è stata rilasciata anche come +standard internazionale con la sigla ISO/IEC 9945-1:1996. + +Linux e le \acr{glibc} implementano tutte le funzioni definite nello standard +POSIX.1, queste ultime forniscono in più alcune ulteriori capacità (per +funzioni di \textit{pattern matching} e per la manipolazione delle +\textit{regular expression}), che vengono usate dalla shell e dai comandi di +sistema e che sono definite nello standard POSIX.2. + +Nelle versioni più recenti del kernel e delle librerie sono inoltre supportate +ulteriori funzionalità aggiunte dallo standard POSIX.1c per quanto riguarda i +\textit{thread} (vedi ...), e dallo standard POSIX.1b per quanto riguarda i +segnali e lo scheduling real-time (\secref{sec:sig_real_time} e +\secref{sec:proc_real_time}), la misura del tempo, i meccanismi di +intercomunicazione (\secref{sec:ipc_posix}) e l'I/O asincrono +(\secref{sec:file_asyncronous_io}). -Benché lo standard POSIX sia basato sui sistemi Unix esso definisce comunque -un'interfaccia di programmazione generica e non fa riferimento ad una -implementazione specifica (ad esempio esiste un'implementazione di questo -standard anche sotto Windows NT). Lo standard si è evoluto nel tempo, ed una -versione più aggiornata (quella che viene normalmente denominata POSIX.1) è -stata rilasciata come standard internazionale con la sigla ISO/IEC -9945-1:1996. - -Le \acr{glibc} implementano tutte le funzioni definite nello standard POSIX.1, -fornendo in più alcune ulteriori capacità (per funzioni di \textit{pattern - matching} e per la manipolazione delle \textit{regular expression}), che -usate dalla shell e dai comandi di sistema e che sono definite nello standard -POSIX.2. \subsection{Lo standard X/Open -- XPG3} @@ -401,8 +449,8 @@ socket. Queste estensioni sono state via via aggiunte al sistema nelle varie versioni del sistema (BSD 4.2, BSD 4.3 e BSD 4.4) come pure in alcuni derivati -commerciali come SunOS. Le \acr{glibc} provvedono tutte queste estensioni che -sono state in gran parte incorporate negli standard successivi. +commerciali come SunOS. Il kernel e le \acr{glibc} provvedono tutte queste +estensioni che sono state in gran parte incorporate negli standard successivi. \subsection{Lo standard System V} @@ -428,11 +476,11 @@ rinominata in Unix System Laboratories) venne acquistata dalla Novell, che poi trasferì il marchio Unix al consorzio X/Open; l'ultima versione di System V fu la SVr4.2MP rilasciata nel Dicembre 93. -Le \acr{glibc} implementano le principali funzionalità richieste da SVID che -non sono già incluse negli standard POSIX ed ANSI C, per compatibilità con lo -Unix System V e con altri Unix (come SunOS) che le includono. Tuttavia le -funzionalità più oscure e meno utilizzate (che non sono presenti neanche in -System V) sono state tralasciate. +Linux e le \acr{glibc} implementano le principali funzionalità richieste da +SVID che non sono già incluse negli standard POSIX ed ANSI C, per +compatibilità con lo Unix System V e con altri Unix (come SunOS) che le +includono. Tuttavia le funzionalità più oscure e meno utilizzate (che non sono +presenti neanche in System V) sono state tralasciate. Le funzionalità implementate sono principalmente il meccanismo di intercomunicazione fra i processi e la memoria condivisa (il cosiddetto System diff --git a/ipc.tex b/ipc.tex index d8703b1..709db83 100644 --- a/ipc.tex +++ b/ipc.tex @@ -611,6 +611,19 @@ Il secondo oggetto introdotto dal \textit{System V IPC} Il terzo oggetto introdotto dal \textit{System V IPC} è quello della memoria condivisa. + + + +\section{La comunicazione fra processi di POSIX} +\label{sec:ipc_posix} + +Lo standard POSIX.1b ha introdotto dei nuovi meccanismi di comunicazione, +rifacendosi a quelli di System V, introducendo una nuova interfaccia che +evitasse i principali problemi evidenziati in ... + + + + %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" diff --git a/signal.tex b/signal.tex index 5572fd4..f53e50b 100644 --- a/signal.tex +++ b/signal.tex @@ -1854,19 +1854,20 @@ in \tabref{tab:sig_sa_flag}. \end{table} Come si può notare in \figref{fig:sig_sigaction} \func{sigaction} -permette\footnote{La possibilità è prevista dallo standard POSIX.1b, ma in - Linux è stata aggiunta a partire dai kernel della serie 2.2.x. In precedenza - era possibile ottenere alcune informazioni addizionali usando - \var{sa\_handler} con un secondo parametro addizionale di tipo \var{struct - sigcontext}, che adesso è deprecato.} di utilizzare due forme diverse di -manipolatore, da specificare, a seconda dell'uso o meno del flag -\macro{SA\_SIGINFO}, rispettivamente attraverso i campi \var{sa\_sigaction} o -\var{sa\_handler}, (che devono essere usati in maniera alternativa, in certe -implementazioni questi vengono addirittura definiti come \ctyp{union}): la -prima è quella classica usata anche con \func{signal}, la seconda permette -invece di usare un manipolatore in grado di ricevere informazioni più -dettagliate dal sistema, attraverso la struttura \type{siginfo\_t}, riportata -in \figref{fig:sig_siginfo_t}. +permette\footnote{La possibilità è prevista dallo standard POSIX.1b, ed è + stata aggiunta a partire dai kernel della serie 2.1.x con l'introduzione dei + segnali real-time (vedi \secref{sec:sig_real_time}). In precedenza era + possibile ottenere alcune informazioni addizionali usando \var{sa\_handler} + con un secondo parametro addizionale di tipo \var{struct sigcontext}, che + adesso è deprecato.} di utilizzare due forme diverse di manipolatore, da +specificare, a seconda dell'uso o meno del flag \macro{SA\_SIGINFO}, +rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler}, +(che devono essere usati in maniera alternativa, in certe implementazioni +questi vengono addirittura definiti come \ctyp{union}): la prima è quella +classica usata anche con \func{signal}, la seconda permette invece di usare un +manipolatore in grado di ricevere informazioni più dettagliate dal sistema, +attraverso la struttura \type{siginfo\_t}, riportata in +\figref{fig:sig_siginfo_t}. \begin{figure}[!htb] \footnotesize \centering @@ -2334,6 +2335,50 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, \func{longjmp}. + +\subsection{I segnali real-time} +\label{sec:sig_real_time} + + +Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi +real-time, ha introdotto una estensione del modello classico dei segnali che +presenta dei significativi miglioramenti,\footnote{questa estensione è stata + introdotta in Linux a partire dal kernel 2.1.43(?), e dalle \acr{glibc} + 2.1(?).} in particolare sono stati superati tre limiti fondamentali dei +segnali classici: +\begin{description} +\item[I segnali non sono accumulati] se più segnali vengono generati prima + dell'esecuzione di un manipolatore questo sarà eseguito una sola volta, ed + il processo non sarà in grado di accorgersi di quante volte l'evento che ha + generato il segnale è accaduto. +\item[I segnali non trasportano informazione] i segnali classici non prevedono + prevedono altra informazione sull'evento che li ha generati che il loro + numero. +\item[I segnali non hanno un ordine di consegna] l'ordine in cui diversi + segnali vengono consegnati è casuale e non prevedibile, e dipende dalla + situazione in cui si trova il kernel al momento. +\end{description} + +Le nuove caratteristiche aggiunte a quelli che vengono chiamati +\textsl{segnali real-time}, sono le seguenti: + +\begin{itemize*} +\item la creazione di una coda che permette di consegnare istanze multiple + dello stesso segnale qualora esso venga inviato più volte prima + dell'esecuzione del manipolatore. +\item l'introduzione di una priorità nella consegna dei segnali (segnali a + priorità più alta vengono consegnati prima). +\item la possibilità di restituire dei dati al manipolatore, attraverso l'uso + della struttura \type{siginfo\_t} e dei manipolatori di tipo + \var{sa_sigaction}. +\end{itemize*} + +Per non interferire con i segnali standard POSIX i nuovi segnali sono +definiti, in \file{signal.h} a partire da un valore minimo \macro{SIGRTMIN} +fino \macro{SIGRTMAX} ad un massimo di + + + %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" -- 2.30.2