Перекрытый ввод / вывод: некоторые функции все еще отсутствуют - PullRequest
1 голос
/ 05 ноября 2010

Одна из вещей, которые мне действительно нравятся в Windows API - это перекрывающийся ввод-вывод. Я написал десятки сетевых серверов, используя перекрывающиеся операции ввода-вывода (как для сокетов, так и для файлов) с ограниченным числом потоков. Я также пишу драйверы, так что хорошо знаю, как осуществляется параллельный ввод-вывод "за кулисами".

Единственное, что меня всегда беспокоило, это то, что некоторые функции API не поддерживают режим перекрытия. Например, создание файла (то есть вызов CreateFile) всегда работает синхронно. Это жаль, потому что эти методы могут поддерживать перекрывающийся (асинхронный) режим. Например, когда файл создается (или открывается) - драйвер файловой системы получает запрос IRP_MJ_CREATE, для которого он может (и обычно делает) возвращать STATUS_PENDING.

У меня вопрос: есть ли возможность открыть файл асинхронно? (но, пожалуйста, не говорите мне, чтобы создать другой поток, чтобы открыть файл).

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

Проблема с портами завершения ввода / вывода заключается в том, что (а) у вас слишком мало свободы и (б), несмотря на то, что вы находитесь в ядре, оно далеко не оптимально. В последнее время TrustLeap много шумил об этих проблемах с производительностью, сравнивая Windows с Linux.

Слишком печально, что Microsoft не следит за развитием событий (TrustLeap сказал, что Билл Стэпплс заявил, что пользователи IIS не хотят производительности и скорее хотят большей производительности).

Я полагаю, что эти позиции определяют платформы.

1 голос
/ 06 ноября 2010

Я подозреваю, что асинхронной версии не существует, потому что CreateFile по сути является блокирующей операцией: http://www.osronline.com/article.cfm?article=484 (прокрутите вниз до «Создает, что еще больше можно отменить):

Создание еще более отменяемо

Как вы можете себе представить, создание - это особая операция в O / S.Один особенно интересный момент заключается в том, что они всегда обрабатываются синхронно в диспетчере ввода-вывода, поэтому нет способа отправить асинхронную операцию создания.Кроме того, в предыдущих версиях O / S диспетчер ввода-вывода выполнял необработанное ожидание ядра, если запрос на создание был отложен из драйвера.Поэтому даже прекращение потока было недостаточно для отмены запроса на создание, который, по мнению пользователя, занимал слишком много времени.

1 голос
/ 05 ноября 2010

Извините, но невозможно открыть файл асинхронно без использования отдельного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...