aio на osx: это реализовано в ядре или с помощью пользовательских потоков?Другие варианты?

StackOverflow https://stackoverflow.com/questions/5902662

Вопрос

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

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

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

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

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

Что вы думаете по этому поводу?

Это было полезно?

Решение

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

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

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

общий

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top