СРВ_13_22_01_Мьютекс и Семафор, инверсия приоритетов
.pptxМьютекс (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 |