
- •Раздел 3. Параллельное выполнение программ
- •3.1. Концепция процесса
- •3.2. Средства описания параллелизма
- •3.2.1. Графические средства
- •3.2.3. Описание процессов средствами uml
- •3.2.4. Языковые средства описания параллелизма
- •3.3. Организация ядра ос
- •3.3.1. Ядро как средство организации виртуальной машины
- •3.3.2. Состояния процесса и структура ядра
- •3.3.3. Дескрипторы процессов
- •3.3.4. Очереди процессов в ядре
- •3.4. Общая характеристика примитивов ядра
- •3.5. Примитивы создания и уничтожения процессов
- •3.6. Примитивы синхронизации процессов
- •3.6.1. Простейшие примитивы, не учтенные в классификации
- •3.6.2. Примитивы временной синхронизации
- •3.6.3. Примитивы событийной синхронизации процессов
- •3.7. Общий семафор как средство событийной синхронизации
- •3.8. Средства синхронизации в существующих операционных системах
- •3.9. Монитор как средство реализации взаимного исключения
- •3.10. Примитивы ядра для обмена сообщениями
- •3.10.1. Буфер как средство коммуникации между процессами
- •3.10.2. Почтовый ящик с очередью сообщений
- •3.10.3. Средства коммуникаций в существующих ос
- •3.11. Проблема тупиков при взаимодействии процессов
- •3.12. Планирование загрузки процессора в ядре
- •3.12.1. Классификация алгоритмов планирования
- •3.12.2. Тесты планируемости задач и классификация задач
- •3.12.3. Динамическое планирование
- •3.12.3.1. Планирование независимых задач
- •1. Алгоритм монотонной скорости.
- •2. Алгоритм “задача с минимальным предельным сроком завершения - первая”
- •3. Алгоритм минимальной неопределенности
- •3.12.3.2. Планирование зависимых задач
- •3.12.4. Статическое планирование
3.4. Общая характеристика примитивов ядра
Итак, основными объектами ядра являются очереди процессов.
Ядро управляет процессами путем управления очередями.
Управление осуществляется двумя способами:
вызовом диспетчера по прерываниям;
вызовами процедур планировщика ядра.
Эти процедуры называются примитивами ядра. Напомню, что примитивами называются базовые операции некоторого уровня ОС.
Примитивы вызываются из прикладных процессов.
Вызовы примитивов в программах выглядят как вызовы процедур и могут рассматриваться как расширение языка программирования.
По нашей классификации средств замены контекста примитивы ядра относятся к вызовам супервизора с учетом всех их особенностей, в частности возврат из примитива производится в другой процесс, а не в точку вызова.
Обобщенная структура примитива имеет следующий вид (здесь будем использовать Паскале-подобную запись):
Вопрос (
Begin
ПРОЛОГ;
КОНТРОЛЬ;
<Тело примитива>
ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;
End;
)Вопрос
Краткая характеристика отдельных частей примитива:
Вопрос (
ПРОЛОГ сохранение контекста активного процесса, который вызывает примитив; вход в критический участок.
)Вопрос
Вопрос (
КОНТРОЛЬ проверка прав вызывающего процесса на выполнение данного примитива; детали проверки зависят от реализации ОС.
)Вопрос
Вопрос (
ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР - это фрагмент диспетчера, заключающийся в выборе нового активного процесса из очереди готовых процессов и передаче ему управления с выходом из критического участка (ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР - это аналог процедуры Transfer(...)).
)Вопрос
Вопрос (
Диспетчер - это обработчик прерываний, описание которого может выглядеть следующим образом:
Procedure Dispatcher; Interrupt;
Begin
ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;
End;
)Вопрос
Раскроем понятие КРИТИЧЕСКИЙ УЧАСТОК.
Один пример, относящийся этому понятию, мы уже рассматривали. Это пример с неделимостью примитива join T, W.
Рассмотрим еще один пример.
Есть переменная N, общая для двух процессов Р1 и Р2. Например, счет в банке или признак занятости данного билета в кассе продажи билетов. С этой переменной каждый процесс может выполнить следующие действия:
считать ее в свою локальную область;
изменить ее значение;
переслать назад.
Например, 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 на выходе из него. Позже мы рассмотрим более тонкие методы работы с критическим участком.
При работе с общим ресурсом режим взаимного исключения необходим всегда.
Подчеркну еще раз, что теперь требование неделимости распространяется от одной инструкции на целый ряд инструкций, который может быть довольно большим.
Таким образом, примитивы ядра должны выполняться в режиме взаимного исключения.
Какой у них общий ресурс? Это очереди процессов.
Основные примитивы ядра
Вопрос (
Классификация примитивов выглядит следующим образом:
)Вопрос
Рассмотрим по очереди приведенные классы примитивов.
Примитивы управления процессами
К примитивам управления процессами отнесем два примитива:
примитив создания процесса;
примитив уничтожения процесса.