AIO на OSX: это реализовано в ядре или с пользовательскими потоками?Другие опции? - PullRequest
3 голосов
/ 05 мая 2011

Я работаю над своей небольшой платформой c ++ и у меня есть файловый класс, который также должен поддерживать асинхронное чтение и запись.Единственное решение, кроме использования синхронного файлового ввода-вывода внутри некоторых рабочих потоков, которое я нашел, - это aio.В любом случае, я осматривался и где-то читал, что в Linux aio даже не реализована в ядре, а в пользовательских потоках.То же самое верно для OSX?Другая проблема связана с функциональностью обратных вызовов aio, которая должна создавать дополнительный поток для каждого обратного вызова, так как вы не можете назначить определенный поток или пул потоков, чтобы позаботиться об этом (сигналы для меня не вариант).Итак, вот вопросы, вытекающие из этого:

  • Реализован ли aio в ядре osx и, следовательно, он, скорее всего, лучше моей собственной многопоточной реализации?

  • Может ли система обратного вызова, порождающая поток для каждого обратного вызова, стать узким местом на практике?

  • Если aio не стоит использовать в osx, есть ли другие альтернативы в unix?в какао?в углероде?

  • Или я должен просто эмулировать асинхронный ввод-вывод со своим собственным пулом потоков?

Какой у вас опыт по этому вопросу?

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

Вы можете точно увидеть, как AIO реализовано в OSX справа здесь .

Реализация использует потоки ядра, одну очередь заданий, которые каждый поток всплывает и выполняет блокирующим образом в очереди приоритетов на основе приоритета каждого запроса (по крайней мере, так это выглядит на первый взгляд).

Вы можете настроить количество потоков и размер очереди с помощью sysctl. Чтобы увидеть эти параметры и значения по умолчанию, выполните sysctl -a | grep aio

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

По моему опыту, чтобы иметь смысл использовать AIO, эти ограничения должны быть намного выше.

Что касается обратных вызовов в потоках, я не верю, что Mac OS X поддерживает это. Это только делает уведомления о завершении через сигналы (см. Источник).

Скорее всего, вы могли бы справиться с работой в своем собственном пуле потоков. Одна вещь, которую вы могли бы сделать лучше, чем текущая реализация darwin, - отсортировать задания чтения по физическому расположению на диске (см. fcntl и F_LOG2PHYS), что может даже дать вам преимущество.

0 голосов
/ 25 июня 2013

@ Moka : Сожалею, что вы ошиблись в реализации linux, так как в ядре 2.6 есть реализация AIO для ядра, которая поставляется в libaio (libaio.h)

Реализация, которая не использует потоки ядра, а вместо этого использует пользовательские потоки, - это POSIX.1 AIO, и она делает это таким образом, чтобы сделать его более переносимым, поскольку не все ОС на основе Unix поддерживают события завершения на уровне ядра.

...