Inserita una nuova tabella per gli standard POSIX, introdotti i
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 17 Jul 2002 15:52:11 +0000 (15:52 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 17 Jul 2002 15:52:11 +0000 (15:52 +0000)
segnali POSIX.1b (real-time), inserito paragrafo per la IPC POSIX,
messi i riferimenti corretti nella sezione sull'I/O asincrono.

fileadv.tex
intro.tex
ipc.tex
signal.tex

index d744a758905558b00fe24189ce811a6b41c9a064..5b0816293e0a5379d8cd3b8c6bb67458887cc3b1 100644 (file)
@@ -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:
 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
 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
   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
 
 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
 \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
 
 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 controlloutilizzando 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
 
 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
   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
 
 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}
 
 \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.
 
 
 
 
 
 
index 73f676134373a863bd0f15792e9a5c372173ccbf..b648bd011cc915b56ebf95b6ff9c9a756938385f 100644 (file)
--- 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
 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}
 
 
 \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
 
 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}
 
 
 \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.
 
 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
 
 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 d8703b1e1b102f5fafe4f73e4f576ea0105db450..709db831b78fb53d5411a3625538b86f9a5eb581 100644 (file)
--- 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.
 
 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"
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
index 5572fd4410886502429efef7316b4c1dd796f5de..f53e50b04d572b4bba0022ca38ede2e5da24dccf 100644 (file)
@@ -1854,19 +1854,20 @@ in \tabref{tab:sig_sa_flag}.
 \end{table}
 
 Come si può notare in \figref{fig:sig_sigaction} \func{sigaction}
 \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
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2334,6 +2335,50 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, 
 \func{longjmp}.
 
 
 \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"
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"