Completata tcsetattr e tcgetaddr, inserito nuovo esempio.
[gapil.git] / intro.tex
index 79b337fca2b5a4e7d9159123b800bb626cee25f6..1fce94301774708b4ebb7dbb7b211f331acd7b6a 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -1,10 +1,10 @@
-\chapter{L'architettura di GNU/Linux}
+\chapter{L'architettura del sistema}
 \label{cha:intro_unix}
 
 In questo primo capitolo sarà fatta un'introduzione ai concetti generali su
-cui è basato un sistema di tipo Unix come GNU/Linux, in questo modo potremo
-fornire una base di comprensione mirata a sottolineare le peculiarità del
-sistema che sono più rilevanti per quello che riguarda la programmazione.
+cui è basato un sistema operativo di tipo Unix come GNU/Linux, in questo modo
+potremo fornire una base di comprensione mirata a sottolineare le peculiarità
+del sistema che sono più rilevanti per quello che riguarda la programmazione.
 
 Dopo un'introduzione sulle caratteristiche principali di un sistema di tipo
 Unix passeremo ad illustrare alcuni dei concetti base dell'architettura di
@@ -19,12 +19,16 @@ In questa prima sezione faremo una breve panoramica sull'architettura del
 sistema.  Chi avesse già una conoscenza di questa materia può tranquillamente
 saltare questa sezione.
 
+
+\subsection{Concetti base}
+\label{sec:intro_base_concept}
+
 Il concetto base di un sistema unix-like è quello di un nucleo del sistema (il
-cosiddetto \textit{kernel}) a cui si demanda la gestione delle risorse
-essenziali (la CPU, la memoria, le periferiche) mentre tutto il resto, quindi
-anche la parte che prevede l'interazione con l'utente, deve venire realizzato
-tramite programmi eseguiti dal kernel e che accedano alle risorse hardware
-tramite delle richieste a quest'ultimo.
+cosiddetto \textit{kernel}, nel nostro caso Linux) a cui si demanda la
+gestione delle risorse essenziali (la CPU, la memoria, le periferiche) mentre
+tutto il resto, quindi anche la parte che prevede l'interazione con l'utente,
+deve venire realizzato tramite programmi eseguiti dal kernel e che accedano
+alle risorse hardware tramite delle richieste a quest'ultimo.
 
 Fin dall'inizio uno Unix si presenta come un sistema operativo
 \textit{multitasking}, cioè in grado di eseguire contemporaneamente più
@@ -38,7 +42,7 @@ a rotazione).
 %computer (e quindi per un uso personale), sui quali l'hardware (allora
 %limitato) non consentiva la realizzazione di un sistema evoluto come uno unix.
 
-Gli Unix più recenti, come Linux, sono realizzati sfruttando alcune
+I kernel Unix più recenti, come Linux, sono realizzati sfruttando alcune
 caratteristiche dei processori moderni come la gestione hardware della memoria
 e la modalità protetta. In sostanza con i processori moderni si può
 disabilitare temporaneamente l'uso di certe istruzioni e l'accesso a certe
@@ -50,19 +54,19 @@ porte di input/output).
 
 Una parte del kernel, lo \textit{scheduler}, si occupa di stabilire, ad
 intervalli fissi e sulla base di un opportuno calcolo delle priorità, quale
-``processo'' deve essere posto in esecuzione (il cosiddetto
-\textit{preemptive scheduling}). Questo verrà comunque eseguito in modalità
-protetta; quando necessario il processo potrà accedere alle risorse hardware
-soltanto attraverso delle opportune chiamate al sistema che restituiranno il
-controllo al kernel.
+``processo'' deve essere posto in esecuzione (il cosiddetto \textit{preemptive
+  scheduling}\index{preemptive scheduling}). Questo verrà comunque eseguito in
+modalità protetta; quando necessario il processo potrà accedere alle risorse
+hardware soltanto attraverso delle opportune chiamate al sistema che
+restituiranno il controllo al kernel.
 
 La memoria viene sempre gestita dal kernel attraverso il meccanismo della
-\textsl{memoria virtuale}, che consente di assegnare a ciascun processo uno
-spazio di indirizzi ``virtuale'' (vedi \secref{sec:proc_memory}) che il kernel
-stesso, con l'ausilio della unità di gestione della memoria, si incaricherà di
-rimappare automaticamente sulla memoria disponibile, salvando su disco quando
-necessario (nella cosiddetta area di \textit{swap}) le pagine di memoria in
-eccedenza.
+\textsl{memoria virtuale}\index{memoria virtuale}, che consente di assegnare a
+ciascun processo uno spazio di indirizzi ``virtuale'' (vedi
+\secref{sec:proc_memory}) che il kernel stesso, con l'ausilio della unità di
+gestione della memoria, si incaricherà di rimappare automaticamente sulla
+memoria disponibile, salvando su disco quando necessario (nella cosiddetta
+area di \textit{swap}) le pagine di memoria in eccedenza.
 
 Le periferiche infine vengono viste in genere attraverso un'interfaccia
 astratta che permette di trattarle come fossero file, secondo il concetto per
@@ -125,11 +129,13 @@ in esempio, sono implementate come normali programmi.
 %realizzare un sistema di permessi e controlli che evitano che i programmi
 %eseguano accessi non autorizzati. 
 
-Per questo motivo è più corretto parlare di un sistema GNU/Linux, in quanto da
-solo il kernel è assolutamente inutile; quello che costruisce un sistema
-operativo utilizzabile è la presenza di tutta una serie di librerie e
-programmi di utilità che permettono di eseguire le normali operazioni che ci
-si aspetta da un sistema operativo.
+Per questo motivo quando ci si riferisce al sistema nella sua interezza è
+corretto parlare di un sistema GNU/Linux: da solo il kernel è assolutamente
+inutile; quello che costruisce un sistema operativo utilizzabile è la presenza
+di tutta una serie di librerie e programmi di utilità (che di norma sono
+quelli realizzati dal progetto GNU della Free Software Foundation) che
+permettono di eseguire le normali operazioni che ci si aspetta da un sistema
+operativo.
 
 
 \subsection{Chiamate al sistema e librerie di funzioni}
@@ -137,36 +143,42 @@ si aspetta da un sistema operativo.
 
 Come accennato le interfacce con cui i programmi possono accedere all'hardware
 vanno sotto il nome di chiamate al sistema (le cosiddette \textit{system
-  call}), si tratta di un insieme di funzioni, che un programma può chiamare,
-per le quali viene generata un'interruzione processo ed il controllo passa dal
-programma al kernel. Sarà poi quest'ultimo che (oltre a compiere una serie di
-operazioni interne come la gestione del multitasking e l'allocazione della
+  call}), si tratta di un insieme di funzioni che un programma può chiamare, w
+per le quali viene generata un'interruzione del processo ed il controllo passa
+dal programma al kernel. Sarà poi quest'ultimo che (oltre a compiere una serie
+di operazioni interne come la gestione del multitasking e l'allocazione della
 memoria) eseguirà la funzione richiesta in \textit{kernel space} restituendo i
 risultati al chiamante.
 
 Ogni versione di Unix ha storicamente sempre avuto un certo numero di queste
 chiamate, che sono riportate nella seconda sezione del \textsl{Manuale della
   programmazione di Unix} (quella cui si accede con il comando \cmd{man 2
-  nome}) e GNU/Linux non fa eccezione. Queste sono poi state codificate da
-vari standard, che esamineremo brevemente in \secref{sec:intro_standard}.
+  nome}) e inux non fa eccezione. Queste sono poi state codificate da vari
+standard, che esamineremo brevemente in \secref{sec:intro_standard}.
 
 Normalmente ciascuna di queste chiamate al sistema viene rimappata in
 opportune funzioni con lo stesso nome definite dentro la Libreria Standard del
-C, che, oltre alle interfacce alle system call, contiene anche tutta una serie
-di ulteriori funzioni, comunemente usate nella programmazione.
+C, che, oltre alle interfacce alle system call, contiene anche tutta la serie
+delle ulteriori funzioni definite dai vari standard, che sono comunemente
+usate nella programmazione.
 
 Questo è importante da capire perché programmare in Linux significa anzitutto
