linux内核源代码分析-定时器与时间管理 30页PPT文档
- 格式:ppt
- 大小:290.00 KB
- 文档页数:30
目录linux内核定时器的实现和使用 (1)使用: (1)实现原理 (2)深入剖析linux内核的定时器实现机制-动态刷新维护 (18)linux内核定时器的实现和使用使用:LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于<linux/timer.h> 和kernel/timer.c 文件中。
被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:1) 没有current 指针、不允许访问用户空间。
因为没有进程上下文,相关代码和被中断的进程没有任何联系。
2) 不能执行休眠(或可能引起休眠的函数)和调度。
3) 任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。
内核定时器的调度函数运行过一次后就不会再被运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。
在SMP系统中,调度函数总是在注册它的同一CPU上运行,以尽可能获得缓存的局域性。
定时器API内核定时器的数据结构struct timer_list {struct list_head entry;unsigned long expires;void (*function)(unsigned long);unsigned long data;struct tvec_base *base;/* ... */};其中expires 字段表示期望定时器执行的jiffies 值,到达该jiffies 值时,将调用function 函数,并传递data 作为参数。
当一个定时器被注册到内核之后,entry 字段用来连接该定时器到一个内核链表中。
base 字段是内核内部实现所用的。
需要注意的是expires 的值是32位的,因为内核定时器并不适用于长的未来时间点。
初始化在使用struct timer_list 之前,需要初始化该数据结构,确保所有的字段都被正确地设置。
第15章内核时钟与定时器实验目的●学习Linux系统中的时钟和定时器原理●分析理解Linux内核时间的实现机制●分析比较ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF●学习理解内核中各种定时器的实现机制●掌握操作定时器的命令,掌握定时器的使用实验内容针对一个计算fibonacci数的进程,设定三个定时器,获取该进程在用户模式的运行时间,在内核模式的运行时间,以及总的运行时间。
提示:setitimer()/getitimer()系统调用的使用。
ITIMER_REAL实时计数;ITIMER_VIRTUAL统计进程在用户模式(进程本身执行)执行的时间;ITIMER_PROF统计进程在用户模式(进程本身执行)和内核模式(系统代表进程执行)下的执行时间,与ITIMER_VIRTUAL比较,这个计时器记录的时间多了该进程内核模式执行过程中消耗的时间。
实验原理15.1 关于时钟和定时器一台装有操作系统的计算机里一般有两个时钟:硬件时钟和软件时钟。
硬件时钟从根本上讲是CMOS时钟,是由小型电池供电的时钟,这种电池一般可持续供电三年左右。
因为有自己的电池,所以当计算机断电的时候CMOS时钟可以继续运行,这就是为什么你的计算机总是知道正确的日期和时间的原因。
而软件时钟则是由操作系统本身维护的,所以又称系统时钟。
这个时钟是在系统启动时,读取硬件时钟获得的,而不是靠记忆计时。
在得到硬件时钟之后,就完全由系统本身维护。
之所以使用两套时钟的原因是因为硬件时钟的读取太麻烦,所消耗的时间太长。
硬件时钟的主要作用就是提供计时和产生精确时钟中断。
而软件时钟的作用则可以归纳为下面的几条:●保存正确时间。
●防止进程超额使用CPU。
●记录CPU的使用情况。
●处理用户进程发出的系统调用。
二、作用:一个timer_list结构体的实例对应一个定时器,在linux设备驱动编程中,可以使用timer_list和基于它的一些操作(函数)来完成定时出发工作或者完成某周期性的事物。
三、个字段详解:1、struct list_head entry--定时器链表,用于存放软定时器,该链表根据定时器expirex 字段的值将它们分组存放。
2、unsigned long expires--定时器的到期时间,到达expires时间后,定时器将调用其成员函数function,其中将data字段作为function的参数。
该字段表示的时间是以时间节拍为单位。
例如如果你想定时一秒,则expires=jiffies+HZ*1。
A、关于jiffies的详解见我们知道,操作系统应该能够在将来某个时刻准时调度某个任务,所以需要一种能保证任务准时调度运行的机制。
希望支持每种操作系统的微处理器必须包含一个可周期性中断它的可编程间隔定时器。
这个周期性中断被称为系统时钟滴答(或system timer),它象节拍器一样来组织系统任务,也称为时钟中断。
时钟中断的发生频率设定为HZ,HZ是一个与体系结构无关的常数,在文件<linux/param.h>中定义,时钟中断对操作系统是非常重要的,当时钟中断发生时,将周期性地执行一些功能,例如:. 更新系统的uptime. 更新time of day. 检查当前任务的时间片是否用光,如果是则需要重新调度任务. 执行到期的dynamic timer. 更新系统资源使用统计和任务所用的时间统计3、void (*function)(unsigned long)--定时器处理函数,也就是说到达expires时间时,function函数将被调用执行。
其参数来自定时器的data字段。
4、unsigned long data--在调用function函数时,该字段作为其参数被使用。
四、操作:1、定义及初始化:struct timer_list timer;(1)-- void init_timer(struct timer_list *timer){debug_timer_init(timer);__init_timer(timer);}(4)--setup_timer(&timer);等同于定义方式(2)和(3),不过对base字段的赋值是调用了init_timer()函数。