Рассмотрим приложение, которое ограничено ЦП, но также имеет требования к высокопроизводительному вводу-выводу.
Я сравниваю ввод-вывод файлов Linux с Windows и не понимаю, как epoll вообще поможет программе Linux. Ядро сообщит мне, что файловый дескриптор «готов к чтению», но мне все равно нужно вызвать блокировку read (), чтобы получить мои данные, и если я хочу прочитать мегабайты, совершенно ясно, что это приведет к блокировке.
В Windows я могу создать дескриптор файла с установленным OVERLAPPED, а затем использовать неблокирующий ввод-вывод и получать уведомления, когда ввод-вывод завершается, и использовать данные из этой функции завершения. Мне не нужно тратить время настенных часов на уровне приложения на ожидание данных, а это означает, что я могу точно настроить количество потоков в соответствии с количеством ядер и получить 100% эффективное использование ЦП.
Если мне нужно имитировать асинхронный ввод-вывод в Linux, то мне нужно выделить для этого некоторое количество потоков, и эти потоки будут тратить немного времени на выполнение задач ЦП и много времени на блокировку ввода-вывода, плюс будут накладные расходы при обмене сообщениями между этими потоками. Таким образом, я буду либо чрезмерно подписываться, либо недоиспользовать ядра процессора.
Я смотрел на mmap () + madvise () (WILLNEED) как на "асинхронный ввод-вывод для бедняков", но он все еще не доходит до конца, потому что я не могу получить уведомление, когда это будет сделано - у меня "угадывать", и если я угадываю "неправильно", я буду блокировать доступ к памяти, ожидая прихода данных с диска.
В Linux, похоже, начинается асинхронный ввод-вывод в io_submit, и, похоже, также есть реализация POSIX aio в пользовательском пространстве, но так было некоторое время, и я не знаю никого, кто бы поручился за эти системы в критических ситуациях. , высокопроизводительные приложения.
Модель Windows работает примерно так:
- Выполните асинхронную операцию.
- Свяжите асинхронную операцию с конкретным портом завершения ввода-вывода.
- Дождитесь завершения операций на этом порту
- Когда ввод-вывод завершен, поток, ожидающий порта, разблокируется и возвращает ссылку на ожидающую операцию ввода-вывода.
Шаги 1/2 обычно выполняются как единое целое. Шаги 3/4 обычно выполняются с пулом рабочих потоков, а не (обязательно) с тем же потоком, который выполняет ввод-вывод. Эта модель в некоторой степени похожа на модель, предоставляемую boost :: asio, за исключением того, что boost :: asio фактически не предоставляет вам асинхронный блочный (дисковый) ввод-вывод.
Отличие epoll от Linux в том, что на шаге 4 ввода-вывода еще не произошло - он поднимает шаг 1 за шагом 4, что является «обратным», если вы уже точно знаете, что вам нужно.
Запрограммировав большое количество встроенных, настольных и серверных операционных систем, я могу сказать, что эта модель асинхронного ввода-вывода очень естественна для определенных типов программ. Это также очень высокая пропускная способность и низкие накладные расходы. Я думаю, что это один из оставшихся реальных недостатков модели ввода-вывода Linux на уровне API.
read
илиwrite
. - person Celada   schedule 17.11.2012