Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцияОС.docx
Скачиваний:
5
Добавлен:
26.11.2019
Размер:
5.9 Mб
Скачать

Семафоры

Семафоры – неотрицательная целая переменная, над которой возможно два вида операций:

  1. Р(s) – уменьшает s на 1, если это возможно, если нет – то процесс, вызвавший P-операцию, ждёт пока не сможет уменьшить s.

  2. V(s) – увеличение s на 1 одним неделимым действием.

Когда семафор s принимает значения только 0 и 1, он превращается в блокирующую переменную.

Пример: буферный pull состоит из N буферов по одной записи в каждой. Используется процесс писатель (заполняет буфер) и процесс читатель (освобождает буфер, считывая из него запись).

Используются 2 семафора:

e – число пустых буферов.

f - число записанных буферов.

+ 1 двоичный семафор: b – для организации взаимного исключения.

Int N=256;

Semophore e, f, b;

e=N; f=0; b=1; // все буферы пусты, разрешено действие

void Writer()

{

while (1)

{

PrepareNextRecord();

P(e); // уменьшаем число свободных буферов

P(b); //входим в критичную секцию

AddToBuffer();

V(b); // выйти из секции

V(f); // увеличить число записанных буферов }

}

void Reader() {

while (1)

{

P(f); // уменьшаем число записаных буферов

P(b); //входим в критичную секцию

GetFindBuffer();

V(b); // выйти из секции

V(e); // увеличить число свободных буферов

PrepareRecord(); }

}

Типовые ситуации с использованием s-ов.

  1. Взаимное исключение на семафоре:

Используется двоичный семафор с начальным значением 1. Критические секции кода всех процессов участников начинаются с операции P(s) и заканчиваются V(s).

  1. Синхронизация на семафоре:

Используется двоичный семафор с начальным значением 0 (событие еще не наступило). Процесс, сигнализирующий о наступлении события, выполняет операцию V(s), а процесс, ожидающий наступления события , выполняет операцию P(s).

Если наступления события ожидают несколько процессов, то каждый из них, выполнив P(s), должен выполнить V(s).

  1. Семафор как счетчик ресурсов:

Для контроля N единиц ресурса используется семафор с начальным значением N. Выделение ресурса сопровождается операцией P(s), а освобождение V(s).

Монитор – класс организующий работу с семафором.

Взаимоблокировки

Для возникновения взаимоблокировок в системе должны выполняться

4 условия:

  1. Условие взаимного исключения

Каждый ресурс в каждый момент времени отдан ровно одному процессу и недоступен.

  1. Условие удерживания и ожидания

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

  1. Условие отсутствия принудительной выгрузки ресурсов.

  2. Условие циклического ожидания

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

Взаимоблокировки моделируются при помощи направленных графов.

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

Пусть имеются:

множество процессов P={P1,P2,…,Pn}, где n – число процессов;

множество ресурсов E={E1,E2,..,Em}, где m – число классов ресурсов;

вектор доступных ресурсов A = {A1,A2,…,Am}, Ai ≤Ei, i=1..m;

матрица текущего распределения ресурсов С={Cij, где i=1..n, j=1..m}, где Cij – количество ресурсов j-того класса, что занимает процесс Pi;

Матрица требуемых или запрашиваемых ресурсов R={Rij, где i=1..n, j=1..m}.

Справедливо m-соотношений по ресурсам:

+Aj = Ej, где j=1..m

В исходном состоянии все процесс не маркированы (не отмечены).

Алгоритм обнаружения взаимоблокировки

1 шаг. Ищется процесс Pi, для которого i-ая строка матрицы R меньше вектора A. Ri ≤ Ai и/или r ij ≤ Ai, где j =1..m.

2 шаг. Если Pi найден (процессу доступны все ресурсы, может завершить работу), он маркируется и i-ая строка матрицы С добавляется к вектору A:

Aj=Aj+Cij, где j=1..m

(освобождение своих ресурсов) Далее: переход на шаг 1.

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

Взаимоблокировки могут проверяться:

  1. Когда запрашивается очередной ресурс;

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

Ликвидация взаимоблокировок:

  1. Принудительная выгрузка ресурсов.

  2. Восстановление через откат.

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

  1. Уничтожение одного или более процессов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]