Bargest писал(а):
Никак не пойму: как тогда такие драйверы будут работать асинхронно? Если без потока - значит когда произойдет обращение к драйверу, его код будет выполняться прямо там, где к нему обратились, и будет работать до упора. На однопроцессорной системе тогда асинхронный IO отпадает как таковой с этими драйверами, а на многопроцессорной придется делать что-то вроде потоков (только не переключающихся, включил - и работает, пока не выполнит всю работу) для каждого процессора.
А я не понимаю, чего здесь непонятного
Асинхронный ввод-вывод -- это отсутствие прямой связи между временем работы задачи (потока) пользовательского режима и временем выполнения собственно операции ввода-вывода (как времени работы внешнего устройства, так и времени работы драйвера или всего набора драйверов, необходимых для выполнения данной операции). Грубо говоря:
1. Задача выдаёт системе запрос "начать ввод-вывод", указывая устройство, вид операции (чтение, запись и т.д.), адрес и размер буфера ввода-вывода и т.п. информацию.
2. Менеджер ввода-вывода выполняет общую часть работы по запуску ввода-вывода: проверяет положение буфера, фиксирует его страницы в памяти и т.д. и т.п. Задача в это время, понятное дело, стоит, ведь система обрабатывает её запрос (и может вернуть ошибку, если какие-то параметры будут неправильными).
3. Менеджер ввода-вывода ставит запрос ввода-вывода в очередь к устройству, а в некоторых случаях (если очередь была пуста, например) сразу же вызывает драйвер для запуска операции.
4. Если драйвер был вызван, он запускает операцию, программируя соответствующим образом регистры устройства. Если же он не был вызван в этот момент, операция будет запущена позже (например, сейчас устройство уже выполняет ранее начатую операцию, и новая будет запущена, когда текущая закончится -- именно поэтому у каждого устройства есть своя очередь запросов ввода-вывода).
5. Менеджер ввода-вывода на этом завершил обработку запроса задачи на запуск ввода-вывода, этому задача вновь получает управление и может выполняться дальше. Заметим, что параллельно выполняется (ну или ожидает в очереди) выданный ей запрос ввода-вывода. Таким образом, дальнейший ход работы задачи и ввода-вывода между собой не связаны, т.е. они выполняются асинхронно.
6. Дальнейшее обслуживание устройства драйвером (обработка поступающих от него прерываний) идёт полностью асинхронно по отношению к задаче, запустившей ввод-вывод. Эта задача может работать или стоять -- драйверу это без разницы, он работает полностью сам по себе.
7. Когда задаче нужно гарантированно убедиться, что запущенный ввод-вывод закончен, она вызывает системный сервис ожидания, указывая в нём событие, ассоциированное с запущенной операцией ввода-вывода. Начиная с этого момента, задача будет стоять до тех пор, пока драйвер не известит менеджер ввода-вывода о завершении операции, а МВВ не сообщит об этом задаче, установив ожидаемое ею событие (ну или вызвав процедуру обратного вызова, пользуясь терминологией Винды -- это уже не суть важно).
Таким образом, операция ввода-вывода и задача работают параллельно друг другу и асинхронно, т.е. мы не можем сказать, что именно происходит в задаче в тот момент, когда выполняется такой-то этап операции ввода-вывода, и наоборот. Именно в этом отличие от синхронного ввода-вывода, когда задача (поток), запустив операцию, сразу же останавливается до его завершения, т.е. они не могут работать параллельно.