Linux内核CPU调度器深度解析
1. 谁运行调度器代码
很多人对调度的工作原理存在一个微妙但关键的误解,认为存在一个名为“调度器”的内核线程会定期运行并调度任务,这是错误的。在像Linux这样的整体式操作系统中,调度是由当前正在执行内核代码的进程上下文(即 current )来完成的。
同时,有一条Linux内核的黄金规则需要牢记:调度代码绝不能在任何原子或中断上下文中运行。也就是说,中断上下文代码必须保证是非阻塞的,例如在中断上下文中不能使用 GFP_KERNEL 标志调用 kmalloc() ,因为它可能会阻塞;但使用 GFP_ATOMIC 标志则没问题,因为它会指示内核内存管理代码永不阻塞。而且,在调度代码运行时,内核抢占是被禁用的。
2. 调度器何时运行
操作系统调度器的工作是仲裁对处理器(CPU)资源的访问,在竞争的线程之间共享该资源。为了确保任务之间公平地共享CPU资源,调度器需要定期在处理器上运行。但不能在定时器中断中直接调用调度器,因为不能在原子或中断上下文中调用调度器。实际上,定时器中断上下文和进程上下文代码路径都被用于实现调度工作。
2.1 定时器中断部分
在定时器中断( kernel/sched/core.c:scheduler_tick() 代码中,此时中断被禁用)中,内核会执行一些必要的元工作,以确保调度顺利运行,比如适当更新每个CPU的运行队列、进行负载均衡等。但实际上并不会调用 schedule() 函
超级会员免费看
订阅专栏 解锁全文
1432

被折叠的 条评论
为什么被折叠?



