Вы можете точно увидеть, как AIO реализовано в OSX справа здесь .
Реализация использует потоки ядра, одну очередь заданий, которые каждый поток всплывает и выполняет блокирующим образом в очереди приоритетов на основе приоритета каждого запроса (по крайней мере, так это выглядит на первый взгляд).
Вы можете настроить количество потоков и размер очереди с помощью sysctl
. Чтобы увидеть эти параметры и значения по умолчанию, выполните sysctl -a | grep aio
kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4
По моему опыту, чтобы иметь смысл использовать AIO, эти ограничения должны быть намного выше.
Что касается обратных вызовов в потоках, я не верю, что Mac OS X поддерживает это. Это только делает уведомления о завершении через сигналы (см. Источник).
Скорее всего, вы могли бы справиться с работой в своем собственном пуле потоков. Одна вещь, которую вы могли бы сделать лучше, чем текущая реализация darwin, - отсортировать задания чтения по физическому расположению на диске (см. fcntl
и F_LOG2PHYS
), что может даже дать вам преимущество.