Я хотел бы понять, как реализация блокирующих системных вызовов ввода-вывода отличается от неблокирующих? Googling это не помогло, любые ссылки или ссылки были бы весьма признательны.реализация блокирующих системных вызовов в Linux
Спасибо.
Я хотел бы понять, как реализация блокирующих системных вызовов ввода-вывода отличается от неблокирующих? Googling это не помогло, любые ссылки или ссылки были бы весьма признательны.реализация блокирующих системных вызовов в Linux
Спасибо.
http://faculty.salina.k-state.edu/tim/ossg/Device/blocking.html
Блокировка системного вызова будет поставить задачу (вызывающий поток) для сна (блокировать его запуск на CPU), и системный вызов будет возвращать только после того, как событие (или тайм-аута). Неблокирующий syscall не будет блокировать поток, он просто проверяет состояния ядра и немедленно возвращается.
Более подробное описание: http://www.makelinux.net/ldd3/chp-6-sect-2
один важный вопрос: как водитель реагирует, если он не может немедленно удовлетворить запрос? Призыв к чтению может появиться, когда нет данных, но ожидается больше в будущем. Или процесс может попытаться написать, но ваше устройство не готово принять данные, потому что ваш выходной буфер заполнен. Обычно вызывающий процесс не заботится о таких проблемах; программист просто рассчитывает вызвать чтение или запись и вернуть вызов после выполнения необходимой работы. Таким образом, в таких случаях ваш драйвер должен (по умолчанию) блокировать процесс, помещая его в режим ожидания до тех пор, пока запрос не сможет продолжить. ....
Есть несколько форм wait_event
функций ядра, чтобы блокировать поток вызывающего абонента, проверьте include/linux/wait.h
; нить может быть разбужена различными способами, например, с wake_up
/wake_up_interruptible
.
http://stackoverflow.com/questions/7931537/whats-the-difference-between-asynchronous-non-blocking-event-base-architectu/9489547#9489547 – Drazisil