Domanda

Prelude

sendfile() è una chiamata di sistema estremamente utile per due motivi:

In primo luogo, si tratta di meno codice di un read() / write() (o recv() / send() se si preferisce che jive) loop.
In secondo luogo, si tratta di più veloce (meno chiamate di sistema, implementazione possono copiare tra i dispositivi senza di buffer, ecc ...) che i metodi di cui sopra.

meno codice. Più efficiente. Impressionante.

In UNIX, tutto è (soprattutto) un file. Questo è il brutto territorio dalla collisione della teoria platonica e la pratica del mondo reale. Capisco che le prese sono fondamentalmente diversi rispetto ai file che risiedono su un device. Non ho scavato attraverso le fonti di Linux / * BSD / Darwin / qualunque OS implementa sendfile() sapere perché questo syscall specifica è limitato a scrivere ai socket (in particolare, in streaming i socket).

Voglio solo sapere ...

Domanda

Quello che è limitante sendfile() dal permettendo il descrittore di file di destinazione di essere qualcosa oltre ad una presa di corrente (come un file su disco, o un tubo)?

È stato utile?

Soluzione

In sostanza, l'unica cosa che limita è che "di nessuno scritto il codice ancora".

Tuttavia, mi sembra di capire che la ragione che nessuno quelli scritto il codice per quei due casi di cui parli è che entrambi richiederebbero i dati da copiare, che rimuove gran parte del vantaggio di utilizzare sendfile, in primo luogo.

  • Per un sendfile di file su file, avresti bisogno di una copia, perché altrimenti la stessa pagina dovrebbe essere nel pagecache sia come una pagina pulita nel file di origine e una pagina sporca nel file di destinazione . Non credo che il pagecache è costruito per gestire questo caso al momento (anche se, naturalmente, questo potrebbe essere cambiato se non ci fosse sufficiente motivazione).

  • Per un sendfile di file-to-pipe, è necessario una copia a prescindere perché il processo di destinazione ha bisogno di ottenere una copia privata scrivibile dei dati. In ogni caso, per la maggior parte degli usi di questo caso abbiamo già mmap.

Altri suggerimenti

Mi pare di ricordare che si trattava di una limitazione introdotta nei primi mesi del Linux 2.6 (2.4 non ha avuto la limitazione).

Dal rilascio 2.6.17 Linux ha la chiamata di sistema splice () che è simile; più flessibile, ma leggermente meno efficiente. Linus parlato ri-attuazione sendfile in termini di splice (). Vedere http://kerneltrap.org/node/6505

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top