X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=ade65bcbb9ded2a06945e7553e8111aca86b54e1;hp=02f0b9f80c90f35176a6d6a278b1a8b74a31a62d;hb=4aa6c51696d2b11c572eccd37238db1691785573;hpb=fd4e2fd24a218ef56953fd5a58d0b3c0bee8acb7 diff --git a/fileadv.tex b/fileadv.tex index 02f0b9f..ade65bc 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1,6 +1,6 @@ %% fileadv.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 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", @@ -4654,8 +4654,7 @@ significativi delle prestazioni rispetto all'uso in sequenza di \func{read} e che anzi in certi casi si potevano avere anche dei peggioramenti. Questo ha portato, per i kernel della serie 2.6,\footnote{per alcune motivazioni di questa scelta si può fare riferimento a quanto illustrato da Linus Torvalds - in \href{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html} - {\textsf{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}}.} + in \url{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}.} alla decisione di consentire l'uso della funzione soltanto quando il file da cui si legge supporta le operazioni di \textit{memory mapping} (vale a dire non è un socket) e quello su cui si scrive è un socket; in tutti gli altri @@ -4694,18 +4693,18 @@ Il concetto che sta dietro a \func{splice} invece è diverso,\footnote{in scopi da \func{sendfile}, quello che rende \func{splice} davvero diversa è stata la reinterpretazione che ne è stata fatta nell'implementazione su Linux realizzata da Jens Anxboe, concetti che sono esposti sinteticamente - dallo stesso Linus Torvalds in \href{http://kerneltrap.org/node/6505} - {\textsf{http://kerneltrap.org/node/6505}}.} si tratta semplicemente di una -funzione che consente di fare in maniera del tutto generica delle operazioni -di trasferimento di dati fra un file e un buffer gestito interamente in kernel -space. In questo caso il cuore della funzione (e delle affini \func{vmsplice} -e \func{tee}, che tratteremo più avanti) è appunto l'uso di un buffer in -kernel space, e questo è anche quello che ne ha semplificato l'adozione, -perché l'infrastruttura per la gestione di un tale buffer è presente fin dagli -albori di Unix per la realizzazione delle \textit{pipe} (vedi -sez.~\ref{sec:ipc_unix}). Dal punto di vista concettuale allora \func{splice} -non è altro che una diversa interfaccia (rispetto alle \textit{pipe}) con cui -utilizzare in user space l'oggetto ``\textsl{buffer in kernel space}''. + dallo stesso Linus Torvalds in \url{http://kerneltrap.org/node/6505}.} si +tratta semplicemente di una funzione che consente di fare in maniera del tutto +generica delle operazioni di trasferimento di dati fra un file e un buffer +gestito interamente in kernel space. In questo caso il cuore della funzione (e +delle affini \func{vmsplice} e \func{tee}, che tratteremo più avanti) è +appunto l'uso di un buffer in kernel space, e questo è anche quello che ne ha +semplificato l'adozione, perché l'infrastruttura per la gestione di un tale +buffer è presente fin dagli albori di Unix per la realizzazione delle +\textit{pipe} (vedi sez.~\ref{sec:ipc_unix}). Dal punto di vista concettuale +allora \func{splice} non è altro che una diversa interfaccia (rispetto alle +\textit{pipe}) con cui utilizzare in user space l'oggetto ``\textsl{buffer in + kernel space}''. Così se per una \textit{pipe} o una \textit{fifo} il buffer viene utilizzato come area di memoria (vedi fig.~\ref{fig:ipc_pipe_singular}) dove appoggiare i @@ -5090,12 +5089,12 @@ di dati in realtà nella implementazione di queste system call non è affatto detto che i dati vengono effettivamente spostati o copiati, il kernel infatti realizza le \textit{pipe} come un insieme di puntatori\footnote{per essere precisi si tratta di un semplice buffer circolare, un buon articolo sul tema - si trova su \href{http://lwn.net/Articles/118750/} - {\textsf{http://lwn.net/Articles/118750/}}.} alle pagine di memoria interna -che contengono i dati, per questo una volta che i dati sono presenti nella -memoria del kernel tutto quello che viene fatto è creare i suddetti puntatori -ed aumentare il numero di referenze; questo significa che anche con \func{tee} -non viene mai copiato nessun byte, vengono semplicemente copiati i puntatori. + si trova su \url{http://lwn.net/Articles/118750/}.} alle pagine di memoria +interna che contengono i dati, per questo una volta che i dati sono presenti +nella memoria del kernel tutto quello che viene fatto è creare i suddetti +puntatori ed aumentare il numero di referenze; questo significa che anche con +\func{tee} non viene mai copiato nessun byte, vengono semplicemente copiati i +puntatori. % TODO?? dal 2.6.25 splice ha ottenuto il supporto per la ricezione su rete