>An issue I don't see discussed much is non-mutex priority inversion.
That's because everyone's been talking about the budget deficit and Casey Anthony.
August 4, 2011 at 2:30 PM
An issue I don't see discussed much is non-mutex priority inversion.
First a review of mutex priority inversion. A low priority thread locks a mutex, then loses execution. A high priority thread then tries
to lock that mutex and blocks. It gives up its time slice, but a bunch of medium priority threads are available to run, so they take all
the time and the low priority thread doesn't get to run. We call it "priority inversion" because the high priority thread is getting CPU
time as if it was the same as the low priority thread.
Almost all operating systems have some kind of priority-inversion-protection built into their mutex. The usual mechanism goes something like
this : when you block on a mutex, find the thread that currently owns it and either force execution to go to that thread immediately, or
boost its priority up to the same priority as the thread trying to get the lock. (for example, Linux has
"priority inheritance").
The thing is, there are plenty of other ways to get priority inversion that don't involve a mutex.
The more general scenario is : a high priority thread is waiting on some shared object to be signalled ; a low priority thread will eventually
signal that object ; medium priority threads take all the time so the low priority thread can't run, and the high priority thread stays blocked.
For example, this can happen with Semaphores, Events, etc. etc.
The difficulty is that in these cases, unlike with mutexes, the OS doesn't know which thread will eventually signal the shared object to
let the high priority thread go, so it doesn't know who to boost.
Windows has panic mechanisms like the "balance set manager" which look for any thread which is not waiting on a waitable handle, but is getting
no CPU time, then they force it to get some CPU time. This will save you if you are in one of these non-mutex priority-inversions, but it takes
quite a long time for that to kick in, so it's really a last ditch panic save, if it happens you regret it.
Sometimes I see people talking about mutex priority inversion as if that's a scary issue; it's really not on any modern OS. But non-mutex
priority inversion *is*.
Conclusion : beware using non-mutex thread flow control primitives on threads that are not of equal priority !
"08-01-11 - Non-mutex priority inversion"
1 Comment -
>An issue I don't see discussed much is non-mutex priority inversion.
That's because everyone's been talking about the budget deficit and Casey Anthony.
August 4, 2011 at 2:30 PM