Scheduler#
The operating system scheduler controls threads execution with a predetermined policy. It is a part of Phoenix-RTOS having the most significant influence on the performance and responsiveness of the whole system.
Scheduling policy#
The scheduling algorithm is defined in the threads_schedule
function. It is invoked by timer interrupt or voluntary
reschedule (hal_cpuReschedule
). Each function’s invocation changes the context of the currently executed thread to
the next one, available in a thread’s ready queue. The scheduling policy determined which thread shall be chosen for
the next execution. In Phoenix-RTOS a priority preempted round-robin algorithm is used. There are eight priority levels,
the smallest value holds the highest priority.
The thread management unit contains an eight-element array, where each of them holds a pointer to the list of threads of the same priority. A scheduling algorithm is defined as follows:
The
threads_common.spinlock
is set before any operations on common data.The current thread’s context for the interrupted core is saved and added to the end of its priority list.
The next available thread with the highest priority is selected to be run and is removed from the ready thread list. If a selected thread is a ghost (a thread whose process has ended execution) and has not been executed in a supervisor mode, it is added to the ghosts list and the reaper thread woke up.
For the selected thread, the following actions are performed:
a global pointer to the current thread is changed to the selected one,
a pointer to the kernel stack is updated to the stack of a new thread,
a memory map is changed to the map associated with the thread’s process,
signal handlers are performed,
performance data is saved in a perf unit,
in the
hal_cpuRestore
pointer to the stack in a context of current thread is updated with a pointer to the stack of selected thread. When the scheduler finishes work, the context of selected thread restore is performed.
The CPU usage is updated for the current and selected thread.
At the end of the modification of the
threads_common.spinlock
is cleared.