Linux内核设施与辅助函数详解
1. 动态节拍/无节拍内核
传统的内核配置中,无论系统是否处于空闲状态,内核每秒都会被中断 HZ
次以进行任务重新调度。例如,若 HZ
设置为 1000,那么每秒就会有 1000 次内核中断,这使得 CPU 难以长时间处于空闲状态,从而影响了 CPU 的功耗。
而无节拍内核则不同,它没有固定或预定义的节拍,在没有任务需要执行时,节拍会被禁用。实际上,节拍的激活是基于下一个动作进行调度的,更准确地说,应该称其为动态节拍内核。
内核负责任务调度,并维护着系统中可运行任务的列表(运行队列)。当没有任务需要调度时,调度器会切换到空闲线程,通过禁用周期性节拍来启用动态节拍,直到下一个定时器到期(即有新任务排队等待处理)。
内核还会维护一个任务超时列表,这样它就能知道何时以及需要休眠多长时间。在空闲状态下,如果下一个节拍的到来时间比任务列表中最小的超时时间还要远,内核会将定时器设置为该超时值。当定时器到期时,内核会重新启用周期性节拍并调用调度器,调度器随后会调度与该超时相关的任务。这种机制使得无节拍内核在空闲时能够消除周期性节拍,从而节省功耗。
2. 内核中的延迟与休眠
根据代码运行的上下文,内核中的延迟可分为两种类型:原子上下文和非原子上下文。处理内核延迟时,必须包含头文件 #include <linux/delay>
。
2.1 原子上下文
在原子上下文中(如中断服务程序 ISR),任务不能休眠,也不能被调度。因此,在原子上下文中,通常使用忙等待循