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);/*休眠毫秒,中断可以唤醒*/
- linux内核时间管理(一) : 时间概念和延迟操作
- Linux内核时间管理
- Linux内核时间管理
- linux内核时间管理
- Linux内核时间管理和定时器
- linux内核时间操作
- 第七章时间,延迟和延缓操作
- linux内核分析笔记----定时器和时间管理
- linux内核分析笔记----定时器和时间管理
- linux内核分析笔记----定时器和时间管理
- linux内核分析笔记----定时器和时间管理
- linux内核分析笔记----定时器和时间管理
- LINUX内核设计思想之定时器和时间管理
- linux 内核学习之—定时器和时间管理
- Linux内核——定时器和时间管理
- Linux内核——定时器和时间管理
- 内核中的时间概念
- [linux]linux内核时间管理基础
- C
- hibernate N+1 问题的总结
- Problem A. Oversized Pancake Flipper(googlejam资格赛)
- Problem D: STL——管道二
- 用static关键字修饰类
- linux内核时间管理(一) : 时间概念和延迟操作
- python 读写 Excel 工具代码
- 如何监听软键盘的显示与隐藏
- mongodb不能远程连接
- Spring--配置Bean
- Problem B. Tidy Numbers
- 判断三角形 求面积的类 简单的案例
- [AHOI2008] BZOJ 1787 Meet紧急集合-LCA
- dp专题 第五题 吃糖果