2016-10-08 24 views
0

В книге «Принципы операционной системы» Сильбершаца/Галвина (9-е издание), а также статья в Википедии о инверсии приоритета говорят, что при приоритетном обращении процесс с высоким приоритетом не может использовать ресурс, который имеет низкий приоритет процесс в качестве процесса с приоритетом среднего приоритета приостанавливает процесс с низким приоритетом и получает этот ресурс. Но если это так (, т. Е. Если допускается приоритизация на основе приоритета), почему процесс высокоприоритетного процесса не может вытеснить сам процесс более низкого приоритета и получить ресурс?В случае инверсии с приоритетом, почему процесс приоритетного приоритета не может вытеснить процесс приоритетного среднего приоритета?

Ниже то, что упоминается в книге, а также статьи Википедии:

Рассмотрим две задачи H и L, высокого и низкого приоритета соответственно, любой из которых может приобрести исключительное использование общей ресурс R. Если H пытается получить R после того, как L его приобрел, тогда H блокируется , пока L не освободит ресурс. Совместное использование ресурса исключительного использования (R в этом случае) в хорошо спроектированной системе обычно включает в себя L , чтобы быстро отменить R, чтобы H (задача с более высоким приоритетом) не оставалась заблокированной в течение чрезмерных периодов времени. Несмотря на хороший дизайн, , однако, возможно, что третья задача M среднего приоритета (p (L) < p (M) < p (H), где p (x) представляет приоритет задачи (x)) становится , выполняемый во время использования L R. В этот момент M выше в приоритетом, чем L, вытесняет L, заставляя L не удалять R , что в свою очередь вызывает H-процесс с наивысшим приоритетом - не может бежать. Это называется инверсией приоритета, когда задача с более высоким приоритетом вытесняется с помощью более низкого приоритета.

ответ

1

Вот лучший пример, который поможет вам разобраться. Я в конце объясню и отвечу на ваш вопрос.

Пусть будет 3 процесса с разными приоритетами. Низкий, средний и высокий. (Низкий, средний и высокий с точки зрения их приоритета).

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

Выполняется самый низкий приоритет, Med и High блокируются и выходят из критической секции.

Низкий входит в критический раздел и приобретает ресурс, необходимый Высокой.

Высокий уровень блокировки и так как это задача с наивысшим приоритетом в системе, она работает.

Высокий затем пытается войти в критический ресурс, но блокируется, так как там находится Low.

Med unblocks и так как это сейчас самая высокая задача в системе, она работает.

Высокий не может работать до тех пор, пока Low не даст ресурс. Низкий не может работать до тех пор, пока не блокирует или не заканчивается Med. Приоритет задач был инвертирован; Высокий, хотя он имеет наивысший приоритет, находится в нижней части цепочки выполнения.

Чтобы «решить» приоритетную инверсию, приоритет «Низкий» должен быть сбит, чтобы быть как минимум высоким.

Подводя итог: Med вызвало Ожидание. Критический раздел защищен инструментом синхронизации, процесс с высоким приоритетом не будет вытеснять общий ресурс до тех пор, пока процесс с низким приоритетом не добьется этого.

Но для процесса с низким приоритетом необходим ресурс, который в настоящее время используется процессом Med. => Процесс с высоким приоритетом должен ждать.

Прочитайте это: What is priority inversion?

Кредит к парню, который написал пример, в одном из комментариев.

+0

Ссылка, которую вы поделились, была полезной, так как мой точный вопрос был в одном из комментариев. У кого-то была такая же путаница, как у меня. – Meathead