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:
-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 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
-\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.
 
 
 
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
-(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 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.
 
+
+
+
+\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"
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}
-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"