linux内核时间管理

来源:互联网 发布:gp6打谱软件 mac 编辑:程序博客网 时间:2024/05/21 22:54

    时间管理在内核中占有非常重要的地位,主要作用是提供一种周期性触发中断机制。

    系统定时器频率(也称节拍率)是通过静态预处理定义的,也就是HZ,其代表每秒钟发生的时钟中断次数,但是该值并不是固定不变的,在系统启动时按照HZ的值对硬件进行设置,体系结构不同,HZ的值夜不同。由于HZ的不同,也就是说时钟中断的频度不同,而更高的时钟中断频度(也就是HZ更大)具有如下优点:

        1.内核定时器可以以更高的频度和更高的准确度运行

         2.依赖定时值执行的系统调用,比如poll和select,更够以更高的进度运行

         3.对诸如资源消耗和系统运行时间等的测量 会有更精细的解析度

         4.提高进程抢占的准确度

    但是更高的HZ同样带来一个大问题:节拍率越高意味着时钟中断频率越高,也就是说系统负担越重。这样不但会减少处理器处理其他工作的时间,而且还会更频繁的打乱处理器高速缓存并增加耗电。所以HZ根据实际情况进行更改。

    全局变量jiffies用来记录自系统启动以来产生的节拍的总数,由于一秒内时钟中断的次数等于HZ,所以jiffies一秒内增加的总数也是HZ,在linux中,jiffies值得定义如下:

         extern unsigned long volatile jiffies;

    对于需要通过jiffies的值来判断超时的情况,内核提供了四个宏来帮助比较节拍数,他们能正确处理节拍数回绕的情况(jiffies一出之后变回0的情况,在32机器上会溢出,在64为机器上不会溢出),函数如下:其中unknown通常是jiffies,know是需要比较的值

         #define time_after(unknown,known)((long)(known) - (long)(unknown) < 0)

         #define time_before (unknown,known) ((long)(unknown) - (long)(known) < 0)

         #defien time_after_eq(unknown,known) ((long)(unknown) - (long)(known) >= 0)

         #define time_before_eq(unknown,known) ((long)(known) - (long)(unknown) >= 0)

    实时时钟(RTC)是用来持久存放系统时间的设备,即便系统关闭后,他也可以依靠主板的微型电池提供的电力保持系统的计时。

    定时器是管理内核流逝时间的基础,定时器的使用很简单:执行一些初始化工作,设置一个超时时间,指定超时后发生的执行函数,最后激活定时器就可以了。定时器的结构由timer_list表示,其结构如下:

          struct timer_list{

                     struct list_head entry;  /*定时器链表的入口*/

                     unsigned long expires;/*以jiffies为单位的定时值*/

                     void (*function)(unsigned long);/*定时器处理函数*/

                     unsigned long data;/*传给处理函数的参数*/

          };

    创建定时器时首先需要定义该结构,如下:struct timer_list my_timer;

    接着需要初始化该定时器结构,如下: init_timer(&my_timer);

    初始化完成之后需要对该定时器结构赋值,可以如下进行:

                     my_timer.expires = jiffies + delay;

                     my_timer.data = 0;

                     my_timer.function = my_function;

    最后激活定时器就可以了,激活如下: add_timer(&my_timer);

    在定时器没有超时之前,如果想修改指定的定时器的超时时间,可以如下修改:mod_timer(&my_timer,jiffies+new_delay);

    在对定时器进行删除操作时,由如下两个函数,del_timer(&my_timer)和del_timer_sync(&my_timer);后一个函数用在多处理机上,但是不能用在中断上下文中。

0 0
原创粉丝点击