Definition
Priority Inversion
Priority inversion occurs when a high-priority thread is indirectly preempted by a lower-priority thread, typically when the high-priority thread waits for a resource held by a low-priority thread, and a medium-priority thread prevents the low-priority thread from releasing the resource.
Scenario
Consider three threads with priorities :
- acquires a mutex protecting a shared resource
- attempts to acquire the same mutex and blocks, waiting for to release it
- preempts (since ), running indefinitely
- waits indefinitely because cannot complete while runs
The Inversion
‘s priority is effectively reduced to ‘s level because it waits on . — which should not affect — now determines when can proceed.
Solutions
Priority Inheritance
When blocks on a mutex held by , temporarily raise ‘s priority to ‘s level. Now cannot be preempted by . Once releases the mutex, its priority reverts.
Priority Ceiling
Each mutex is assigned a priority ceiling equal to the highest priority of any thread that may lock it. Any thread acquiring the mutex immediately inherits this ceiling priority until release.