欢迎来到天天文库
浏览记录
ID:39465414
大小:51.00 KB
页数:9页
时间:2019-07-04
《linuxnohz下的timer机制和进程调度》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、窗体顶端nohz下的timer机制和进程调度在2.6.21内核之前,时钟中断是周期的,即以HZ为频率,系统总是被动的接受时钟中断,然后运行中断处理程序。如果实在没有任务可以运行,那么就执行idle,这也许也算一种创意,可是时钟中断还是会周期性的打破idle,然后查询有没有需要做的事情,如果没有继续idle以往的进程在特定的固定时间片内运行,时钟的定时中断提供了时间片的监督工作,一切显得十分和谐,可是系统内核本身就是没有主权,一切都在硬件的安排下进行。随后的2.6.22以后,nohz才出现,nohz其实就是动态设置下一次的中断时间而不是使用系统无条件的默认的HZ中断。这样cfs调度器
2、,再也不用受制于底层的时钟以及时间片分配特性,linux可以动态设置时间片长短,按照自己的方式来进行调度。 nohz其实就是托了抽象出来的clocksource和clock_event_device的福,clocksource和clock_event_device,这两个结构体就是时钟以及时钟行为的抽象。 先熟悉两个数据结构structtimer_list:软件时钟,记录了软件时钟的到期时间以及到期后要执行的操作。structtvec_base:用于组织、管理软件时钟的结构。在SMP系统中,每个CPU有一个。 structtimer_list{ structlist_hea
3、dentry; //所在的链表 unsignedlongexpires; //到期时间,以tick为单位 void(*function)(unsignedlong); //回调函数,到期后执行的操作 unsignedlongdata; //回调函数的参数 structtvec_t_base_s*base; //记录该软件时钟所在的structtvec_base变量#ifdefCONFIG_TIMER_STATS void*start_site; charstart_c
4、omm[16]; intstart_pid;#endif};structtvec_t_base_s{ spinlock_tlock; structtimer_list*running_timer; //正在处理的软件时钟 unsignedlongtimer_jiffies; //当前正在处理的软件时钟到期时间 tvec_root_ttv1; //保存了到期时间从timer_jiffies到timer_jiffies+2的8次方之间(包括边缘值)的所有软件时钟 tvec_ttv2;
5、 //保存了到期时间从timer_jiffies+2的8次方到timer_jiffies+2的14次方之间(包括边缘值)的所有软件时钟 tvec_ttv3; //14~20 tvec_ttv4; //20~26 tvec_ttv5; //26~32}____cacheline_aligned;typedefstructtvec_t_base_stvec_base_t;//下面开始跟踪内核中timer的代码,内核版本2.6.24/* *Thisfunc
6、tionrunstimersandthetimer-tqinbottomhalfcontext. */staticvoidrun_timer_softirq(structsoftirq_action*h) //定时器中断下半部{ tvec_base_t*base=__get_cpu_var(tvec_bases); //取得CPU的tvec_base_t结构数据 hrtimer_run_queues(); //这里有机会切换到nohz或者hres if(time_after_eq(jiffies,base
7、->timer_jiffies)) //如果当前jiffies>=定时器到期base->timer_jiffies __run_timers(base); //运行定时器回调函数} /* *Calledfromtimersoftirqeveryjiffy,expirehrtimers: * *ForHRTitsthefallbackcodetorunthesoftirqinthetimer *softirqc
此文档下载收益归作者所有