linux内核时间管理(一) : 时间概念和延迟操作
內(nèi)核中的時(shí)間概念
HZ:
Linux 核心每隔固定周期會(huì)發(fā)出timer interrupt (IRQ 0),HZ是用來(lái)定義每一秒有幾次timer interrupts。舉例來(lái)說(shuō),HZ為1000,代表每秒有1000次timer interrupts
jiffies:
全局變量jiffies用于記錄系統(tǒng)啟動(dòng)以來(lái)產(chǎn)生的節(jié)拍的總數(shù)。
啟動(dòng)時(shí),jiffies初始化為0,此后每次時(shí)鐘中斷處理程序都會(huì)增加該變量的值。
linux提供了4個(gè)宏來(lái)比較節(jié)拍計(jì)數(shù)
時(shí)間獲取
驅(qū)動(dòng)程序中一般不需要知道墻鐘時(shí)間(也就是年月日的時(shí)間)。但驅(qū)動(dòng)可能需要處理絕對(duì)時(shí)間。
為此,內(nèi)核提供了兩個(gè)結(jié)構(gòu)體,都定義在
(2)采用秒和納秒值保存時(shí)間。
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };(3)用do_gettimeofday()用于獲得timeval
#include <linux/time.h> void do_gettimeofday(struct timeval *tv);(4) current_kernel_time() 用于獲得timespec
#include <linux/time.h> struct timespec current_kernel_time(void);延遲操作
1.長(zhǎng)延遲
(1)忙等待
如果對(duì)延遲的精確度要求不高,最簡(jiǎn)單的方法是實(shí)現(xiàn)一個(gè)監(jiān)視jiffies計(jì)時(shí)器的循環(huán)。
(2)超時(shí)
#include <linux/sched.h> signed long schedule_timeout(signed long timeout);timeout是用jiffies表示的延遲時(shí)間,正常值返回0.
schedule_timeout在使用前需要設(shè)置當(dāng)前進(jìn)程狀態(tài)。
進(jìn)程經(jīng)過(guò)2秒后會(huì)被喚醒。
第一行調(diào)用set_current_state已設(shè)置當(dāng)前進(jìn)程狀態(tài),調(diào)度器只有在超時(shí)到期且其狀態(tài)為TASK_RUNNING時(shí)才會(huì)運(yùn)行這個(gè)進(jìn)程。如果不希望被用戶空間打斷,可以將進(jìn)程狀態(tài)設(shè)置為TASK_UNINTERRUPTIBLE。
(3)讓出處理器
while(time_before(jiffies, j1)) schedule();在等待期間可以讓出處理器,減少CPU的負(fù)擔(dān)。
2.短延遲
對(duì)于那些最多幾十個(gè)毫秒的延遲,不需要依賴時(shí)間滴答
這三個(gè)延遲函數(shù)均是忙等待函數(shù),在延遲過(guò)程中無(wú)法運(yùn)行其他任務(wù)。 它們的實(shí)現(xiàn)使用了軟件循環(huán)。
實(shí)現(xiàn)毫秒級(jí)(或者更長(zhǎng))延遲還有一種方法,這種方法不涉及忙等待
#include <Linux/delay.h> void msleep(unsigned int millisecs); /*休眠毫秒 */ void ssleep(unsigned int seconds); /*休眠秒 */ unsigned long msleep_interruptible(unsigned int millisecs);/*休眠毫秒,中斷可以喚醒*/總結(jié)
以上是生活随笔為你收集整理的linux内核时间管理(一) : 时间概念和延迟操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机开机提示非正版操作系统,电脑启动时
- 下一篇: 安徽大学软件工程考研历程