Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os3.doc
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
235.01 Кб
Скачать

3.4. Общая характеристика примитивов ядра

Итак, основными объектами ядра являются очереди процессов.

Ядро управляет процессами путем управления очередями.

Управление осуществляется двумя способами:

  1. Вызовом диспетчера по прерываниям;

  1. Вызовами процедур планировщика ядра.

Эти процедуры называются примитивами ядра. Напомню, что примитивами называются базовые операции некоторого уровня ОС.

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

Вызовы примитивов в программах выглядят как вызовы процедур и могут рассматриваться как расширение языка программирования.

По нашей классификации средств замены контекста примитивы ядра относятся к вызовам супервизора с учетом всех их особенностей, в частности возврат из примитива производится в другой процесс, а не в точку вызова.

Обобщенная структура примитива имеет следующий вид (здесь будем использовать условную запись):

{

ПРОЛОГ;

КОНТРОЛЬ;

<Тело примитива>

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

Краткая характеристика отдельных частей примитива:

  1. ПРОЛОГ сохранение контекста активного процесса, который вызывает примитив; вход в критический участок.

  1. КОНТРОЛЬ проверка прав вызывающего процесса на выполнение данного примитива; детали проверки зависят от реализации ОС.

  1. ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР - это фрагмент диспетчера, заключающийся в выборе нового активного процесса из очереди готовых процессов и передаче ему управления с выходом из критического участка (ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР - это аналог процедуры Transfer(...)).

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

void interrupt Dispatcher()

{

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

Раскроем понятие КРИТИЧЕСКИЙ УЧАСТОК.

Один пример, относящийся этому понятию, мы уже рассматривали. Это пример с неделимостью примитива join T,W.

Рассмотрим еще один пример.

Есть переменная N, общая для двух процессов Р1 и Р2. Например, счет в банке или признак занятости данного билета в кассе продажи билетов. С этой переменной каждый процесс может выполнить следующие действия:

  1. Считать ее в свою локальную область;

  2. Изменить ее значение;

  3. Переслать назад.

Например, N = N + 1; Как это делают процессы:

Р1 Р2

mov ax, N ┌─────────────> mov ax, N

────────────┘

add ax, 1 add ax, 1

mov N, ax mov N, ax

Конечная цель - это увеличить N на 2, по 1 от каждого процесса.

Пусть сначала Р1 выполнит все три инструкции, а затем - Р2. Тогда результат будет такой, какой и требуется.

Пусть теперь прерывание и передача управления от Р1 к Р2 произойдет после инструкции mov ax, N.

Тогда Р2 считает в свой регистр ax то же самое значение N, что и Р1, и конечный результат окажется неправильным.

В данном примере N является общим ресурсом для нескольких процессов.

Если несколько процессов должны работать с одним ресурсом, то этот ресурс называется критическим.

Разнообразие видов критических ресурсов бесконечно. Например, распределенные базы данных. Узловой проблемой распределенных баз данных является то, что эти базы являются критическим ресурсом.

Переменная Т в операторе join T, W - это критический ресурс.

Участок программы, на котором процесс работает с критическим ресурсом, называется критическим участком.

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

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

Такой режим можно организовать разными способами, простейший из которых - это запрет прерываний - cli на входе в критический участок и разрешение их - sti на выходе из него. Позже мы рассмотрим более тонкие методы работы с критическим участком.

При работе с общим ресурсом режим взаимного исключения необходим всегда.

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

Таким образом, примитивы ядра должны выполняться в режиме взаимного исключения.

Какой у них общий ресурс? Это очереди процессов.

Основные примитивы ядра

Классификация примитивов выглядит следующим образом:

Рассмотрим по очереди приведенные классы примитивов.

Примитивы управления процессами

К примитивам управления процессами отнесем два примитива:

  1. Примитив создания процесса;

  2. Примитив уничтожения процесса.

Соседние файлы в предмете Операционные системы