Priority inheritance and messages

QNX SDP8.0System ArchitectureDeveloperUser

QNX OS uses message-driven priority inheritance to avoid priority-inversion problems.

A server process receives messages and pulses in priority order. As the threads within the server receive requests, each receiving thread then inherits the priority (but not the scheduling policy) of the sending thread. As a result, the relative priorities of the threads requesting work of the server are preserved, and the server work will be executed at the appropriate priority.

For example, suppose the system includes the following:

  • a server thread, at priority 22
  • a client thread, T1, at priority 13
  • a client thread, T2, at priority 10

Without priority inheritance, if T2 sends a message to the server, it's effectively getting work done for it at priority 22, so T2's priority has been inverted.

What actually happens is that when the server receives a message, its effective priority changes to that of the highest-priority sender (restricted as described below). In this case, T2's priority is lower than the server's, so the change in the server's effective priority takes place when the server receives the message.

Next, suppose that T1 sends a message to the server while it's still at priority 10. Since T1's priority is higher than the server's current priority, the change in the server's priority happens when T1 sends the message.

The change happens before the server receives the message to avoid another case of priority inversion. If the server's priority remains unchanged at 10, and another thread, T3, starts to run at priority 11, the server has to wait until T3 lets it have some CPU time so that it can eventually receive T1's message. So, T1 would be delayed by a lower-priority thread, T3.

If the highest priority among the threads is a privileged priority, and the server doesn't have the PROCMGR_AID_PRIORITY ability enabled, then the server thread is boosted to the highest unprivileged priority. For more information, see Scheduling priority in the QNX OS Microkernel chapter and procmgr_ability() in the C Library Reference.

You can turn off priority inheritance by specifying the _NTO_CHF_FIXED_PRIORITY flag when you call ChannelCreate().

Page updated: