2012-01-07 11 views
41

Quello che mi sembra per capire:Differenza tra POSIX AIO e libaio su Linux?

POSIX AIO API sono prototipati in <aio.h> e si collegano con il vostro programma di librt (-lrt), mentre i libaio API in <libaio.h> e il vostro programma è collegato con libaio (-laio).

Quello che non riesco a capire: Maniglia

1.Does il kernel l'uno di questi metodi in modo diverso?

2. Il flag O_DIRECT è obbligatorio per l'utilizzo di entrambi?

Come accennato in this post, libaio funziona bene senza O_DIRECT quando si utilizza libaio .Okay, capito, ma:

Secondo il R.Love Linux sistema di programmazione libro, Linux supporta AIO (che presumo sia POSIX AIO) su file regolari solo se aperto con O_DIRECT. Ma un piccolo programma che ho scritto (utilizzando aio.h, collegato con -lrt) che chiama aio_write su un file aperto senza il flag O_DIRECT funziona senza problemi.

risposta

51

Su Linux, le due implementazioni AIO sono fondamentalmente diverse.

POSIX AIO è un'implementazione a livello utente che esegue il normale I/O di blocco in più thread, dando quindi l'illusione che gli I/O siano asincroni. Il motivo principale per fare questo è che:

  1. funziona con qualsiasi file system
  2. funziona (essenzialmente) su qualsiasi sistema operativo (tenere presente che libc di GNU è portatile)
  3. funziona su file con buffering abilitato (cioè nessun O_DIRECT flag impostato)

lo svantaggio principale è che la profondità della coda (vale a dire il numero di operazioni in essere si può avere in pratica) è limitato dal numero di thread si sceglie di avere, che ha anche significa che un'operazione lenta su un disco può bloccare un'operazione in corso su un altro disco. Influisce anche su quale I/O (o quanti) viene visto dal kernel e dallo scheduler del disco.

Il kernel AIO (cioè io_submit() et.al.) è il supporto del kernel per operazioni di I/O asincrone, dove le richieste io sono effettivamente accodate nel kernel, ordinate da qualunque scheduler del disco, presumibilmente alcune delle vengono inoltrati (in un ordine alquanto ottimale si spera) al disco reale come operazioni asincrone (usando TCQ o NCQ). La restrizione principale con questo approccio è che non tutti i filesystem funzionano bene o affatto con I/O asincrono (e possono ricadere nella semantica di blocco), i file devono essere aperti con O_DIRECT che viene fornito con molte altre restrizioni sul Richieste di I/O. Se non riesci ad aprire i tuoi file con O_DIRECT, potrebbe comunque "funzionare", poiché in te vengono restituiti i dati corretti, ma probabilmente non viene eseguito in modo asincrono, ma sta ricadendo sulla semantica di blocco.

Inoltre tenere presente che io_submit() può effettivamente bloccare il disco in determinate circostanze.

+0

Grazie per la risposta.Quindi per POSIX AIO, O_DIRECT è * non * obbligatorio, ma per kerenel AIO, è (per assicurarsi che non si verifichi alcun fallback)? Questo sembra contraddire ciò che è menzionato nel libro.Nel codice del kernel, VFS ha questi aio_read/write funzioni chiamate (?) da aio_read/write chiamate di sistema (che è POXIS AIO e non kernel AIO). – itisravi

+1

Non ci sono aio_ * syscalls (http://linux.die.net/man/2/syscalls). Le funzioni di aio_ * che vedi in vfs sono probabilmente parte del kernel aio. le funzioni * user level * aio_ * non mappano 1: 1 alle chiamate di sistema. – Arvid

+1

@Arvid Ti piacerebbe approfondire in che tipo di circostanze io_submit() sta bloccando? (si cita a volte potrebbe bloccare il disco) – ARH

Problemi correlati