[笔记分享] [OS] Linux的时间管理

Platform: msm8x60
Kernel: 2.6

介绍

内核有大量函数基于事件驱动的。如对屏幕进行周期刷新,对运行时间和当前日期时间的管理等。
周期性时间多是由系统定时器驱动,也就是产生了定时器中断。
下面是一些利用时钟中断周期工作的任务:
1. 更新系统运行时间
2. 更新实际时间
3. 检查进程是否用尽时间片
4. 运行超时动态定时器
5. 更新资源消耗和处理器时间的统计值


时间表示

系统定时器频率用HZ定义,在系统启动时按照HZ对硬件进行设置。HZ不能太高,也不能太低,太高虽然提有更好的时间中断解析度和时间驱动事件的准确度,但是系统负担也会相应重很多,因为处理器要花更多的时间来处理时钟中断,还会打乱了处理器高速缓存。一般HZ值为100。

全局变量jiffies用来记录系统自启动以来产生的节拍总数。每次时钟中断都会增加该变量的值,所以一秒内jiffies增加的值也就是HZ。Jiffies定义如下:

这里写图片描述

在比较节拍数时,为了防止数据比较的不正确,Linux提供了以下几个宏来进行比较:

这里写图片描述


定时器

定时器的使用比较简单,只要初始化,然后设定一个超时时间,指定触发时的执行函数,然后激活定时器就可以了。注意定时器并不定期运行,它在超时后就自行销毁了。因此需要自己重复激活。
定时器结构如下:

这里写图片描述

不过我们在使用定时器时并不需要深入了解该结构。下面看如何使用。

  1. 创建定时器
    struct time_list my_timer;
  2. 初始化定时器
    init_timer(&my_timer);
  3. 设置定时器参数
    my_timer.expires = jiffies + delay;
    my_timer.data = 0;
    my_timer.function = my_function;
  4. 添加定时器
    add_timer(&my_timer);

好了,这样定时器就可以在规定时间后触发工作了。如果有时需要更改定时器超时时间,可以用mod_timer()函数,如果定时器没激活,它会被激活:
mod_timer(&my_timer, jiffies+new_delay);
如果在超时前需要停止定时器,用:
del_timer(&my_timer);


延时

最简单的延迟方法是忙等待,该方法延迟时间是节拍数的整数倍,仅在延迟时间要求不高时才使用。比如:
Unsigned long delay = jiffies + 10;
While(time_before(jiffies, delay));

……
这里也表现出了jiffies为什么要定义成volatile,因为在每次循环读取的时候得确保编译器能读到正确的jiffies值。

当需要短延迟而且需要延迟精度比较高时,Linux提供了以下函数:
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);

udelay()依靠执行循环次数达到延迟效果,mdelay()依靠udelay()实现。不要使用udelay()处理超过1ms的延迟,如果超过的话使用mdelay()更安全。

另外一种延迟方法是schedule_timeout(),该方法需要执行延迟的任务睡眠到指定的时间耗尽后再重新执行。其他,它也是一个内核定时器的简单应用。在使用的时候要注意在调用schedule_timeout()之前先要将进程设置为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE其中一种,否则任务不会睡眠。函数如下:
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值