Системные вызовы. Моменты перепланировки

Моменты перепланировки

Лекция 5

Подведение итогов. Домашнее задание.

Для реализации алгоритма планирования ОС должна получать управление всякий раз, когда и системе происходит событие, требующее перераспределения процессорного времени. К таким событиям могут быть отнесены следующие:

1. Прерывание от таймера, сигнализирующее, что время, отведенное активной задаче на выполнение, закончилось. Планировщик переводит задачу в состояние готовности и выполняет перепланирование.

2. Активная задача выполнила системный вызов, связанный с запросом на ввод-вывод или на доступ к ресурсу, который в настоящий момент занят (например, файл данных). Планировщик переводит задачу в состояние ожидания и выполняет перепланирование.

3. Активная задача выполнила системный вызов, связанный с освобождением ресурса. Планировщик проверяет, не ожидает ли этот ресурс какая-либо задача. Если да, то эта задача переводится из состояния ожидания в состояние готовности. При этом, возможно, что задача, которая получила ресурс, имеет более высокий приоритет, чем текущая активная задача. После перепланирования более приоритетная задача получает доступ к процессору, вытесняя текущую задачу.

4. Внешнее (аппаратное) прерывание, которое сигнализирует о завершении периферийным устройством операции ввода-вывода, переводит соответствующую задачу в очередь готовых, и выполняется планирование.

5. Внутреннее прерывание сигнализирует об ошибке, которая произошла в результате выполнения активной задачи. Планировщик снимает задачу и выполняет перепланирование.

При возникновении каждого из этих событий планировщик выполняет просмотр очередей и решает вопрос о том, какая задача будет выполняться следующей. Помимо указанных существует и ряд других событий (часто связанных с системными вызовами), требующих перепланировки. Например, запросы приложений и пользователей на создание новой задачи или повышение приоритета уже существующей задачи создают новую ситуацию, которая требует пересмотра очередей и, возможно, переключения процессора.

В системах реального времени для отработки статического расписания планировщик активизируется по прерываниям от таймера. Кроме прерываний от таймера в системах реального времени перепланирование задач может происходить по прерываниям от внешних устройств — различного вида датчиков и исполнительных механизмов.

Системный вызов - приложение обращается к операционной системе для выполнения действия, оформленного как процедура (или набор процедур) кодового сегмента ОС. С помощью системного вызова можно упростить прикладную программу или выполнить действия, запрещенные в пользовательском режиме, например обмен данными с устройством ввода-вывода.

Реализация системных вызовов должна удовлетворять следующим требованиям:

- обеспечивать переключение в привилегированный режим;

- обладать высокой скоростью вызова процедур ОС;

- обеспечивать по возможности единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работает ОС;

- допускать легкое расширение набора системных вызовов;

- обеспечивать контроль со стороны ОС за корректным использованием системных вызовов.

Первое требование для большинства аппаратных платформ может быть выполнено только с помощью механизма программных прерываний. Некоторые из этих требований взаимно противоречивы.

Для обеспечения высокой скорости было бы полезно использовать векторные свойства системы программных прерываний, имеющиеся во многих процессорах, то есть закрепить за каждым системным вызовом определенное значение вектора. Приложение при таком способе вызова непосредственно указывает в аргументе запроса значение вектора, после чего управление немедленно передается требуемой процедуре операционной системы (рисунок 5.1, а). Однако этот децентрализованный способ передачи управления привязан к особенностям аппаратной платформы, а также не позволяет операционной системе легко модифицировать набор системных вызовов и контролировать их использование. Например, в процессоре Pentium количество системных вызовов определяется количеством векторов прерываний, выделенных для этой цели из общего пула в 256 элементов (часть которых используется под аппаратные прерывания и обработку исключений). Добавление нового системного вызова требует от системного программиста поиска свободного элемента в таблице прерываний, которого к тому же на каком-то этапе развития ОС может и не оказаться.

В большинстве ОС системные вызовы обслуживаются по централизованной схеме, основанной на существовании диспетчера системных вызовов (рисунок 5.1, б). При любом системном вызове приложение выполняет программное прерывание с определенным и единственным номером вектора. Например, ОС Linux использует для системных вызовов команду INT 80h, а ОС Windows NT (при работе на платформе Pentium) — INT 2Eh. Перед выполнением программного прерывания приложение передает операционной системе номер системного вызова, который является индексом в таблице адресов процедур ОС, реализующих системные вызовы (таблица sysent на рисунке 5.1). Способ передачи номера системного вызова зависит от реализации, например номер можно поместить в определенный регистр общего назначения процессора или передать через стек. Также некоторым способом передаются аргументы системного вызова, они могут, как помещаться в регистры общего назначения, так и передаваться через стек или массив, находящийся в оперативной памяти.

Диспетчер системных вызовов представляет собой простую программу, которая сохраняет содержимое регистров процессора в системном стеке (поскольку в результате программного прерывания процессор переходит в привилегированный режим), проверяет, попадает ли запрошенный номер вызова в поддерживаемый ОС диапазон и передает управление процедуре ОС, адрес которой задан в таблице адресов системных вызовов.

Рисунок 5.1 - Децентрализованная и централизованная схемы обработки системных вызовов

Процедура реализации системного вызова извлекает из системного стека аргументы и выполняет заданное действие.

После завершения работы системного вызова управление возвращается диспетчеру, при этом он получает также код завершения этого вызова. Диспетчер восстанавливает регистры процессора, помещает в определенный регистр код возврата и выполняет инструкцию возврата из прерывания, которая восстанавливает непривилегированный режим работы процессора.

Для всех системных вызовов в библиотеках, предоставляемых компилятором С, имеются так называемые «заглушки» - «stub». Каждая заглушка оформлена как С-функция и содержит несколько ассемблерных строк, выполняющих инструкции программного прерывания. Пользовательская программа вызывает заглушку, которая вызывает процедуру ОС.

Операционная система может выполнять системные вызовы в синхронном или асинхронном режимах. Синхронный системный вызов – процесс приостанавливается (переводится планировщиком ОС в состояние ожидания) до тех пор, пока системный вызов не выполнит всю требующуюся от него работу (рисунок 5.2, а). После этого планировщик переводит процесс в состояние готовности и при очередном выполнении процесс гарантированно может воспользоваться результатами завершившегося к этому времени системного вызова. Синхронные вызовы - блокирующие, вызвавший системное действие процесс блокируется до его завершения.

Асинхронный системный вызов не переводит процесс в режим ожидания и после выполнения некоторых начальных системных действий управление возвращается прикладному процессу (рисунок 5.2, б).

Рисунок 5.2 - Синхронные и асинхронные системные вызовы

Большинство системных вызовов в операционных системах являются синхронными, что избавляет приложение от работы по выяснению момента появления результата вызова. Вместе с тем в новых версиях операционных систем количество асинхронных системных вызовов постепенно увеличивается, что позволяет разрабатывать сложные приложения. Асинхронные системные вызовы нужны в операционных системах на основе микроядерного подхода, где в пользовательском режиме работает часть ОС.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: