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


发布评论