linux内核时间管理(一) : 时间概念和延迟操作

来源:互联网 发布:淘宝拍照要哪些角度 编辑:程序博客网 时间:2024/05/18 17:02

内核中的时间概念

HZ:
Linux 核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts

jiffies:
全局变量jiffies用于记录系统启动以来产生的节拍的总数。
启动时,jiffies初始化为0,此后每次时钟中断处理程序都会增加该变量的值。
linux提供了4个宏来比较节拍计数

#include <linux/jiffies.h> #define time_after(a, b)       // b >  a#define time_before(a, b)      // b <  a#define time_after_eq(a, b)    // b >= a#define time_before_eq(a, b)   // b <= a

时间获取

驱动程序中一般不需要知道墙钟时间(也就是年月日的时间)。但驱动可能需要处理绝对时间。
为此,内核提供了两个结构体,都定义在

   struct timeval {       time_t tv_sec; /* seconds */       suseconds_t tv_usec; /* microseconds */     }; 

(2)采用秒和纳秒值保存时间。

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.长延迟
(1)忙等待
如果对延迟的精确度要求不高,最简单的方法是实现一个监视jiffies计时器的循环。

unsigned long delay = jiffies + 5*HZ;while(time_before(jiffies, delay))      cpu_relax();

(2)超时

#include <linux/sched.h> signed long schedule_timeout(signed long timeout); 

timeout是用jiffies表示的延迟时间,正常值返回0.
schedule_timeout在使用前需要设置当前进程状态。

set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(2*HZ); /* 睡2秒 */  

进程经过2秒后会被唤醒。
第一行调用set_current_state已设置当前进程状态,调度器只有在超时到期且其状态为TASK_RUNNING时才会运行这个进程。如果不希望被用户空间打断,可以将进程状态设置为TASK_UNINTERRUPTIBLE。

(3)让出处理器

while(time_before(jiffies, j1))       schedule(); 

在等待期间可以让出处理器,减少CPU的负担。

2.短延迟
对于那些最多几十个毫秒的延迟,不需要依赖时间滴答

#include <Linux/delay.h>  void ndelay(unsigned long nsecs); /*延迟纳秒 */ void udelay(unsigned long usecs); /*延迟微秒 */ void mdelay(unsigned long msecs); /*延迟毫秒 */ 

这三个延迟函数均是忙等待函数,在延迟过程中无法运行其他任务。 它们的实现使用了软件循环。

实现毫秒级(或者更长)延迟还有一种方法,这种方法不涉及忙等待

#include <Linux/delay.h>  void msleep(unsigned int millisecs); /*休眠毫秒 */ void ssleep(unsigned int seconds); /*休眠秒 */ unsigned long msleep_interruptible(unsigned int millisecs);/*休眠毫秒,中断可以唤醒*/ 
1 0
原创粉丝点击