Overview
Aurora OS implements a preemptive scheduler inspired by Linux’s Completely Fair Scheduler (CFS). The scheduler manages process execution using virtual runtime (vruntime) for fair CPU time distribution and priority-based weighting.The scheduler runs at 1000 Hz (PIT timer) and uses round-robin scheduling within priority classes.
Architecture
Source:kernel/src/proc/sched_preempt.c:sched_preempt.c:1-97
- Algorithm: CFS-inspired with vruntime tracking
- Timer Frequency: 1000 Hz (1ms tick)
- Context Switch: Assembly-optimized (
kernel/src/proc/switch.S) - Priority Levels: 0-4 (higher = more CPU time)
- Base Timeslice: 10 ticks (10ms)
Core Functions
sched_init
Initializes the scheduler subsystem.No return value. Initializes
current_pid to -1 (no process running).- Sets
current_pid = -1 - Must be called during kernel boot before any process is created
- Reference:
kernel/src/proc/sched_preempt.c:25-27
sched_tick
Called on every timer interrupt (1000 Hz). Manages timeslice accounting, wakes sleeping processes, and triggers rescheduling.Incremented on every tick. Used for sleep/wake timing and TCP retransmit timers.
- Increments global tick counter
- Wakes processes whose
wake_tickhas elapsed (sleep timeout) - Calls
tcp_timer_tick()for network stack retransmit timers - Updates current process vruntime based on priority weight
- Decrements timeslice and calls
schedule()when exhausted
vruntime is incremented by
prio_weights[priority] each tick. Lower vruntime = higher scheduling priority.kernel/src/proc/sched_preempt.c:29-51
schedule
Performs process scheduling and context switching. Selects the process with the lowest vruntime.- Scan all processes with
PROC_READYstate - Select process with minimum vruntime (fairness guarantee)
- Update previous process state from
PROC_RUNNING→PROC_READY - Set selected process state to
PROC_RUNNING - Reset timeslice to
TIMESLICE_BASE(10 ticks) - Update TSS kernel stack pointer (
gdt_set_kernel_stack) - Deliver pending signals via
signal_deliver() - Perform context switch if process changed
- Saves/restores registers:
rsp,rbp,rbx,r12-r15,rip,rflags - Switches page tables by loading new
CR3register - Assembly implementation:
kernel/src/proc/switch.S:1-45
kernel/src/proc/sched_preempt.c:53-96
Process States
Defined inkernel/src/proc/process.h:16-22:
Process slot is free and can be allocated.
Process is runnable and waiting to be scheduled.
Process is currently executing on CPU.
Process is waiting for I/O, signal, or child exit (waitpid).
Process has exited but parent hasn’t called waitpid yet.
Process Structure
PROC_MAX: 64 processesKERNEL_STACK_SIZE: 8192 bytes per process
kernel/src/proc/process.h:55-91
Runqueue
Per-CPU runqueue (currently single-CPU).kernel/src/proc/runqueue.h:13-22
Sleep and Wake
Processes can sleep by setting
wake_tick to a future tick value and transitioning to PROC_BLOCKED state.sched_tick):
kernel/src/proc/sched_preempt.c:32-39
Performance Characteristics
Time Complexity
Schedule: O(n) where n = number of processesScans all processes to find minimum vruntime.
Context Switch
Overhead: ~100 CPU cyclesAssembly-optimized register save/restore + CR3 reload.
Related APIs
- Process Management - Process creation, fork, exit, waitpid
- Memory Management - Page tables for per-process address spaces
- Signals - Signal delivery during context switch
References
- OSDev Wiki - Scheduling Algorithms
- Linux CFS Documentation
- Source:
kernel/src/proc/sched_preempt.c