Linux操作系统中的时间

内核定时器

    内核中许多部分的工作都高度依赖于时间信息。linux内核利用硬件提供的定时器功能为忙等待和睡眠等待等时间相关的服务。内核定义了相关的定时器变量:HZ,Jiffies

,xtime。系统定时器能以可编程的频率中断处理器。此频率即为每秒的定时器的拍数,对应着内核变量HZ。HZ值大,定时器间隔就小,英雌进程调度的准确性会更加高,但是,HZ值越大会导致开销和电源消耗更多,因为更多的处理器周期将被耗费在定时器中断上下文中。Jiffies变量记录了系统启动以来,系统定时器触发的次数。系统每秒将JIFFIES增加HZ次。Jiffies变量被定义为volatile类型,这就保证了每个节拍发生的定时器中断处理程序能够更新Jiffise值,并且循环中的每一步都会重新读取Jiffies值。如果HZ的值假定为1000,那么32位的JIFFIES变量会在大约50天的时间内溢出。由于系统的运行时间要比这个时间可能要打的多,所以内核提供了两一个变量JIFFIES_64用来存放64位的JIFFIES。链接器将Jiffies_64位的低32位与32位的JIFFIES指向同一个地址。这样在32位的机器上,为了将一个jiffies_64变量赋值给另一个,编译器需要两条指令,这样这个过程就不是一个原子过程。

长延时

    忙等待,如下占用CPU1秒
    unsigned long tiemout=jiffies+HZ
    while(time_before(jiffes,timeout))continue;
    睡眠等待
    schedule_timeout()来实现这个函数是定义一个定时器(规定时间后会唤醒进程),所以此种等待的精度不是太高,因为到了时间,会重新调度,但是调度的不一定是此进程了。另外的睡眠等待的函数,wait_event_timeout()和msleep(),它们的实现都是基于SCHEDULE_TIMEOUT()的。这种长延时技术仅仅适用于进程上下文。不能够用于中断上下文,因为中断上下文中不允许自动放弃CPU(SCHEDULE())或睡眠。内核中相关的函数mod_timer()修改定时器的时间,del_timer()取消定时器,timer_pending()查看定时器当前是否处于等待状态。clock_settime()和clock_gettime()等用户空间函数可用于获得内核定时器服务。
    

短延时

    小于JIFFY的延时被认为是短延时。这种延时在进程或中断上下文中都有可能发生。由于不可能使用基于JIFFY 的方法实现短延时,之前的睡眠等待将不在可能用于短的超时。这种情况下,唯一的解决途径就是忙等待。实现短延时的内核API包括mdelay(),udelay()和ndelay(),分别支持毫秒,微妙和纳秒的延时。忙等待的方法就是通过执行一定数量的指令来达到延时的效果,而这样就需要知道执行一条指令所需要的时间。内核在启动的过程中进行测量并将该值存储到loops_per_jiffy中。时间戳计数器(TSC),它记录自启动依来处理器消耗的时钟周期数。由于TSC随着处理器周期速率的比例的变化而变化,英雌提供了非常高的精度。TSC通常被用来剖析和检测代码。使用rdtsc可以用来测量某段代的执行时间,其精度达到了微妙级。


实时钟

实时钟(RTC)在非易失性存储上记录绝对时间。使用RTC可以完成如下工作:
    1:读取,设置绝对时间,在时钟更新时产生中断
    2:产生频率为2~8192HZ之间的周期性中断
    3:设置报警信号
许多应用程序需要使用绝对时间或称为墙上时间。JIFFIES是相对于系统启动后的时间,他不包括墙上时间。内核将墙上时间记录在xtime变量中,再启动过程中,会根据从RTC读取到的目前的墙上时间初始xtime,在系统停机后,墙上时间会被协会RTC。可以使用do_gettimeofday()读取墙上时间,其最高精度由硬件决定。用户空间也包括一系列可以访问墙上时间的函数,包括
    time(),该函数返回日历时间,或从新纪元以来经历的秒数
    localtime(),一分散的形式返回日历时间
    mktime(),进行localtime()函数的反向工作
    gettimeofday(),该函数返回微妙精度的日历时间
用户空间使用RTC的另一种途径是通过字符设备/DEV/RTC来进行,统一时刻只有一个进程允许返回该字符设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值