1.6 时间管理

在内核代码中常需要管理任务执行的时间。例如,一个进程调度到CPU上执行,进程调度器需要衡量该进程在CPU上运行的时间,当进程运行到一个指定时间后,需要将进程调度出CPU,更换为其他进程。被调换出的进程只有等到下一次重调度到CPU中后再继续其任务。在网络子系统中我们常需要记录数据到达的时间,等待处理的时间等。

在内核地址空间,时间是以tick来衡量的。一个tick是两次时钟中断之间的间隔值。时钟需要管理各种不同的任务,周期性地产生中断来管理这些任务。时钟中断产生间隔以每秒钟多少HZ数来衡量。HZ是一个变量,不同的CPU体系结构的初始值不一样。在i386系列的CPU中,HZ被初始化为1000,即当Linux运行在i386系统上时,时钟中断每秒钟产生1000次。

每次时钟中断产生时,时钟中断处理程序对全局变量jiffies递增1,也即在任何时候jiffies的值代表了系统从启动到当前时间的tick数。

如果一个函数对时间的管理只需衡量经过的时间值,可以首先将当前jiffies值保存在一个局部变量中,随后将保存的值与当前jiffies比较(以tick数表示),看从记录开始已经过了多长时间。

以下给出了一个示例,函数需要完成某项功能,但占用CPU的时间不超过1个tick。如果函数do_something已完成其操作,将标志job_done设置为非零值,函数返回。

    unsigned long start_time = jiffies;
    int job_done = 0;
    do {
      do_something(&job_done);
      if ( job_done)
            return;
    }while ( jiffies – start_time < 1 );