欢迎来到天天文库
浏览记录
ID:32535405
大小:74.80 KB
页数:9页
时间:2019-02-11
《linux定时器和jiffies》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、1.linuxHZLinux核心几个重要跟时间有关的名词或变数,以下将介绍HZ、tick与jiffies。HZLinux核心每隔固定周期会发出timerinterrupt(IRQ0),HZ是用来定义每一秒有几次timerinterrupts。举例来说,HZ为1000,代表每秒有1000次timerinterrupts。HZ可在编译核心时设定,如下所示(以核心版本2.6.20-15为例):adrian@adrian-desktop:~$cd/usr/src/linuxadrian@adrian-desktop:/usr/src/linux$makeme
2、nuconfigProcessortypeandfeatures--->Timerfrequency(250HZ)--->其中HZ可设定100、250、300或1000。小实验观察/proc/interrupt的timer中断次数,并于一秒后再次观察其值。理论上,两者应该相差250左右。adrian@adrian-desktop:~$cat/proc/interrupts
3、greptimer&&sleep1&&cat/proc/interrupts
4、greptimer0:9309306IO-APIC-edgetimer0:9309562IO-APIC
5、-edgetimer上面四个栏位分别为中断号码、CPU中断次数、PIC与装置名称。-9-要检查系统上HZ的值是什么,就执行命令catkernel/.config
6、grep'^CONFIG_HZ='2.TickTick是HZ的倒数,意即timerinterrupt每发生一次中断的时间。如HZ为250时,tick为4毫秒(millisecond)。3.JiffiesJiffies为Linux核心变数(unsignedlong),它被用来记录系统自开机以来,已经过了多少tick。每发生一次timerinterrupt,Jiffies变数会被加一。值得注意的
7、是,Jiffies于系统开机时,并非初始化成零,而是被设为-300*HZ(arch/i386/kernel/time.c),即代表系统于开机五分钟后,jiffies便会溢位。那溢位怎么办?事实上,Linux核心定义几个macro(timer_after、time_after_eq、time_before与time_before_eq),即便是溢位,也能借由这几个macro正确地取得jiffies的内容。另外,80x86架构定义一个与jiffies相关的变数jiffies_64,此变数64位元,要等到此变数溢位可能要好几百万年。因此要等到溢位这刻发生应
8、该很难吧。-9-3.1jiffies及其溢出全局变量jiffies取值为自操作系统启动以来的时钟滴答的数目,在头文件中定义,数据类型为unsignedlongvolatile(32位无符号长整型)。jiffies转换为秒可采用公式:(jiffies/HZ)计算,将秒转换为jiffies可采用公式:(seconds*HZ)计算。当时钟中断发生时,jiffies值就加1。因此连续累加一年又四个多月后就会溢出(假定HZ=100,1个jiffies等于1/100秒,jiffies可记录的最大秒数为(2^32-1)/100=429
9、49672.95秒,约合497天或1.38年),即当取值到达最大值时继续加1,就变为了0。3.4Linux内核如何来防止jiffies溢出Linux内核中提供了以下四个宏,可有效解决由于jiffies溢出而造成程序逻辑出错的情况。下面是从LinuxKernel2.6.7版本中摘取出来的代码:/**Theseinlinesdealwithtimerwrappingcorrectly.Youare*stronglyencouragedtousethem*1.Becausepeopleotherwiseforget*2.Becauseifthetimerw
10、rapchangesinfutureyouwon'thaveto*alteryourdrivercode.**time_after(a,b)returnstrueifthetimeaisaftertimeb.-9-**Dothiswith"<0"and">=0"toonlytestthesignoftheresult.A*goodcompilerwouldgeneratebettercode(andareallygoodcompiler*wouldn'tcare).Gcciscurrentlyneither.*/#definetime_after(a
11、,b)(typecheck(unsignedlong,a)&&typecheck(unsignedlon
此文档下载收益归作者所有