6737554729c23493928bed51931c1a4a9c911af8
[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 su di un'altro potrebbero
17 essere presenti dati da leggere.
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 L'utilizzo di questa modalità di I/O permette allora di risolvere il problema 
44
45
46 %\section{I/O asincrono}
47 %\label{sec:file_asynchronous}
48
49 %Non supportato in Linux, in BSD e SRv4 c'è, ma usando il segnale \macro{SIGIO}
50 %per indicare che i dati sono disponibili, può essere usato in maniera semplice
51 %con un solo file per processo (altrimenti non sarebbe più possibile
52 %distinguere da quale file proviene l'attività che ha causato l'emissione del
53 %segnale).
54
55 \subsection{L'I/O asincrono}
56 \label{sec:file_asyncronous_io}
57
58
59
60 \subsection{Le funzioni \func{poll} e \func{select}}
61 \label{sec:file_multiplexing}
62
63
64
65
66
67
68 \section{File locking}
69 \label{sec:file_locking}
70
71 In \secref{sec:file_sharing} abbiamo preso in esame le mosalità in cui un
72 sistema unix-like gestisce la condivisione dei file. In quell'occasione si è
73 visto come, con l'eccezione dei file aperti in \textit{append mode}, quando
74 più processi scrivono contemporaneamente sullo stesso file non è possibile
75 determinare la sequenza in cui essi opereranno.
76
77 Questo causa la possibilità di race condition; in generale le situazioni più
78 comuni sono due: l'interazione fra un processo che scrive e altri che leggono,
79 in cui questi ultimi possono leggere informazioni scritte solo in maniera
80 parziale o incompleta; o quella in cui diversi processi scrivono, mescolando
81 in maniera imprevedebile il loro output sul file.
82
83 In tutti questi casi il \textit{file locking} è la tecnica che permette di
84 evitare le race condition, attraverso una serie di funzioni che permettono di
85 bloccare l'accesso al file da parte di altri processi così da evitare le
86 sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
87
88
89 \subsection{Il \textit{advisory locking}}
90 \label{sec:file_record_locking}
91
92 La prima modalità di file locking che è stata implementata nei sistemi
93 unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
94 quanto è il processo, e non il sistema, che si incarica di verificare se
95 esiste una condizione di blocco per l'accesso ai file.
96
97
98
99
100 \subsection{Il \textit{mandatory locking}}
101 \label{sec:file_mand_locking}
102
103 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVR4, 
104
105
106
107
108 \section{File mappati in memoria}
109 \label{sec:file_memory_map}
110
111
112
113 %%% Local Variables: 
114 %%% mode: latex
115 %%% TeX-master: "gapil"
116 %%% End: