Nuovo esempio
[gapil.git] / fileadv.tex
1 \chapter{La gestione avanzata dei file}
2 \label{cha:file_advanced}
3
4 In questo capitolo affronteremo le tematiche relative alla gestione avanzata
5 dei file, che non sono state trattate in \capref{cha:file_unix_interface},
6 dove ci si è limitati ad una panoramica delle funzioni base. In particolare
7 tratteremo delle funzioni di input/output avanzato e del \textit{file
8   locking}.
9
10
11 \section{Le funzioni di I/O avanzato}
12 \label{sec:file_advanced_io}
13
14 In questa sezione esamineremo le funzioni che permettono una gestione più
15 sofisticata dell'I/O su file, a partire da quelle che permettono di gestire
16 l'accesso contemporaneo a più file, per concludere con la gestione dell'I/O
17 mappato in memoria.
18
19
20 \subsection{La modalità di I/O \textsl{non-bloccante}}
21 \label{sec:file_noblocking}
22
23 Abbiamo visto in \secref{sec:sig_gen_beha}, affrontando la suddivisione fra
24 \textit{fast} e \textit{slow} system call, che in certi casi le funzioni di
25 I/O possono bloccarsi indefinitamente.\footnote{si ricordi però che questo può
26   accadere solo per le pipe, i socket ed alcuni file di dispositivo; sui file
27   normali le funzioni di lettura e scrittura ritornano sempre subito.}  Ad
28 esempio le operazioni di lettura possono bloccarsi quando non ci sono dati
29 disponibili sul descrittore su cui si sta operando.
30
31 Uno dei problemi più comuni che ci si trova ad affrontare, e che non può
32 essere risolto con le funzioni base trattate in
33 \capref{cha:file_unix_interface}, è quello in cui si devono eseguire su più
34 file descriptor operazioni che possono bloccarsi: il problema è che mentre si
35 è bloccati su uno di questi file su di un'altro potrebbero essere presenti dei
36 dati, così che nel migliore dei casi si avrebbe una lettura inutilmente
37 ritardata, e nel peggiore si potrebbe addirittura arrivare ad un deadlock.
38
39 Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
40 questo tipo di comportamento aprendo un file in modalità
41 \textsl{non-bloccante}, specificando il flag \macro{O\_NONBLOCK} alla chiamata
42 di \func{open}. In questo caso le funzioni di input/output che altrimenti si
43 sarebbero bloccate ritornano immediatamente, restituendo l'errore
44 \macro{EAGAIN}.
45
46 L'utilizzo di questa modalità di I/O permette allora di risolvere il problema
47 controllando a turno i vari file descriptor, in un ciclo in cui si ripete
48 l'accesso fintanto che esso non viene garantito.  Ovviamente questa tecnica,
49 detta \textit{polling}, è estremamente inefficiente: si tiene costantemente
50 impiegata la CPU solo per eseguire in continuazione delle system call che
51 nella gran parte dei casi falliranno.
52
53 Per questo motivo, quando come vedremo in dettaglio in
54 \secref{sec:file_multiplexing}, il sistema fornisce delle funzioni apposite
55 che permettono di aggirare questo problema, permettendo di attendere fino alla
56 disponibilità di un accesso; per usarle però è comunque comunque necessario
57 utilizzare la modalità di I/O non bloccante.
58
59 \subsection{Le funzioni \func{poll} e \func{select}}
60 \label{sec:file_multiplexing}
61
62
63 %\section{I/O asincrono}
64 %\label{sec:file_asynchronous}
65
66 %Non supportato in Linux, in BSD e SRv4 c'è, ma usando il segnale \macro{SIGIO}
67 %per indicare che i dati sono disponibili, 
68
69 \subsection{L'I/O asincrono}
70 \label{sec:file_asyncronous_io}
71
72 Una modalità alternativa all'uso dell'I/O non bloccante è quella di fare
73 ricorso all'I/O asincrono. Abbiamo accennato in \secref{sec:file_open} che è
74 possibile, attraverso l'uso del flag \macro{O\_ASYNC}, aprire un file in
75 modalità asincrona, così come è possibile settare questo flag attraverso l'uso
76 di \func{fcntl}.
77
78 In tal caso il sistema genera un segnale \macro{SIGIO} tutte le volte che sono
79 presenti dei dati in input sul file.
80
81
82
83 Uno dei problemi che si presentavano con le prime implementazioni di questa
84 modalità di I/O è che essa poteva essere usata in maniera semplice con un solo
85 file per processo, dato che altrimenti non sarebbe stato distinguere da quale
86 file provieniva l'attività che ha causato l'emissione del segnale. 
87
88
89
90
91
92 \subsection{File mappati in memoria}
93 \label{sec:file_memory_map}
94
95
96 \subsection{I/O multiplo}
97 \label{sec:file_multiple_io}
98
99
100
101 \section{Il file locking}
102 \label{sec:file_locking}
103
104 In \secref{sec:file_sharing} abbiamo preso in esame le mosalità in cui un
105 sistema unix-like gestisce la condivisione dei file da parte di processi
106 diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
107 in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
108 stesso file non è possibile determinare la sequenza in cui essi opereranno.
109
110 Questo causa la possibilità di race condition; in generale le situazioni più
111 comuni sono due: l'interazione fra un processo che scrive e altri che leggono,
112 in cui questi ultimi possono leggere informazioni scritte solo in maniera
113 parziale o incompleta; o quella in cui diversi processi scrivono, mescolando
114 in maniera imprevedebile il loro output sul file.
115
116 In tutti questi casi il \textit{file locking} è la tecnica che permette di
117 evitare le race condition, attraverso una serie di funzioni che permettono di
118 bloccare l'accesso al file da parte di altri processi, così da evitare le
119 sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
120
121
122 \subsection{L'\textit{advisory locking}}
123 \label{sec:file_record_locking}
124
125 La prima modalità di file locking che è stata implementata nei sistemi
126 unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
127 quanto è il processo, e non il sistema, che si incarica di verificare se
128 esiste una condizione di blocco per l'accesso ai file.
129
130
131
132
133 \subsection{Il \textit{mandatory locking}}
134 \label{sec:file_mand_locking}
135
136 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4, 
137
138
139
140
141
142
143 %%% Local Variables: 
144 %%% mode: latex
145 %%% TeX-master: "gapil"
146 %%% End: