- •3 Основные понятия и концепция операционных систем. Режимы работы ос. Системные вызовы
- •4 Архитектура современных операционных систем.
- •5 Процессы. Состояние процесса.
- •6 Контекст и паспорт процесса .
- •7 Концепция и критерии планирования процессов. Уровни планирования
- •8 Стратегии планирования процессов. Критерии планирования и требования к алгоритмам
- •9 Взаимодействие процессов. Адресация средств связи при взаимодействии процессов.
- •10 Алгоритмы синхронизации процессов. Примитивы взаимоисключения.
- •1.Взаимоисключение для n процессов
- •2. Аппаратная реализация взаимоисключения: команда testandset
- •2. Семафоры
- •3. Синхронизация процессов при помощи семафоров
- •11 Достаточное условие детерменированности Беристайна.
- •12 Семафоры. Операция над семафорами.
- •13 Семафоры как средство взаимоисключения.
- •14 Тупики и бесконечные откладывания.
- •15 Система управления процессорами. Компоненты системы.
- •16 Алгоритмы планирования процессов
- •17 Система управления памятью.
- •8.3.1 Схема с фиксированными разделами.
- •18 Виртуальная память. Архитектурные средства поддержки виртуальной памяти. Архитектурные средства поддержки виртуальной памяти
- •Страничная виртуальная память
- •Сегментно-страничная организации виртуальной памяти
- •Структура таблицы страниц
- •19 Управление внешней памятью. Файловые системы. Управление внешней памятью
- •Методы выделения дискового пространства
- •Выделение непрерывной последовательностью блоков
- •Связный список
- •Индексные узлы
- •20 Управление системой ввода-вывода
- •Рис 2. Методы управления периферийными устройствами: а)прямой; б)косвенный
2. Семафоры
Все описанные выше ключевые понятия, относящиеся к взаимоисключению, Дейкстра суммировал в своей концепции семафоров (Di65). Семафор — это защищенная переменная, значение которой можно опрашивать и менять только при помощи специальных операций Р и V и операции инициализации, которую мы будем называть «инициализациясемафора». Двоичные семафоры могут принимать только значения 0 и 1. Считающие семафоры (семафоры со счетчиками) могут принимать неотрицательные целые значения.
Операция Р над семафором записывается как P(S) и выполняется следующим образом:
если S > О
то S: =S— 1
иначе (ожидать на S)
Операция V над семафором S записывается как V(S) и выполняется следующим образом;
если (один или более процессов ожидают на S)
то (разрешить одному из этих процессов продолжить работу)
иначе S : = S + 1
Будем предполагать, что очередь процессов, ожидающих на обслуживается в соответствии с дисциплиной «первый пришедший обслуживается первым» (FIFO).
Подобно операции проверки и установки testandset, операции Р и V являются неделимыми. Участки взаимоисключения по семафору S в процессах обрамляются операциями P(S) и V(S). Если одновременно несколько процессов попытаются выполнить операцию P(S), это будет разрешено только одному из них, а остальным придется ждать.
Семафоры и операции над ними могут быть реализованы как программно, так и аппаратно. Как правило, они реализуются в ядре операционной системы, где осуществляется управление сменой состояния процессов.
На рис. 2 приводится пример того, каким образом можно обеспечить взаимоисключение при помощи семафоров. Здесь примитив Р (активный) — эквивалент для «входвзаимоисключения», а примитив V (активный) — для «выходвзаимоисключения».
program примерсемафораодин;
var активный: семафор;
procedure процессодин;
begin
while истина do begin
предшествующиеоператорыодин;
Р(активный);
критическийучастокодин;
V(активный);
прочиеоператорыодин;
end
end;
procedure процессдва;
begin
while истина do begin
предшествующиеоператорыдва Р(активный);
критическийучастокдва;
V(активный);
прочиеоператорыдва
еnd
end;
begin
инициализациясемафора(активный,1);
parbegin
процессодин;
процессдва parend
end;
Рис. 2. Обеспечение взаимоисключения при помощи семафора и примитивов Р и V.
3. Синхронизация процессов при помощи семафоров
Когда процесс выдает запрос ввода-вывода, он блокирует себя в ожидании завершения соответствующей операции ввода-вывода. Заблокированный процесс должен быть активизирован каким-либо другим процессом. Подобное взаимодействие может служить примером функций, относящихся к протоколу блокирования/возобновления.
Рассмотрим более общий случай, когда одному процессу необходимо, например, чтобы он получал уведомление о наступлении некоторого события. Предположим, что какой-либо другой процесс может обнаружить, что данное событие произошло. Программа рис. 3 показывает, каким образом при помощи семафора можно реализовать простой механизм синхронизации (блокирования/возобновления) для двух процессов.
program блокированиевозобновления;
var событие: семафор;
procedure процессодин;
begin
предшествующиеоператорыодин;
Р(событие);
прочиеоператорыодин
end;
procedure процессдва;
begin
предшествующиеоператорыдва;
V(событие);
прочиеоператорыдва
end;
begin
инициализациясемафора(событие,0);
parbegin
процессодин;
процессдва parend
end;
Рис. 3. Синхронизация блокирования/возобновление процессов при помощи семафоров.
Здесь «процессодин» выполняет некоторые «предшествующие операторыодин», а затем операцию Р (событие). Ранее при инициализации семафор был установлен в нуль, так что «процессодин» будет ждать. Со временем «процессдва» выполнит операцию V (событие), сигнализируя о том, что данное событие произошло. Тем самым «процессодин» получает возможность продолжить свое выполнение.
Отметим, что подобный механизм будет выполнять свои функции даже в том случае, если «процессдва» обнаружит наступление события и просигнализирует об этом еще до того, как «процессодин» выполнит операцию Р (событие); при этом семафор переключится из 0 в 1, так что операция Р (событие) просто произведет обратное Переключение, из 1 в 0, и «процессодин» продолжит свое выполнение без ожидания.