X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=3b560d7b57802ca53131e2c3515f2716eed08729;hp=440bc32336ebf60b003c286814b5b2547bfb4e59;hb=b0a24b5ec13267af5bcc1807c1f9aee892b3f788;hpb=3bca3d401ca4e81463de4aa1e2fca65028856404 diff --git a/fileadv.tex b/fileadv.tex index 440bc32..3b560d7 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1,6 +1,6 @@ %% fileadv.tex %% -%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2018 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -753,7 +753,7 @@ prototipo è: \item[\errcode{EINVAL}] si è usato un valore non valido per \param{cmd}. \end{errlist} ed inoltre \errcode{EDEADLK} e \errcode{ENOLCK} con lo stesso significato - che hanno con \funcd{fcntl}. + che hanno con \func{fcntl}. } \end{funcproto} @@ -912,6 +912,9 @@ può presentare anche con l'uso di file mappati in memoria; pertanto allo stato attuale delle cose è sconsigliabile fare affidamento sul \textit{mandatory locking}. +% TODO il supporto è stato reso opzionale nel 4.5, verrà eliminato nel futuro +% (vedi http://lwn.net/Articles/667210/) + \itindend{file~locking} \itindend{mandatory~locking} @@ -1050,13 +1053,13 @@ identifica un insieme di segnali. Per la manipolazione di questi \textit{file \vspace{3pt} \begin{funcbox}{ \fhead{sys/select.h} -\fdecl{void \macro{FD\_ZERO}(fd\_set *set)} +\fdecl{void \macrod{FD\_ZERO}(fd\_set *set)} \fdesc{Inizializza l'insieme (vuoto).} -\fdecl{void \macro{FD\_SET}(int fd, fd\_set *set)} +\fdecl{void \macrod{FD\_SET}(int fd, fd\_set *set)} \fdesc{Inserisce il file descriptor \param{fd} nell'insieme.} -\fdecl{void \macro{FD\_CLR}(int fd, fd\_set *set)} +\fdecl{void \macrod{FD\_CLR}(int fd, fd\_set *set)} \fdesc{Rimuove il file descriptor \param{fd} dall'insieme.} -\fdecl{int \macro{FD\_ISSET}(int fd, fd\_set *set)} +\fdecl{int \macrod{FD\_ISSET}(int fd, fd\_set *set)} \fdesc{Controlla se il file descriptor \param{fd} è nell'insieme.} } \end{funcbox}} @@ -1834,6 +1837,9 @@ modificano le modalità di notifica. ed è utile per riconoscere la chiusura di una connessione dall'altro capo di un socket quando si lavora in modalità \textit{edge triggered}.} +% TODO aggiunto con il kernel 4.5 EPOLLEXCLUSIVE, vedi +% http://lwn.net/Articles/633422/#excl + Il secondo campo, \var{data}, è una \dirct{union} che serve a identificare il file descriptor a cui si intende fare riferimento, ed in astratto può contenere un valore qualsiasi (specificabile in diverse forme) che ne permetta @@ -1974,12 +1980,12 @@ funzione di sistema si chiama \funcd{epoll\_pwait}\footnote{la funzione è {La funzione ritorna il numero di file descriptor pronti in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori già - visti con \funcd{epoll\_wait}. + visti con \func{epoll\_wait}. } \end{funcproto} -La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua +La funzione è del tutto analoga \func{epoll\_wait}, soltanto che alla sua uscita viene ripristinata la maschera di segnali originale, sostituita durante l'esecuzione da quella impostata con l'argomento \param{sigmask}; in sostanza la chiamata a questa funzione è equivalente al seguente codice, eseguito però @@ -2005,7 +2011,7 @@ notifiche di eventi tramite i segnali, presente da sempre nei sistemi unix-like, porti a notevoli problemi nell'interazione con le funzioni per l'\textit{I/O multiplexing}, tanto che per evitare possibili \textit{race condition} sono state introdotte estensioni dello standard POSIX e funzioni -apposite come \func{pselect}, \func{ppoll} e \funcd{epoll\_pwait}. +apposite come \func{pselect}, \func{ppoll} e \func{epoll\_pwait}. Benché i segnali siano il meccanismo più usato per effettuare notifiche ai processi, la loro interfaccia di programmazione, che comporta l'esecuzione di @@ -2056,7 +2062,7 @@ gestore in occasione dell'arrivo di un segnale, e rilevarne l'avvenuta ricezione leggendone la notifica tramite l'uso di uno speciale file descriptor. Trattandosi di un file descriptor questo potrà essere tenuto sotto osservazione con le ordinarie funzioni dell'\textit{I/O multiplexing} (vale a -dire con le solite \func{select}, \func{poll} e \funcd{epoll\_wait}) allo +dire con le solite \func{select}, \func{poll} e \func{epoll\_wait}) allo stesso modo di quelli associati a file o socket, per cui alla fine si potrà attendere in contemporanea sia l'arrivo del segnale che la disponibilità di accesso ai dati relativi a questi ultimi. @@ -2164,7 +2170,7 @@ condizioni di gestione, né da un gestore, né dalla funzione \func{sigwaitinfo} Come anticipato, essendo questo lo scopo principale della nuova interfaccia, il file descriptor può essere tenuto sotto osservazione tramite le funzioni dell'\textit{I/O multiplexing} (vale a dire con le solite \func{select}, -\func{poll} e \funcd{epoll\_wait}), e risulterà accessibile in lettura quando +\func{poll} e \func{epoll\_wait}), e risulterà accessibile in lettura quando uno o più dei segnali indicati tramite \param{mask} sarà pendente. La funzione può essere chiamata più volte dallo stesso processo, consentendo @@ -2813,9 +2819,9 @@ tab.~\ref{tab:file_lease_fctnl}. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \consts{F\_RDLCK} & Richiede un \textit{read lease}.\\ - \consts{F\_WRLCK} & Richiede un \textit{write lease}.\\ - \consts{F\_UNLCK} & Rilascia un \textit{file lease}.\\ + \constd{F\_RDLCK} & Richiede un \textit{read lease}.\\ + \constd{F\_WRLCK} & Richiede un \textit{write lease}.\\ + \constd{F\_UNLCK} & Rilascia un \textit{file lease}.\\ \hline \end{tabular} \caption{Costanti per i tre possibili valori dell'argomento \param{arg} di @@ -3514,7 +3520,7 @@ nome sta per \textit{asyncronous I/O control block}), che viene passata come argomento a tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in \headfiled{aio.h}, è riportata in fig.~\ref{fig:file_aiocb}. Nello steso file è definita la macro -\macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità +\macrod{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità dell'interfaccia per l'I/O asincrono. \begin{figure}[!htb] @@ -3544,8 +3550,8 @@ del blocco di dati da trasferire. Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni di I/O, in generale perché ciò sia possibile occorre che la piattaforma supporti questa caratteristica, questo viene indicato dal fatto che le macro -\macro{\_POSIX\_PRIORITIZED\_IO}, e \macro{\_POSIX\_PRIORITY\_SCHEDULING} sono -definite. La priorità viene impostata a partire da quella del processo +\macrod{\_POSIX\_PRIORITIZED\_IO}, e \macrod{\_POSIX\_PRIORITY\_SCHEDULING} +sono definite. La priorità viene impostata a partire da quella del processo chiamante (vedi sez.~\ref{sec:proc_priority}), cui viene sottratto il valore di questo campo. Il campo \var{aio\_lio\_opcode} è usato solo dalla funzione \func{lio\_listio}, che, come vedremo, permette di eseguire con una sola @@ -3854,6 +3860,7 @@ per il campo \var{aio\_sigevent} di \struct{aiocb}. % http://webfiveoh.com/content/guides/2012/aug/mon-13th/linux-asynchronous-io-and-libaio.html, % https://code.google.com/p/kernel/wiki/AIOUserGuide, % http://bert-hubert.blogspot.de/2012/05/on-linux-asynchronous-file-io.html +% https://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt \section{Altre modalità di I/O avanzato} @@ -4103,6 +4110,9 @@ file. % TODO trattare MAP_HUGETLB introdotto con il kernel 2.6.32, e modifiche % introdotte con il 3.8 per le dimensioni variabili delle huge pages +% TODO trattare MAP_FIXED_NOREPLACE vedi https://lwn.net/Articles/751651/ e +% https://lwn.net/Articles/741369/ + L'argomento \param{flags} specifica infine qual è il tipo di oggetto mappato, le opzioni relative alle modalità con cui è effettuata la mappatura e alle modalità con cui le modifiche alla memoria mappata vengono condivise o @@ -4679,6 +4689,12 @@ caching dei dati. \label{tab:madvise_advice_values} \end{table} +% TODO aggiunta MADV_FREE dal kernel 4.5 (vedi http://lwn.net/Articles/590991/) +% TODO aggiunta MADV_WIPEONFORK dal kernel 4.14 that causes the affected memory +% region to appear to be full of zeros in the child process after a fork. It +% differs from the existing MADV_DONTFORK in that the address range will +% remain valid in the child (dalla notizia in https://lwn.net/Articles/733256/). + \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che identifica pagine di memoria identiche e le accorpa in una unica pagina (soggetta al \textit{copy-on-write} per successive modifiche); per evitare @@ -4895,6 +4911,8 @@ si possono avere in concorrenza processi che utilizzano lo stesso file descriptor (si ricordi quanto visto in sez.~\ref{sec:file_adv_func}) con delle chiamate a \func{lseek}. +% TODO trattare preadv2() e pwritev2(), introdotte con il kernel 4.6, vedi +% http://lwn.net/Articles/670231/ ed il flag RWF_HIPRI \subsection{L'I/O diretto fra file descriptor: \func{sendfile} e @@ -5436,6 +5454,9 @@ copiati i puntatori. % TODO?? dal 2.6.25 splice ha ottenuto il supporto per la ricezione su rete +% TODO trattare qui copy_file_range (vedi http://lwn.net/Articles/659523/), +% introdotta nel kernel 4.5 + \subsection{Gestione avanzata dell'accesso ai dati dei file} \label{sec:file_fadvise}