Domanda

Sto lavorando al mio piccolo framework C ++ e ho una classe di file che dovrebbe supportare anche la lettura e la scrittura asincrona. L'unica soluzione diversa dall'utilizzo di i / o file sincrono all'interno di alcuni thread di lavoro che ho trovato è aio. Comunque stavo guardando in giro e ho letto da qualche parte, che in Linux, aio non è nemmeno implementato nel kernel ma piuttosto con i thread dell'utente. Lo stesso vale per OSX? Un'altra preoccupazione è la funzionalità di callback di aio che deve generare un thread aggiuntivo per ogni callback poiché non è possibile assegnare un determinato thread o threadpool per occuparsene (i segnali non sono un'opzione per me). Quindi ecco le domande che ne derivano:

  • aio è implementato nel kernel di osx e quindi è molto probabilmente migliore della mia implementazione con thread?

  • Può il sistema di callback, che genera un thread per ogni callback, in pratica diventare un collo di bottiglia?

  • Se non vale la pena usare aio su osx, ci sono altre alternative su unix? nel cacao? in carbonio?

  • O dovrei semplicemente emulare i / o asincrono con il mio threadpool?

Qual è la tua esperienza in materia?

È stato utile?

Soluzione

Puoi vedere esattamente come AIO è implementato su OSX a destra qui .

L'implementazione utilizza i thread del kernel, una coda di lavori che ogni thread apre ed esegue in modo bloccante in una coda di priorità basata sulla priorità di ciascuna richiesta (almeno questo è quello che sembra a prima vista).

È possibile configurare il numero di thread e la dimensione della coda con sysctl. Per vedere queste opzioni e i valori predefiniti, esegui sysctl -a | grep aio

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

Nella mia esperienza, affinché abbia senso utilizzare AIO, questi limiti devono essere molto più alti.

Per quanto riguarda i callback nei thread, non credo che Mac OS X lo supporti. Effettua solo notifiche di completamento tramite segnali (vedi sorgente).

Probabilmente potresti fare altrettanto bene nel tuo pool di thread. Una cosa che potresti fare meglio dell'attuale implementazione di darwin è ordinare i tuoi lavori di lettura in base alla posizione fisica sul disco (vedi fcntl e F_LOG2PHYS) che potrebbero persino darti un vantaggio.

Altri suggerimenti

@Moka : Mi dispiace dover dire che ti sbagli sull'implementazione di Linux, a partire dal kernel 2.6 c'è un'implementazione del kernel di AIO, che arriva in libaio (libaio.h)

L'implementazione che non utilizza i thread del kernel ma utilizza invece i thread dell'utente è POSIX.1 AIO, e lo fa in questo modo per renderlo più portabile, poiché non tutti i sistemi operativi basati su unix supportano eventi di completamento a livello di kernel.

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