-essere in grado di usare la Libreria Standard del C, in quanto né il kernel,
-né il linguaggio C, implementano direttamente operazioni comuni come la
-allocazione dinamica della memoria, l'input/output bufferizzato o la
-manipolazione delle stringhe, presenti in qualunque programma.
-
-Anche per questo in Linux è in effetti GNU/Linux, in quanto una parte
-essenziale del sistema (senza la quale niente può funzionare) è la
-realizzazione fatta dalla Free Software Foundation della suddetta libreria (la
-GNU Standard C Library, detta in breve \textit{glibc}), in cui sono state
-implementate tutte le funzioni essenziali definite negli standard POSIX e ANSI
-C, che vengono utilizzate da qualunque programma.
+essere in grado di usare le varie interfacce contenute nella Libreria Standard
+del C, in quanto né il kernel, né il linguaggio C, implementano direttamente
+operazioni comuni come la allocazione dinamica della memoria, l'input/output
+bufferizzato o la manipolazione delle stringhe, presenti in qualunque
+programma.
+
+Anche questo ci mostra in maniera evidente come nella stragrande magggioranza
+dei casi,\footnote{esistono implementazioni diverse delle librerie del C, come
+  le \textit{libc5}, che non derivano dal progetto GNU, ma oggi sono, tranne
+  casi particolari, completamente soppiantate dalle \acr{glibc}.} quello che
+si sta utilizzando è un sistema GNU/Linux, in quanto una parte essenziale del
+sistema (senza la quale niente può funzionare) è la realizzazione fatta dalla
+Free Software Foundation della suddetta libreria (la GNU Standard C Library,
+detta in breve \textit{glibc}), in cui sono state implementate tutte le
+funzioni essenziali definite negli standard POSIX e ANSI C, che vengono
+utilizzate da qualunque programma.
 
 Le funzioni di questa libreria sono quelle riportate dalla terza sezione del
 Manuale di Programmazione di Unix (cioè accessibili con il comando \cmd{man 3
@@ -180,9 +192,9 @@ quello di una chiamata al sistema.
 \subsection{Un sistema multiutente}
 \label{sec:intro_multiuser}
 
-Linux, come gli altri Unix, nasce fin dall'inizio come sistema multiutente,
-cioè in grado di fare lavorare più persone in contemporanea. Per questo
-esistono una serie di meccanismi di sicurezza, che non sono previsti in
+Linux, come gli altri kernel Unix, nasce fin dall'inizio come sistema
+multiutente, cioè in grado di fare lavorare più persone in contemporanea. Per
+questo esistono una serie di meccanismi di sicurezza, che non sono previsti in
 sistemi operativi monoutente, e che occorre tenere presente.
 
 Il concetto base è quello di utente (\textit{user}) del sistema, le cui
@@ -214,8 +226,10 @@ definendo gruppi di lavoro, di accesso a determinate risorse, etc.
 L'utente e il gruppo sono identificati da due numeri (la cui corrispondenza ad
 un nome espresso in caratteri è inserita nei due file \file{/etc/passwd} e
 \file{/etc/groups}). Questi numeri sono l'\textit{user identifier}, detto in
-breve \acr{uid}, e il \textit{group identifier}, detto in breve \acr{gid}, che
-sono quelli che poi vengono usati dal kernel per identificare l'utente.
+breve \textsl{userid}, ed indicato dall'acronimo \acr{uid}, e il \textit{group
+  identifier}, detto in breve \textsl{groupid}, ed identificato dall'acronimo
+\acr{gid}, e sono quelli che vengono usati dal kernel per identificare
+l'utente.
  
 In questo modo il sistema è in grado di tenere traccia per ogni processo
 dell'utente a cui appartiene ed impedire ad altri utenti di interferire con
@@ -230,10 +244,10 @@ Infine in ogni Unix 
 essere in grado di fare qualunque operazione; per l'utente \textit{root}
 infatti i meccanismi di controllo descritti in precedenza sono
 disattivati.\footnote{i controlli infatti vengono sempre eseguiti da un codice
-  del tipo \texttt{if (uid) \{ ... \}}}
+  del tipo \code{if (uid) \{ ... \}}}
 
 
-\section{Gli standard di Unix e GNU/Linux}
+\section{Gli standard}
 \label{sec:intro_standard}
 
 In questa sezione faremo una breve panoramica relativa ai vari standard che
@@ -242,10 +256,12 @@ organizzazioni varie al riguardo del sistema o alle caratteristiche che si
 sono stabilite come standard di fatto in quanto facenti parte di alcune
 implementazioni molto diffuse come BSD o SVr4.
 
-Ovviamente prenderemo in considerazione solo gli aspetti riguardanti
+Ovviamente prenderemo in considerazione solo gli standard riguardanti
 interfacce di programmazione e le altre caratteristiche di un sistema
-unix-like ed in particolare a come e in che modo essi sono supportati da
-GNU/Linux (sia per quanto riguarda il kernel che le \acr{glibc}).
+unix-like (alcuni standardizzano pure i comandi base del sistema e la shell)
+ed in particolare ci concentreremo sul come ed in che modo essi sono
+supportati sia per quanto riguarda il kernel che le librerie del C (con una
+particolare attenzione alle \acr{glibc}).
 
 
 \subsection{Lo standard ANSI C}
