Lavoro in treno per webbit
[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, che non può essere
32 risolto con le funzioni di base trattate in \capref{cha:file_unix_interface},
33 è quello in cui si devono eseguire operazioni che possono bloccarsi su più
34 file descriptor: il problema è che mentre si è bloccati su uno di questi file
35 su di un'altro potrebbero essere presenti dei dati, così che nel migliore dei
36 casi si avrebbe una lettura inutilmente ritardata, e nel peggiore si potrebbe
37 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 poterle usare però è comunque comunque
57 necessario utilizzare la modalità di I/O non bloccante all'apertura del file.
58
59 \subsection{Le funzioni \func{poll} e \func{select}}
60 \label{sec:file_multiplexing}
61
62
63
64 \subsection{L'I/O asincrono}
65 \label{sec:file_asyncronous_io}
66
67 Una modalità alternativa all'uso dell'I/O non bloccante è quella di fare
68 ricorso all'I/O asincrono. Abbiamo accennato in \secref{sec:file_open} che è
69 possibile, attraverso l'uso del flag \macro{O\_ASYNC}, aprire un file in
70 modalità asincrona, così come è possibile settare questo flag attraverso l'uso
71 di \func{fcntl}.
72
73 In tal caso il sistema genera un segnale \macro{SIGIO} tutte le volte che sono
74 presenti dei dati in input su un file aperto in questa modalità.  Uno dei
75 problemi che si presentavano con le prime implementazioni di questa modalità
76 di I/O è che essa poteva essere usata in maniera semplice aprendo un solo file
77 per processo, dato che altrimenti si sarebbe dovuto provvedere ad effettuare
78 una serie di controlli su tutti i file aperti per distinguere a quale fosse
79 dovuto l'emissione del segnale.
80
81 Tutto questo adesso può essere evitato facendo ricorso alle informazioni
82 restituite al manipolatore del segnale attraverso la struttura
83 \var{siginfo\_t} (vedi \figref{fig:sig_siginfo_t}), il cui campo \var{si\_fd}
84 riporta il file descriptor che ha generato il segnale.
85
86
87
88 \subsection{File mappati in memoria}
89 \label{sec:file_memory_map}
90
91
92 \subsection{I/O multiplo}
93 \label{sec:file_multiple_io}
94
95
96
97 \section{Il file locking}
98 \label{sec:file_locking}
99
100 In \secref{sec:file_sharing} abbiamo preso in esame le mosalità in cui un
101 sistema unix-like gestisce la condivisione dei file da parte di processi
102 diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
103 in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
104 stesso file non è possibile determinare la sequenza in cui essi opereranno.
105
106 Questo causa la possibilità di race condition; in generale le situazioni più
107 comuni sono due: l'interazione fra un processo che scrive e altri che leggono,
108 in cui questi ultimi possono leggere informazioni scritte solo in maniera
109 parziale o incompleta; o quella in cui diversi processi scrivono, mescolando
110 in maniera imprevedebile il loro output sul file.
111
112 In tutti questi casi il \textit{file locking} è la tecnica che permette di
113 evitare le race condition, attraverso una serie di funzioni che permettono di
114 bloccare l'accesso al file da parte di altri processi, così da evitare le
115 sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
116
117
118 \subsection{L'\textit{advisory locking}}
119 \label{sec:file_record_locking}
120
121 La prima modalità di file locking che è stata implementata nei sistemi
122 unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
123 quanto è il processo, e non il sistema, che si incarica di verificare se
124 esiste una condizione di blocco per l'accesso ai file.
125
126
127
128
129 \subsection{Il \textit{mandatory locking}}
130 \label{sec:file_mand_locking}
131
132 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4, 
133
134
135
136
137
138
139 %%% Local Variables: 
140 %%% mode: latex
141 %%% TeX-master: "gapil"
142 %%% End: