2015-03-20 3 views
0

Я хотел бы понять, как реализация блокирующих системных вызовов ввода-вывода отличается от неблокирующих? Googling это не помогло, любые ссылки или ссылки были бы весьма признательны.реализация блокирующих системных вызовов в Linux

Спасибо.

+0

http://stackoverflow.com/questions/7931537/whats-the-difference-between-asynchronous-non-blocking-event-base-architectu/9489547#9489547 – Drazisil

ответ

1

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.

Смежные вопросы