Не могу понять. Вот допустим программе нужно прочитать файл. Она обращается к ОС, ОС вызывает драйвер. Верно?
Драйвер создает новый поток в котором читает данные? Поток блокируется до завершения чтения или устройству отправляется запрос, а устройство само возвращает данные в буфер и стучит драйверу, что оно выполнило обработку?
Поток выполнения? Это ведь концепция операционной системы, не драйвера.
В общем виде блокирующее чтение происходит по следующему сценарию – системный вызов чтения из программы -> ядро общается с драйвером -> системный вызов завершается. Никаких процессов или подобного драйвер не создает, это задачи операционной системы.
В Windows драйвера находятся в ядре. Новый поток не создается, драйвер лишь обрабатывает поступающие запросы на чтение и перебрасывает их другим драйверам, например, usb mass storage или ahci. Которые, в свою очередь, взаимодействуют с хост-контроллерами USB или ATA.
Сам вызов ReadFile блокирует выполнение программы до завершения операции (но можно и асинхронно)
beduin01: асинхронное чтение файла? Посмотрите документацию к функции ReadFileEx. одним вызовом запускается выполнение действия, далее можно проверять состояние запроса, выполнилось чтение или ещё нет.
обработка без создания нового потока? представьте сервис, обрабатывающий поступающие запросы по очереди. тогда запросом на чтение файла мы лишь помещаем в эту очередь новый запрос.
к примеру, я делал однопоточный HTTP прокси-сервер, при этом к нему могли подключаться сотни клиентов одновременно. создавать новый поток на каждую мелочь не нужно, это потребляет ресурсы на переключение контекста
15432: я примерно представляю что такое асинхронность, но не могу понять в чем идет процесс ее выполнения. Кто-то же к примеру должен контролировать как файл читается, сколько уже прочитано и тд.
beduin01: драйвер и контролирует. где-то хранится контекст запроса, где указано, сколько уже прочитано. как только поступает новая порция данных от устройства, контекст обновляется.
так и сидит себе драйвер. получил запрос на чтение - разослал команды устройствам "читай вот такие-вот блоки", получил блоки данных - обновил контексты, все данные пришли - сообщил программе, что чтение завершено. ну и так далее. всё это, в основном, строится на очередях, списках и семафорах. пока данных нет и очереди пусты, процесс драйвера "спит". при добавлении нового запроса или ответа в очередь, драйвер просыпается и начинает обрабатывать данные. много потоков не требуется