Почему вытеснение не решает инверсию приоритета?

Я хотел бы знать, почему вытеснение не решает проблему инверсии приоритетов?
Если у нас есть вытесняющее ядро. Тогда почему проблема инверсии приоритетов не решается?


person Rasmi Ranjan Nayak    schedule 05.07.2012    source источник
comment
Пожалуйста, объясните, почему вы думаете, что это решает...   -  person lvella    schedule 05.07.2012
comment
Этот вопрос относится к Programmers.stackexchange.com   -  person RedX    schedule 05.07.2012
comment
@lvella: Я так думаю, потому что проблема инверсии приоритетов возникает, когда highest priority task ждет, а medium priority task приходит. Насколько я думаю, в preemption задача с наивысшим приоритетом вытесняет задачу с более низким приоритетом, тогда происходит наследование приоритета no question of. Вы так не думаете?   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
@RedX: Как вы думаете, почему этот вопрос принадлежит программистам.stackexchange.com?   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
Зачем закрывать этот вопрос? Подскажите пожалуйста или посоветуйте.   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
@RasmiRanjanNayak Это не инверсия приоритета, я думаю, вы не совсем поняли проблему.   -  person lvella    schedule 05.07.2012
comment
Я считаю, что это место там, потому что это не вопрос проблемы с кодом, который у вас есть, а более общий вопрос об алгоритмах, которые, ИМХО, лучше подходят программистам.   -  person RedX    schedule 05.07.2012
comment
@RedX Нет, сюда относятся алгоритмы и теория операционных систем, не программисты. Программисты — это о межличностных отношениях и бизнес-решениях.   -  person Potatoswatter    schedule 05.07.2012
comment
@Potatoswatter Ой, может быть, тогда я что-то перепутал, извините.   -  person RedX    schedule 05.07.2012
comment
Единственный другой сайт-кандидат, которому это могло бы принадлежать, - это Theoretical Computer Science, но я думаю, что здесь он более уместен, тем более что этот вопрос не вызывает глубокого теоретического интереса.   -  person R.. GitHub STOP HELPING ICE    schedule 05.07.2012


Ответы (6)


Хорошо, допустим, у нас есть два процесса. Предположим также, что процесс с более низким приоритетом получает блокировку. Когда процесс с более высоким приоритетом становится готовым, он вытесняет другой процесс. Если процесс с более высоким приоритетом нуждается в этой блокировке, он не может ее получить из-за другого процесса с более низким приоритетом. Это означает, что процесс с более низким приоритетом блокирует процесс с более высоким приоритетом. Это предотвращает запуск процесса с более высоким приоритетом. Это называется "инверсия приоритета".

Очевидно, что вытеснение не является решением проблемы инверсии приоритетов. Решение - "Приоритетное наследование". Это означает, что мы должны временно увеличивать приоритет процесса всякий раз, когда он получает блокировку, которая также необходима процессу с более высоким приоритетом. Это должен быть процесс с наивысшим приоритетом среди других процессов, которым может потребоваться такая же блокировка.

person aydinkahriman    schedule 05.07.2012
comment
На самом деле, повышение приоритета всякий раз, когда он получает блокировку, не означает наследование приоритета и, вероятно, является плохой идеей. Наследование приоритета означает повышение приоритета только тогда, когда поток с более высоким приоритетом ожидает получения блокировки. - person R.. GitHub STOP HELPING ICE; 05.07.2012
comment
@ Р.. - Да, ты прав. Я пытался сказать то же самое в своем последнем предложении. Повышение приоритета не должно блокировать другие процессы с более высоким приоритетом, которые не имеют ничего общего с нашей блокировкой. - person aydinkahriman; 05.07.2012
comment
@R.. Этот протокол является потолком приоритета. Где блокировка имеет неотъемлемый приоритет, до которого повышается поток, когда он получает блокировку. Это делается в основном в ОС реального времени, когда вы заранее знаете, какие приоритеты у ваших потоков и кому какая блокировка нужна. - person RedX; 06.07.2012
comment
Я не голосую против или что-то в этом роде, но я все еще думаю, что это неясно. Это не получение блокировки, необходимой процессу с более высоким приоритетом, который увеличивает приоритет потока; на самом деле получение такой блокировки невозможно, если только вы не имеете в виду блокировку, которая может понадобиться процессу с более высоким приоритетом позже. Это действие процесса с более высоким приоритетом, который впоследствии ожидает блокировку, которая повышает приоритет. - person R.. GitHub STOP HELPING ICE; 06.07.2012
comment
Вздох. ИМО, это не инверсия приоритета, 2 процесса совместно используют ресурс, и это ожидаемое поведение. Инверсия приоритета происходит, когда третий процесс (между двумя другими по приоритету), который не использует общий ресурс, готов к запуску. Теперь он вытесняет задачу с низким приоритетом, удерживающую ресурсы, еще больше задерживая выполнение задачи с высоким приоритетом. Почти каждый другой ответ ниже этого принятого ответа дал правильный ответ. Кроме того, я считаю, что вы описали потолок приоритета, а не наследование приоритета. - person Dan; 08.07.2012

Пусть 3 потока A, B, C с соответствующими приоритетами Высокий, Средний, Низкий.

C получает процессор и блокирует L. Затем B пробуждается некоторыми событиями и вытесняет C. Теперь A пробуждается и получает процессор, вытесняя B. A запрашивает блокировку L, но терпит неудачу, поскольку L уже принадлежит C. A вытесняется из-за недоступности блокировки и возвращает процессор B. Нам нужно дождаться завершения B, что в конечном итоге приведет к передаче процессора C. C завершит работу и снимет блокировку, которая окончательно разбудит A.

Это инверсия приоритета, потому что B выполняется, тогда как у нас есть поток A в системе с более высоким приоритетом, ожидающий завершения потока с более низким приоритетом. (в данном случае C).

Кстати, решением является приоритетное наследование.

person Benoit    schedule 05.07.2012
comment
Это также можно исправить с помощью взлома.. Не лучшее решение, но тем не менее решение. - person Alexey Frunze; 05.07.2012
comment
У моего коллеги однажды возникла интересная идея, что планировщик может хранить DAG (ну, вы надеетесь, что он ациклический) зависимостей между потоками, которые в настоящее время заблокированы на объектах синхронизации, принадлежащих другим потокам. Затем всякий раз, когда вы хотите запланировать A, но он заблокирован, вы вместо этого следуете за DAG к конечному узлу (в данном случае C) и запускаете его вместо A. Однако он никогда не реализовывал это, и было множество осложнений, которые не были не решить без детального проектирования. Это могло быть более справедливым, чем простое наследование приоритетов, особенно. с помощью WaitForMultipleObjects. - person Steve Jessop; 05.07.2012
comment
Эти моменты интересны и заслуживают более глубокого изучения. Лично я чувствую себя довольно комфортно с идеей не разделять блокировки между потоками с разным приоритетом. Но я в основном работаю над критическими/встроенными системами, и ограничения разные. - person Benoit; 05.07.2012

Вытеснение означает отключение процессора, чтобы задача больше не выполнялась.

Этого недостаточно, потому что задача с низким приоритетом содержит ресурс, который нужен задаче с высоким приоритетом.

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

person starblue    schedule 05.07.2012

Предположим, у вас есть 3 процесса:

  • A — высокий приоритет
  • B – обычный приоритет
  • C — низкий приоритет

а также то, что A и C используют, скажем, один и тот же файл (это может быть любой общий ресурс), использование которого должно быть синхронизировано.

Теперь предположим, что ни A, ни B не готовы к запуску, а C запускается и получает блокировку для использования файла. Пока C удерживает блокировку файла, A готовится к запуску, и операционная система вытесняет C и запускает A . A выполняется до такой степени, что ему также нужен файл, и когда он пытается получить блокировку, он блокируется, поскольку C удерживает блокировку. Если в это время B был готов к запуску, он будет выполнен вместо A, потому что A не готов к запуску. Чтобы A был готов, блокировка файла должна быть снята с помощью C, а C не запустится и не снимет блокировку, поскольку выше приоритетный процесс B запущен. Таким образом, A ожидает C, который, в свою очередь, ожидает B. Простое вытеснение B в этой ситуации не принесет пользы, потому что A не готов и не будет готов, пока не запустится C и >C не может быть запущен, так как только что вытесненный более высокий приоритет B готов к запуску.

person lvella    schedule 05.07.2012

Из Вики

Рассмотреть возможность,

L --> Задача с низким приоритетом
H --> Задача с высоким приоритетом
M --> Задача со средним приоритетом
R --> Ресурс

Шаг 1: L получает R
Шаг 2: H запрашивает R (в настоящее время используется с L, поэтому H будет ждать, пока L откажется от R.)
Шаг 3: M прибывает (M является незаблокированным Задача, т. е. не требует R)
Шаг 4: L вытесняется M. (поэтому L не может отказаться от R. Из-за этого H не может работать.)

После того, как M закончит свое выполнение, L откажется от R. После этого только H может продолжить. В приведенном выше сценарии задача со средним приоритетом (M) выполнялась перед задачей с высоким приоритетом (H).

Это реальный сценарий инверсии приоритетов в вытесняющем ядре.

person Jeyaram    schedule 05.07.2012

инверсия приоритета — проблематичный сценарий при планировании, когда задача с более высоким приоритетом косвенно вытесняется задачей с более низким приоритетом, эффективно «инвертируя» относительные приоритеты двух задач.

Допустим, есть задача L с низким приоритетом. Для этой задачи требуется ресурс R. Предположим, что L выполняется и получает ресурс R. Теперь есть другая задача H с высоким приоритетом. Эта задача также требует ресурса R. Предположим, что H начинается после того, как L получила ресурс R. Теперь H должна ждать, пока L освободит ресурс R. До этого момента все работает, как ожидалось, но возникают проблемы, когда новая задача M (которая не использует R) в это время запускается со средним приоритетом. Поскольку R все еще используется (L), H не может работать. Поскольку M является незаблокированной задачей с наивысшим приоритетом, она будет запланирована раньше L. Поскольку L была вытеснена M, L не может отказаться от R. Таким образом, M будет выполняться до тех пор, пока не будет завершена, затем L будет выполняться - по крайней мере, до момента, когда он может отказаться от R, и тогда будет работать H. Таким образом, в приведенном выше сценарии задача со средним приоритетом выполнялась перед задачей с высоким приоритетом, что фактически давало нам инверсию приоритета.

person Pratik    schedule 05.07.2012