Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СРВ_13_22_01_Мьютекс и Семафор, инверсия приоритетов

.pptx
Скачиваний:
4
Добавлен:
20.06.2023
Размер:
87.58 Кб
Скачать

Мьютекс (mutual exclusion)

Class Семафор {

Очередь: УказательНаОчередьЗаблокированных НачЗначение: 0..N; (*)

ТекЗначение: 0..M; (*) P(); V();

}

(*) Для двоичного семафора - 0..1

class mutex

{

Очередь:

УказательНаОчередьЗаблокированных

boolean:

занят;

Задача:

владелец;

lock();

unlock(); //неделимые операции

}

 

13 Мьютекс, Семафор, инверсия приоритетов

1

Протокол наследования приоритетов

 

 

 

 

 

P1 = с

P1 = a

Задача 1 (Р1 = а)

 

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задача 2 (P2 = b > a)

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

Задача 3 (P3 = c > b)

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

13 Мьютекс, Семафор, инверсия приоритетов

2

 

Инициализация и захват

TCB-владелец

Создать_mutex(mutex S):

 

 

 

 

 

 

 

 

1.

S = new mutex();

 

 

 

 

2.

S.Очередь = СоздатьОчередь();

 

 

Приоритет

 

3.

S.Владелец = nill;

 

 

 

 

 

ТПриоритет

 

4.

S.Состояние = свободен;

 

 

 

lock():

 

 

 

 

TCB- ТекПроц

1.

Запретить_Прерывания;

 

 

 

 

2.if(Состояние==занят) then

2.1.Владелец.ТПриоритет = ТекПроц.Приоритет;

2.2.ждать(Состояние==свободен);

3.Владелец = ТекПроц;

4.Состояние = занят;

5.Разрешить_Прерывания;

действие 2.1. – приоритет ТекПроц будет выше приоритета Владелец; иначе ТекПроц не мог бы вытеснить владельца и вызвать loc()

13 Мьютекс, Семафор, инверсия приоритетов

3

Освобождение

unlock();

1.Запретить_Прерывания;

2.if(Владелец==ТекПроц) then

2.1.R = Взять_Из_Очереди(Очередь);

2.2.Поставить_В_Очередь(R,ОчердьГотовых)

2.3.Состояние = свободен;

else Исключение; // Еще одна особенность

3.Владелец.ТПриоритет = Владелец.Приоритет;

4.Владелец = nill;

5.Разрешить_Прерывания();

13 Мьютекс, Семафор, инверсия приоритетов

4

Мьютекс QNX (POSIX)

struct pthread_mutex_attr_t { int protocol;

int prioceiling;

unsigned owner;

. . .

}

pthread_mutex_init(…) pthread_mutex_lock(…) pthread_mutex_unlock(…)

pthread_mutexattr_setprotocol(.., int protocol) protocol - PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_PROTECT int pthread_mutexattr_getprotocol(…)

pthread_mutexattr_setprioceiling(.., int prioceiling)

int pthread_mutexattr_getprioceiling(.., int prioceiling) рrioceiling – приоритет, присваиваемый потоку, захватившему мьютекс (см. слайд 7, struct sched_param)

13 Мьютекс, Семафор, инверсия приоритетов

5