Блокирующиеся, не блокирующиеся и асинхронные системные вызовы
Функции базовой подсистемы ввода-вывода
Базовая подсистема ввода-вывода, BIOS, служит посредником между процессами вычислительной системы и набором драйверов. Системные вызовы для выполнения операций ввода-вывода трансформируются ею в вызовы функций необходимого драйвера устройства.
Кроме того, BIOS предоставляет вычислительной системе следующие услуги:
· поддержка блокирующихся, не блокирующихся и асинхронных системных вызовов,
· буферизация и кэширование входных и выходных данных,
· осуществление spooling'a и монопольного захвата внешних устройств,
· обработка ошибок и прерываний, возникающих при операциях ввода-вывода,
· планирование последовательности запросов на выполнение этих операций.
Рассмотрим их подробнее.
Все системные вызовы, связанные с осуществлением операций ввода-вывода, можно разбить на три группы по способам реализации взаимодействия процесса и устройства ввода-вывода.
- применение блокирующего вызова приводит к блокировке инициировавшего его процесса, т. е. процесс переводится операционной системой из состояния исполнение в состояние ожидание. Завершив выполнение всех операций ввода-вывода, предписанных системным вызовом, операционная система переводит процесс из состояния ожидание в состояние готовность.
- В простейшем случае процесс, применивший не блокирующийсявызов, не переводится в состояние ожидание вообще. Системный вызов возвращается немедленно, выполнив предписанные ему операции ввода-вывода. Типичным случаем применения не блокирующегося вызова является периодическая проверка на поступление информации с клавиатуры.
- К третьей группе относятся асинхронные системные вызовы. Процесс, использовавший асинхронный системный вызов, никогда в нем не блокируется. Системный вызов инициирует выполнение необходимых операций ввода-вывода и немедленно возвращается, после чего процесс продолжает свою регулярную деятельность.
Необходимо четко понимать разницу между не блокирующимися и асинхронными вызовами.
Не блокирующийся системный вызов для выполнения операции read вернется немедленно, но может прочитать запрошенное количество байтов, меньшее количество или вообще ничего.
Асинхронный системный вызов для этой операции также вернется немедленно, но требуемое количество байтов рано или поздно будет прочитано в полном объеме.