@@ -264,13 +280,13 @@ anche una libreria di funzioni che devono poter essere implementate su
 qualunque sistema operativo.
 
 Per questo motivo, anche se lo standard non ha alcun riferimento ad un sistema
-di tipo Unix, GNU/Linux (per essere precisi le glibc), come molti Unix
+di tipo Unix, GNU/Linux (per essere precisi le \acr{glibc}), come molti Unix
 moderni, provvede la compatibilità con questo standard, fornendo le funzioni
 di libreria da esso previste. Queste sono dichiarate in quindici header file
 (anch'essi provvisti dalla \acr{glibc}), uno per ciascuna delle quindici aree
-in cui è stata suddivisa una libreria standard. In \ntab\ si sono riportati
-questi header, insieme a quelli definiti negli altri standard descritti nelle
-sezioni successive.
+in cui è stata suddivisa una libreria standard. In (\ntab\ da fare) si sono
+riportati questi header, insieme a quelli definiti negli altri standard
+descritti nelle sezioni successive.
 
 In realtà \acr{glibc} ed i relativi header file definiscono un insieme di
 funzionalità in cui sono incluse come sottoinsieme anche quelle previste dallo
@@ -285,9 +301,9 @@ usare le varie estensioni al linguaggio e al preprocessore da esso supportate.
 \label{sec:intro_posix}
 
 Uno standard più attinente al sistema nel suo complesso (e che concerne sia il
-kernel che le librerie è lo standard POSIX. Esso prende origine dallo standard
-ANSI C, che contiene come sottoinsieme, prevedendo ulteriori capacità per le
-funzioni in esso definite, ed aggiungendone di nuove. 
+kernel che le librerie) è lo standard POSIX. Esso prende origine dallo
+standard ANSI C, che contiene come sottoinsieme, prevedendo ulteriori capacità
+per le funzioni in esso definite, ed aggiungendone di nuove.
 
 In realtà POSIX è una famiglia di standard diversi, il cui nome, suggerito da
 Richard Stallman, sta per \textit{Portable Operating System Interface}, ma la
@@ -298,18 +314,71 @@ 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
-le utility di sistema (1003.2), per le estensioni realtime e per i thread
-(1003.1d e 1003.1c) e vari altri. 
-
-Benché lo standard POSIX sia basato sui sistemi Unix esso definisce comunque
-un'interfaccia e non fa riferimento ad una specifica implementazione (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.
+i comandi di sistema (1003.2), per le estensioni realtime e per i thread
+(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]
+  \footnotesize
+  \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}).
 
-Le \acr{glibc} implementano tutte le funzioni definite nello standard POSIX.1,
-e Linux; 
 
 
 \subsection{Lo standard X/Open -- XPG3}
@@ -376,15 +445,15 @@ allora versioni disponibili, fino ad arrivare al rilascio di una versione
 completa di Unix, chiamata appunto BSD, del tutto indipendente dal codice
 della AT/T.
 
-Benchè BSD non sia uno standard formalizzato, l'implementazione di Unix
+Benché BSD non sia uno standard formalizzato, l'implementazione di Unix
 dell'Università di Berkley, ha provveduto nel tempo una serie di estensioni e
 di API grande rilievo, come il link simbolici, la funzione \code{select}, i
 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}
@@ -410,11 +479,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
@@ -426,9 +495,9 @@ matematiche.
 \subsection{Il comportamento standard del \cmd{gcc} e delle \acr{glibc}}
 \label{sec:intro_gcc_glibc_std}
 
-In Linux gli standard appena descritti sono ottenibili sia attraverso l'uso di
-opzioni del compilatore (il \cmd{gcc}) che definendo opportune costanti prima
-della inclusione dei file degli header.
+In Linux grazie alle \acr{glibc} gli standard appena descritti sono ottenibili
+sia attraverso l'uso di opzioni del compilatore (il \cmd{gcc}) che definendo
+opportune costanti prima della inclusione dei file degli header.
 
 Se si vuole che i programmi seguano una stretta attinenza allo standard ANSI C
 si può usare l'opzione \cmd{-ansi} del compilatore, e non sarà riconosciuta
@@ -504,7 +573,7 @@ esplicitamente definendo la macro \macro{\_GNU\_SOURCE} prima di
 includere i vari header file.
 
 
-\subsection{Gli standard di Linux}
+\subsection{Gli standard di GNU/Linux}
 \label{sec:intro_linux_std}
 
 Da fare (o cassare, a seconda del tempo e della voglia).