linux 读写时间变长,linux时钟变慢的原因分析【转】
今天發(fā)現(xiàn)現(xiàn)在使用的噪聲儀器時(shí)間不準(zhǔn),每天滿大約10幾分鐘,經(jīng)過查找資料,發(fā)現(xiàn)以下一篇中提到的問題很可疑,轉(zhuǎn)載如下:
聽說有人抱怨他的Linux服務(wù)器或者嵌入式Linux開發(fā)板上的時(shí)間越來越慢,當(dāng)時(shí)念頭一閃,沒有多在意
今天頓悟,果然是有道理的
用戶空間的延時(shí)和定時(shí)器,都是靠內(nèi)核定時(shí)器實(shí)現(xiàn)的。內(nèi)核定時(shí)器 struct timer_list 以及相關(guān)內(nèi)核api,
init_timer()、add_timer、mod_timer 、del_timer,都依賴于jiffes
一個(gè)系統(tǒng)時(shí)鐘中斷,jiffes就加1,每秒將產(chǎn)生 1*HZ 個(gè)jiffes
可以說,這個(gè)jiffes,也可稱為滴答,等于是OS的心跳,靠著這個(gè)穩(wěn)定長期的中斷,內(nèi)核才能夠及時(shí)從一個(gè)時(shí)間片到期的進(jìn)程手中奪回cpu的使用權(quán),進(jìn)行下一次調(diào)度。當(dāng)然,每一
次中斷結(jié)束或者返回用戶空間都可能進(jìn)入調(diào)度,所以這里用詞是及時(shí)。
2.6.21版本開始支持無滴答內(nèi)核,據(jù)說能夠節(jié)能。不過我想沒有了滴答,內(nèi)核定時(shí)器失效,很多軟件怕是要重寫了,所以大家都不大關(guān)注這個(gè)。
常見的計(jì)算機(jī)系統(tǒng)會(huì)帶有一個(gè)RTC,這個(gè)才是可靠的墻上時(shí)鐘源。
不過訪問rtc的速度比較慢,所以只是上電的時(shí)候,內(nèi)核讀取一次rtc時(shí)間,之后在OS里看到的時(shí)間都是靠一個(gè)一個(gè)jiffes加上去的。
很多時(shí)候,為了保護(hù)臨界資源,不得不關(guān)閉所有中斷,這個(gè)在中斷處理函數(shù)中尤為常見。那么就有可能在關(guān)閉中斷后的臨界區(qū),發(fā)生了系統(tǒng)時(shí)鐘中斷,這次時(shí)鐘中斷就被忽略了。
導(dǎo)致jiffies沒有增加,進(jìn)而影響系統(tǒng)時(shí)鐘精度。這個(gè)概率我只能定性的分析。比如arm上HZ為100,pc上為1000,那么每隔10ms或者1ms就能有一次時(shí)鐘中斷。而10ms期間,200MHZ
的arm芯片大約能執(zhí)行 0.5M
條指令,正好落在臨界區(qū)的幾百條指令的概率不是很大。但是計(jì)算機(jī)跑起來微小的誤差也是很容易積累的,所以如有必要,可以另開一個(gè)守護(hù)進(jìn)程,定
時(shí)讀取rtc來修正系統(tǒng)時(shí)間。
手工驗(yàn)證一下
spinlock_t lock;
unsigned long flags;
static int test_timer_init_module(void)
{
spin_lock_init(&lock);
printk( KERN_DEBUG "Module test_timer init\n" );
spin_lock_irqsave(&lock, flags);
printk( KERN_DEBUG "the jiffies is %ld\n" ,jiffies);
mdelay(2000);
printk( KERN_DEBUG "the jiffies is %ld\n" ,jiffies);
spin_unlock_irqrestore(&lock, flags);
return 0;
}
不加黑色代碼,兩個(gè)jiffes相差
20xx?,pc上HZ為1000,這個(gè)結(jié)果還是正常的
加上黑色代碼,關(guān)閉中斷2000ms,兩個(gè)jiffes沒有差別
所以寫驅(qū)動(dòng)一定要自律,關(guān)閉中斷后的代碼一定要盡可能的簡潔迅速
所以需要在中斷響應(yīng)時(shí)速度盡量快,處理終端時(shí)不能等待太長時(shí)間,否則很多其他中斷會(huì)被錯(cuò)誤而導(dǎo)致意想不到的問題,以上時(shí)鐘不準(zhǔn)就是一例。
總結(jié)
以上是生活随笔為你收集整理的linux 读写时间变长,linux时钟变慢的原因分析【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rufus linux开机密码,使用Ru
- 下一篇: Xp下的程序编译成linux,WinXP