Modifiche fatte in treno
[gapil.git] / fileadv.tex
1 \chapter{I/O avanzato}
2 \label{cha:file_advanced}
3
4 In questo capitolo affronteremo le tematiche della gestione avanzata delle
5 funzioni di input/ouput, prenderemo in esame il \textit{file locking}, la
6 gestione dell'input/output da più file, per concludere con la gestione dei
7 file mappati in memoria.
8
9
10 \section{L'I/O avanzato}
11 \label{sec:file_advanced_io}
12
13 Uno dei problemi che ci si trova ad affrontare con le funzioni ordinarie
14 trattate in \capref{cha:file_unix_interface} è quello in cui si devono
15 eseguire su più di un file descriptor delle operazioni che possono bloccarsi:
16 il problema è che mentre si è bloccati su un file un'altro potrebbe essere
17 libero.
18
19 In questa sezione vedremo come si possono affrontare queste problematiche,
20 quali sono le soluzioni possibili e quali i meccanismi il kernel e le librerie
21 ci mettono a disposizione.
22
23
24 \subsection{La modalità di I/O \textsl{non-bloccante}}
25 \label{sec:file_noblocking}
26
27 Una prima soluzione per evitare di bloccarsi nelle operazioni di I/O è quella
28 di utilizzare la modalità \textsl{non-bloccante}. Abbiamo visto in
29 \secref{sec:sig_gen_beha}, affrontando la suddivisione fra \textit{fast} e
30 \textit{slow} system call, che in certi casi le funzioni di I/O possono
31 bloccarsi indefinitamente.\footnote{si ricordi però che questo può accadere
32   solo per le pipe, i socket ed alcuni file di dispositivo; sui file normali
33   le funzioni di lettura e scrittura ritornano sempre subito.} 
34 In particolare le operazioni di lettura possono bloccarsi quando non ci sono
35 dati disponibili sul descrittore su cui si sta operando.
36
37 Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
38 questo tipo di comportamento aprendo il file in modalità non bloccante,
39 specificando il flag \macro{O\_NONBLOCK}. In questo caso le funzioni che si
40 sarebbero bloccate ritornano immediatamente restituendo l'errore
41 \macro{EAGAIN}.
42
43 Esistono molti casi però in cui non si vuole che questo avvenga
44
45
46
47 %\section{I/O asincrono}
48 %\label{sec:file_asynchronous}
49
50 %Non supportato in Linux, in BSD e SRv4 c'è, ma usando il segnale \macro{SIGIO}
51 %per indicare che i dati sono disponibili, può essere usato in maniera semplice
52 %con un solo file per processo (altrimenti non sarebbe più possibile
53 %distinguere da quale file proviene l'attività che ha causato l'emissione del
54 %segnale).
55
56 \subsection{L'I/O asincrono}
57 \label{sec:file_asyncronous_io}
58
59
60
61 \subsection{Le funzioni \func{poll} e \func{select}}
62 \label{sec:file_multiplexing}
63
64
65
66
67
68
69 \section{File locking}
70 \label{sec:file_locking}
71
72 In \secref{sec:file_sharing} abbiamo preso in esame le mosalità in cui un
73 sistema unix-like gestisce la condivisione dei file. In quell'occasione si è
74 visto come, con l'eccezione dei file aperti in \textit{append mode}, quando
75 più processi scrivono contemporaneamente sullo stesso file non è possibile
76 determinare la sequenza in cui essi opereranno.
77
78 Questo causa la possibilità di race condition; in generale le situazioni più
79 comuni sono due: l'interazione fra un processo che scrive e altri che leggono,
80 in cui questi ultimi possono leggere informazioni scritte solo in maniera
81 parziale o incompleta; o quella in cui diversi processi scrivono, mescolando
82 in maniera imprevedebile il loro output sul file.
83
84 In tutti questi casi il \textit{file locking} è la tecnica che permette di
85 evitare le race condition, attraverso una serie di funzioni che permettono di
86 bloccare l'accesso al file da parte di altri processi così da evitare le
87 sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
88
89
90 \subsection{Il \textit{advisory locking}}
91 \label{sec:file_record_locking}
92
93 La prima modalità di file locking che è stata implementata nei sistemi
94 unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
95 quanto è il processo, e non il sistema, che si incarica di verificare se
96 esiste una condizione di blocco per l'accesso ai file.
97
98
99
100
101 \subsection{Il \textit{mandatory locking}}
102 \label{sec:file_mand_locking}
103
104 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVR4, 
105
106
107
108
109 \section{File mappati in memoria}
110 \label{sec:file_memory_map}
111
112
113
114 %%% Local Variables: 
115 %%% mode: latex
116 %%% TeX-master: "gapil"
117 %%% End: