[Предположим, низкий процесс = LP, средний процесс = MP, высокий процесс = HP]
LP выполняет критическую секцию. При входе в критическую секцию LP, должно быть, получил блокировку на каком-либо объекте, скажем, OBJ.
ЛП теперь внутри критической секции.
Тем временем HP создается. Из-за более высокого приоритета CPU выполняет переключение контекста, и теперь HP выполняет (не тот же критический раздел, а какой-то другой код). В какой-то момент во время выполнения HP ему требуется блокировка на том же OBJ (может быть, а может и не быть на том же критическом участке), но блокировка на OBJ все еще удерживается LP, так как она была заблокирована при выполнении критического раздела , LP не может отказаться сейчас, потому что процесс находится в состоянии READY, а не RUNNING. Теперь HP переходит в состояние BLOCKED / WAITING.
Теперь MP входит и выполняет свой собственный код. MP не нуждается в блокировке OBJ, поэтому он продолжает работать нормально. HP ждет, пока LP снимет блокировку, а LP ждет, пока MP завершит выполнение, чтобы LP мог вернуться в состояние RUNNING (.. и выполнить и снять блокировку). Только после снятия блокировки LP может вернуться HP в состояние READY (а затем перейти в режим RUNNING, опередив задачи с низким приоритетом.)
Таким образом, фактически это означает, что до тех пор, пока MP не завершит работу, LP не сможет выполнить и, следовательно, HP не сможет выполнить. Таким образом, кажется, что HP ждет MP, даже если они не связаны напрямую через любые блокировки OBJ. -> Приоритетная инверсия .
Решением для приоритетной инверсии является Приоритетное наследование -
увеличить приоритет процесса (A) до максимального приоритета любого
другой процесс ожидает любого ресурса, для которого A имеет блокировку ресурса.