2024年4月23日发(作者:)

窗体顶端

nohz下的timer机制和进程调度

在2.6.21内核之前,时钟中断是周期的,即以HZ为频率,系统总是被动的接受时钟

中断,然后运行中断处理程序。如果实在没有任务可以运行,那 么就执行idle,这也许也

算一种创意,可 是时钟中断还是会周期性的打破idle,然后查询有没有需要做的事情,如

果没有继续idle

以往的进程在特定的固定时间片内运行,时钟的定时中断提供了时间片的监督工作,

一切显得十分和谐,可是系统内核本身就是没有主权,一切都在硬件的安排下进行。

随后的2.6.22以后,nohz才出现,nohz其实就是动态设置下一次的中断时间而不是

使用系统无条件的默认的HZ中断。

这样cfs调度器,再也不用受制于底层的时钟以及时间片分配特性,linux可以动态设

置时间片长短,按照自己的方式来进行调度。

nohz其实就是托了抽象出来的clocksource和 clock_event_device的福,

clocksource和 clock_event_device,这两个结构体就是时钟以及时钟行为的抽象。

先熟悉两个数据结构

struct timer_list :软件时钟,记录了软件时钟的到期时间以及到期后要执行的操作。

struct tvec_base :用于组织、管理软件时钟的结构。在 SMP 系统中,每个 CPU 有

一个。

struct timer_list {

struct list_head entry; //所在的链表

unsigned long expires; //到期时间,以 tick 为单位

void (*function)(unsigned long); //回调函数,到期后执行的操作

unsigned long data; //回调函数的参数

struct tvec_t_base_s *base; //记录该软件时钟所在的 struct tvec_base 变

#ifdef CONFIG_TIMER_STATS

void *start_site;

char start_comm[16];

int start_pid;

#endif