Какие операции ввода-вывода поддерживает менеджер ввода-вывода GHC?

Я читал о новом диспетчере ввода-вывода в GHC, который использует асинхронные уведомления о событиях и избегает блокировки ввода-вывода для достижения высокой пропускной способности.

Какими действиями ввода-вывода можно управлять с помощью нового кода асинхронного ввода-вывода? Чтение и запись файлов и сетевая активность? Доступ к базе данных? Существуют ли виды IO, когда менеджеру приходится прибегать к блокировке?


person Bill    schedule 15.12.2010    source источник
comment
Вау... 4 избранных, но только один плюс. Это странно.   -  person fuz    schedule 15.12.2010
comment
@FUZxxl В StackOverflow есть избранное? Я только что заметил это из-за вашего комментария.   -  person alternative    schedule 13.07.2011
comment
@monadic Да, есть. Просто нажмите кнопку «Пуск» прямо под вопросом, чтобы добавить его в избранное. Если что-то изменится, вы получите уведомление, как будто это ваш собственный вопрос.   -  person fuz    schedule 13.07.2011


Ответы (2)


Подходит любой файловый дескриптор, которым может управлять epoll/kqueue. Библиотеки, которым нужна асинхронная обработка ввода-вывода, должны сотрудничать с менеджером ввода-вывода путем

  • сделать файловые дескрипторы неблокирующими и
  • вызов функций threadWaitRead и threadWaitWrite в GHC.Conc перед повторной попыткой системного вызова, который ранее возвращал EWOULDBLOCK.

Это уже сделано для типов Handle и Socket. Если вы используете, например. привязка к библиотеке базы данных C приведет к блокировке, поскольку эта библиотека не будет взаимодействовать с диспетчером ввода-вывода.

person tibbe    schedule 16.12.2010
comment
Могу заметить, что tibbe, вероятно, самый знающий человек в этой области :) - person I GIVE CRAP ANSWERS; 16.12.2010

Несколько удовлетворительный ответ:

Сердцем нового менеджера ввода-вывода GHC является цикл событий kqueue()/epoll(). Поэтому я ожидаю, что все, что может быть построено поверх этого, будет иметь право - если не сейчас, то позже. В частности, это означает:

  • Файловый ввод-вывод
  • Сетевой ввод-вывод

Код (я просматривал его несколько месяцев назад, возможно, что-то изменилось) также содержит поддержку регистрации и запуска разного рода тайм-аутов через приоритетную (поисковую) очередь. Это говорит о том, что большинство sleep-подобных вызовов также могут быть связаны с интерфейсом.

О доступе к базе данных: конечно, вы часто получаете доступ к базе данных через сетевой сокет ввода-вывода, поэтому вызов forkIO и выполнение доступа к БД в отдельном потоке должны быть выполнимыми, быстрыми и безопасными. Обмен данными с остальной частью приложения может осуществляться с помощью одного из средств параллелизма, Chan или STM.TChan.

Я не думаю, что есть виды операций ввода-вывода, в которых менеджер должен прибегать к блокировке как таковой, но я могу представить, что некоторые библиотеки могут обойти новый диспетчер ввода-вывода и пойти прямо к яремной вене. Заблокируют, конечно.

person I GIVE CRAP ANSWERS    schedule 15.12.2010