2025-04-30
Status: #idea
Tags: OS Camp Stage 3
scheduler
ArceOS调度原理
时钟中断
设置时钟中断函数,每次CPU发出时钟中断时都执行此函数
时钟中断函数
除了更新timer外,此函数最主要的功能为判断当前任务是否可抢占
判断逻辑由调度算法和当前任务类型决定(当前任务为IDLE时则不进行抢占)
以RR调度算法为例,每次判断时都会对当前任务的时间片-1,当当前任务持有的时间片<=1时则设置当前任务可抢占
抢占逻辑
以上操作只是开抢占,但并没有实际抢占
当时钟中断发生时,系统执行的处理函数是:
fn handler_irq(irq_num: usize) -> bool {
let guard = kernel_guard::NoPreempt::new();
dispatch_irq(irq_num);
drop(guard); // rescheduling may occur when preemption is re-enabled.
true
}
其中dispatch_irq(irq_num);
负责执行在axruntime设置的函数,
而let guard和drop(guard)则会执行真正的抢占逻辑.
在axtask中我们可以找到对kernel_guard内部方法的实现
原理是创建时执行disable_preempt,而drop时执行enable_preempt.
在enable_preempt时即可实现抢占,具体实现可在axtask中寻找
References
ArceOS ppt