aio su osx: è implementato nel kernel o con i thread dell'utente?Altre opzioni?
-
29-10-2019 - |
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?
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.