Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Priority inversion
(section)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Solutions== The existence of this problem has been known since the 1970s. Lampson and Redell<ref name=Lampson79>{{cite journal|last1=Lampson|first1=B|last2=Redell|first2=D.|title=Experience with processes and monitors in MESA|journal=Communications of the ACM|date=June 1980|volume=23|issue=2|pages=105β117|doi=10.1145/358818.358824 |citeseerx=10.1.1.46.7240|s2cid=1594544}}</ref> published one of the first papers to point out the priority inversion problem. Systems such as the UNIX kernel were already addressing the problem with the splx() primitive. There is no foolproof method to predict the situation. There are however many existing solutions, of which the most common ones are: ;Disabling all interrupts to protect critical sections :When disabling interrupts is used to prevent priority inversion, there are only two priorities: ''preemptible'', and ''interrupts disabled.'' With no third priority, inversion is impossible. Since there's only one piece of lock data (the interrupt-enable bit), misordering locking is impossible, and so deadlocks cannot occur. Since the critical regions always run to completion, hangs do not occur. Note that this only works if all interrupts are disabled. If only a particular hardware device's interrupt is disabled, priority inversion is reintroduced by the hardware's prioritization of interrupts. In early versions of UNIX, a series of primitives named splx(0) ... splx(7) disabled all interrupts up through the given priority. By properly choosing the highest priority of any interrupt that ever entered the critical section, the priority inversion problem could be solved without locking out all of the interrupts. Ceilings were assigned in [[Rate-monotonic scheduling|rate-monotonic]] order, i.e. the slower devices had lower priorities. :In multiple CPU systems, a simple variation, "single shared-flag locking" is used. This scheme provides a single flag in shared memory that is used by all CPUs to lock all inter-processor critical sections with a [[busy-wait]]. Interprocessor communications are expensive and slow on most multiple CPU systems. Therefore, most such systems are designed to minimize shared resources. As a result, this scheme actually works well on many practical systems. These methods are widely used in simple [[embedded system]]s, where they are prized for their reliability, simplicity and low resource use. These schemes also require clever programming to keep the critical sections very brief. Many software engineers consider them impractical in general-purpose computers.{{Citation needed|date=October 2017}} ;Priority ceiling protocol :With [[priority ceiling protocol]], the shared [[mutual exclusion|mutex]] process (that runs the operating system code) has a characteristic (high) priority of its own, which is assigned to the task of locking the mutex. This works well, provided the other high-priority task(s) that try to access the mutex do not have a priority higher than the ceiling priority. ;Priority inheritance :Under the policy of [[priority inheritance]], whenever a high-priority task has to wait for some resource shared with an executing low-priority task, the low-priority task is temporarily assigned the priority of the highest waiting priority task for the duration of its own use of the shared resource, thus keeping medium priority tasks from pre-empting the (originally) low priority task, and thereby affecting the waiting high priority task as well. Once the resource is released, the low-priority task continues at its original priority level. ;Random boosting :Ready tasks holding locks are [[Random boosting|randomly boosted]] in priority until they exit the critical section. This solution was used in [[Microsoft Windows]]<ref>{{Citation | last1 = Cohen | first1 = Aaron | last2 = Woodring | first2 = Mike | title = Win32 Multithreaded Programming | publisher = O'Reilly & Associates | year = 1998 | page = 30 | quote = Windows NT solves the priority inversion problem by randomly boosting the dynamic priorities of threads that are ready to run. }}</ref> until it was replaced by AutoBoost a form of priority inheritance.<ref>{{Cite web |title=Priority Inversion (Windows) |url=https://learn.microsoft.com/en-us/windows/win32/procthread/priority-inversion |access-date=12 October 2024}}</ref> ;Avoid blocking :Because priority inversion involves a low-priority task blocking a high-priority task, one way to avoid priority inversion is to avoid blocking, for example by using [[non-blocking algorithm]]s such as [[read-copy-update]].
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)