Domanda

Ci sono pagine sparsi in giro per il web che descrivono POSIX AIO strutture in diverse quantità di dettaglio.Nessuno di loro sono terribilmente recenti.Non è chiaro che cosa, esattamente, si sta descrivendo.Per esempio, la "ufficiale" (?) sito web per il kernel Linux di I/O asincrone supporto qui dice che le prese non il lavoro, ma il "aio.h" pagine di manuale sul mio Ubuntu 8.04.1 workstation tutti sembrano implicare che funziona per arbitrario descrittori di file.Poi c'è un altro progetto che sembra funzionare presso la biblioteca strato con anche meno di documentazione.

Mi piacerebbe sapere:

  • Qual è lo scopo di POSIX AIO?Dato che l'esempio più evidente di un'implementazione riesco a trovare dice che non supporta il socket, la cosa sembra strana anche a me.È solo per async I/O del disco?Se è così, perché l'hyper-generale API?Se non è così, perché I/O del disco la prima cosa che ha attaccato?
  • Dove ci sono esempio completa POSIX AIO programmi che posso guardare?
  • Qualcuno utilizzi, vero?
  • Quali piattaforme di supporto POSIX AIO?Quali parti di esso funzionano?Davvero qualcuno supporto implicite "I/O per qualsiasi FD" che <aio.h> sembra promettere?

L'altro multiplexing meccanismi disponibili per me sono perfettamente bene, ma i frammenti casuali di informazioni galleggianti intorno là fuori mi hanno fatto curioso.

È stato utile?

Soluzione

I/O di rete non è una priorità per AIO, perché ognuno di scrittura POSIX server di rete utilizza un evento a base di non-blocking approccio.Il vecchio stile Java "miliardi di blocco thread" approccio succhia orribilmente.

Scrittura del disco I/O è già tamponata e di lettura del disco I/O può essere prefetched nel buffer utilizzando funzioni come posix_fadvise.Che lascia diretto, senza buffer I/O del disco come unico scopo utile per AIO.

Diretto, senza buffer I/O è realmente utile solo per database transazionali, e quelli che tendono a scrivere i propri thread o processi per gestire il loro disco I/O.

Così, alla fine, che lascia POSIX AIO nella condizione di non servire qualsiasi scopo utile.Non la uso.

Altri suggerimenti

Facendo presa I/O in modo efficiente è stato risolto con kqueue, epoll, IO le porte di completamento e simili.Facendo asincrona file di I/O è una sorta di late comer (a parte windows' overlapped I/O e solaris presto il supporto allo standard posix AIO).

Se stai cercando di fare presa I/O, è probabilmente meglio usare uno dei suddetti meccanismi.

Lo scopo principale di AIO è, quindi, per risolvere il problema del disco asincrona di I/O.Questo è più probabile perché Mac OS X supporta solo AIO per i file normali, e non prese dal kqueue che fa tanto meglio, comunque).

Le operazioni di scrittura sono in genere memorizzati nella cache del kernel, e lavato in un secondo momento.Per esempio, quando la testina di lettura dell'unità passa dalla posizione in cui il blocco è di essere scritto.

Tuttavia, per le operazioni di lettura, se si desidera che il kernel di classificare e ordinare la vostra legge, AIO è davvero l'unica opzione.Ecco perché il kernal può (teoricamente) fare meglio di qualsiasi utente a livello di applicazione:

  • Il kernel vede tutti I/O del disco, non solo le applicazioni del disco di posti di lavoro, e si può ordinare a livello globale
  • Il kernel (maggio) sapere dove il disco testina di lettura è, e può prendere la lettura di posti di lavoro si passa su di esso in ordine ottimale, a muovere la testa, la distanza più breve
  • Il kernel è in grado di approfittare di native command queuing per ottimizzare le operazioni di lettura ulteriore
  • Si può essere in grado di emettere ulteriori operazioni di lettura per sistema di chiamata utilizzando lio_listio() che con readv(), specialmente se la legge non lo sono (logicamente) contigui, il salvataggio di un po ' di chiamata di sistema overhead.
  • Il programma potrebbe essere un po ' più semplice con AIO dal momento che non hai bisogno di un thread aggiuntivo per il blocco di una lettura o una scrittura chiamata.

Detto questo, posix AIO ha un abbastanza imbarazzante interfaccia, per esempio:

  • L'unico efficiente e ben supportato media del caso le richiamate tramite segnali, che lo rende difficile da usare in una biblioteca, in quanto significa che utilizzando il segnale di numeri dal processo globale di segnale dello spazio dei nomi.Se il sistema operativo non supporta realtime segnali, significa anche per scorrere tutte le vostre richieste in attesa di capire quale effettivamente finito (questo è il caso per Mac OS X, per esempio, non Linux).La cattura di segnali in un ambiente multithread fa anche per alcune difficili restrizioni.In genere è possibile non reagire all'evento all'interno del gestore di segnale, ma devi alzare un segnale, scrivere un tubo o utilizzare signalfd() (su linux).
  • lio_suspend() ha gli stessi problemi come selezionare() non, non scala molto bene con il numero di posti di lavoro.
  • lio_listio(), come attuato ha abbastanza limitato numero di posti di lavoro si può passare, e non è banale trovare questo limite in modo portatile.Devi chiamare sysconf(_SC_AIO_LISTIO_MAX), che potrebbe non riuscire, nel qual caso è possibile utilizzare il AIO_LISTIO_MAX definire, che non sono necessariamente definito, ma quindi è possibile utilizzare 2, che è definita come garantito per essere supportato.

Come per l'applicazione del mondo reale utilizzando posix AIO, si potrebbe dare un'occhiata a lighttpd (luminosa), che ha anche inviato una la misurazione delle performance quando l'introduzione del supporto.

Più piattaforme posix supporta posix AIO da ora (Linux, BSD, Solaris, AIX, tru64).Windows supporta, tramite il suo file sovrapposti di I/O.La mia comprensione è che solo Solaris, Windows e Linux supporta veramente async.file I/O tutto il senso giù per il conducente, mentre gli altri Sistemi operativi emulare il async.I/O con i thread del kernel.Linux che è l'eccezione, la sua posix AIO attuazione in glibc emula operazioni asincrone con utente a livello di thread, mentre il nativo di I/O asincrone interfaccia (io_submit (), ecc.) sono veramente asincrona tutto il senso giù per il driver, supponendo che il driver supporta.

Credo sia abbastanza comune tra i Sistemi operativi non supportano posix AIO per qualsiasi fd, ma si limitano a file regolari.

Un libtorrent sviluppatore fornisce un report su questo: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

C'è aio_write - implementato in glibc;prima chiamata della aio_read o aio_write funzione genera un numero di modalità utente thread, aio_write o aio_read richieste post di quel thread, il thread non pread/pwrite e quando è terminata la risposta viene inviato al bloccati thread chiamante.

C'è anche la 'vera' aio - supportato dal kernel livello (bisogno libaio per questo, vedere il io_submit chiamata http://linux.die.net/man/2/io_submit );anche bisogno di O_DIRECT per che (può anche non essere supportata da tutti i sistemi di file, ma quelli principali la supportano)

vedi qui:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

Differenza tra POSIX AIO e libaio su Linux?

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