RTEMS: SMP Scheduler

| RTEMS 5.4-rc2

Loading...
Searching...
No Matches
Modules | Files | Data Structures | Typedefs | Enumerations | Functions
SMP Scheduler
Internal » SuperCore » Scheduler Handler

SMP Scheduler. More...

## Modules
| Deterministic Priority SMP Scheduler
| Deterministic Priority SMP Scheduler.
| EDF Priority SMP Scheduler
| EDF Priority SMP Scheduler.
| Simple Priority SMP Scheduler
| Simple Priority SMP Scheduler.
| Strong APA Scheduler
| Strong APA Scheduler.

## Files
file | schedulersmp.h
| SMP Scheduler API.
file | schedulersmpimpl.h
| SMP Scheduler Implementation.

## Data Structures
struct | Scheduler_SMP_Context
| Scheduler context specialization for SMP schedulers. More...
struct | Scheduler_SMP_Node
| Scheduler node specialization for SMP schedulers. More...

## Typedefs
typedef bool(* | Scheduler_SMP_Has_ready) (Scheduler_Context *context)
typedef Scheduler_Node *(* | Scheduler_SMP_Get_highest_ready) (Scheduler_Context *context, Scheduler_Node *node)
typedef Scheduler_Node *(* | Scheduler_SMP_Get_lowest_scheduled) (Scheduler_Context *context, Scheduler_Node *filter)
typedef void(* | Scheduler_SMP_Extract) (Scheduler_Context *context, Scheduler_Node *node_to_extract)
typedef void(* | Scheduler_SMP_Insert) (Scheduler_Context *context, Scheduler_Node *node_to_insert, Priority_Control insert_priority)
typedef void(* | Scheduler_SMP_Move) (Scheduler_Context *context, Scheduler_Node *node_to_move)
typedef bool(* | Scheduler_SMP_Ask_for_help) (Scheduler_Context *context, Thread_Control *thread, Scheduler_Node *node)
typedef void(* | Scheduler_SMP_Update) (Scheduler_Context *context, Scheduler_Node *node_to_update, Priority_Control new_priority)
typedef void(* | Scheduler_SMP_Set_affinity) (Scheduler_Context *context, Scheduler_Node *node, void *arg)
typedef bool(* | Scheduler_SMP_Enqueue) (Scheduler_Context *context, Scheduler_Node *node_to_enqueue, Priority_Control priority)
typedef void(* | Scheduler_SMP_Allocate_processor) (Scheduler_Context *context, Scheduler_Node *scheduled, Scheduler_Node *victim, Per_CPU_Control *victim_cpu)
typedef void(* | Scheduler_SMP_Register_idle) (Scheduler_Context *context, Scheduler_Node *idle, Per_CPU_Control *cpu)

## Enumerations
enum | Scheduler_SMP_Node_state { SCHEDULER_SMP_NODE_BLOCKED , SCHEDULER_SMP_NODE_SCHEDULED , SCHEDULER_SMP_NODE_READY }
| SMP scheduler node states. More...

## Functions
void | _Scheduler_SMP_Start_idle (const Scheduler_Control *scheduler, Thread_Control *idle, struct Per_CPU_Control *cpu)
| Starts an idle thread on the specified cpu.

## Detailed Description

SMP Scheduler.

The scheduler nodes can be in four states

- SCHEDULER_SMP_NODE_BLOCKED,
- SCHEDULER_SMP_NODE_SCHEDULED, and
- SCHEDULER_SMP_NODE_READY.

State transitions are triggered via basic operations

- _Scheduler_SMP_Enqueue(),
- _Scheduler_SMP_Enqueue_scheduled(), and
- _Scheduler_SMP_Block().

During system initialization each processor of the scheduler instance starts with an idle thread assigned to it. Lets have a look at an example with two idle threads I and J with priority 5. We also have blocked threads A, B and C with priorities 1, 2 and 3 respectively. The scheduler nodes are ordered with respect to the thread priority from left to right in the below diagrams. The highest priority node (lowest priority number) is the leftmost node. Since the processor assignment is independent of the thread priority the processor indices may move from one state to the other.

Lets start A. For this an enqueue operation is performed.

Lets start C.

Lets start B.

Lets change the priority of thread A to 4.

Now perform a blocking operation with thread B. Please note that thread A migrated now from processor 0 to processor 1 and thread C still executes on processor 1.

## Enumeration Type Documentation

## ◆ Scheduler_SMP_Node_state

enum Scheduler_SMP_Node_state

SMP scheduler node states.

Enumerator
SCHEDULER_SMP_NODE_BLOCKED | This scheduler node is blocked. A scheduler node is blocked if the corresponding thread is not ready.
SCHEDULER_SMP_NODE_SCHEDULED | The scheduler node is scheduled. A scheduler node is scheduled if the corresponding thread is ready and the scheduler allocated a processor for it. A scheduled node is assigned to exactly one processor. The count of scheduled nodes in this scheduler instance equals the processor count owned by the scheduler instance.
SCHEDULER_SMP_NODE_READY | This scheduler node is ready. A scheduler node is ready if the corresponding thread is ready and the scheduler did not allocate a processor for it.

## Function Documentation

## ◆ _Scheduler_SMP_Start_idle()

void _Scheduler_SMP_Start_idle | ( | const Scheduler_Control * | scheduler,
|  | Thread_Control * | idle,
|  | struct Per_CPU_Control * | cpu
| ) |  |

Starts an idle thread on the specified cpu.

Parameters

  | scheduler | The scheduler instance.
  [in,out] | idle | The idle thread to schedule.
  [out] | cpu | The cpu to run the idle thread on.