Thread scheduling
QNX SDP8.0System ArchitectureDeveloperUser
When and how are scheduling decisions made?
The microkernel makes scheduling decisions whenever it's entered as the result of a kernel call, exception, or hardware interrupt. A scheduling decision is made whenever the execution state of any thread changes—it doesn't matter which processes the threads might reside within. Threads are scheduled globally across all processes.
Normally a running thread continues to run, but the thread scheduler will perform a context switch from one thread to another whenever this running thread:
- blocks
- is preempted
- yields
- When does a thread block?
- A running thread blocks when it must wait for some event to occur (response to an IPC request, wait on a mutex, etc.). The blocked thread is removed from the running array and the highest-priority ready thread is then run. When the blocked thread is subsequently unblocked, it's usually placed on the end of the ready queue for that priority level.
- When is a thread preempted?
- A running thread is preempted when a higher-priority thread is placed on the ready queue (it becomes READY, as the result of its block condition being resolved). The preempted thread is put at the beginning of the ready queue for that priority and the higher-priority thread runs.
- When does a thread yield?
- A running thread voluntarily yields its processor (e.g., via sched_yield()) and is placed on the end of the ready queue for that priority. The highest-priority thread then runs (which may still be the thread that just yielded).
Page updated: