kernel笔记——定时器与时间管理
内核中时钟主要完成以下作用:
- 记录系统运行时间
- 完成时间相关的统计功能,如cpu占用率等
- 定时功能,设定某个进程一段时间后完成某项任务
为实现以上功能,硬件以及内核提供了不同类型的时钟。
RTC
实时时钟(real time clock,RTC),又叫硬件时钟、墙上时钟。RTC记录的是00:00:00 GMT,1 January 1970到当前经历的时间。
开机时,内核读取RTC时间,关机时内核更新RTC时间,系统运行的过程中不操作RTC。关机后依靠RTC记录时间,其由主板上的电池供电。
内核读取到的RTC时间,保存在xtime变量中,xtime是timespec结构类型的变量,在中定义:
struct timespec {
__kernel_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
从结构定义中可以看到,xtime精度为纳秒。每次时钟中断触发时,中断处理函数将调用update_wall_time函数更新xtime。
c库中的gettimeofday/settimeofday,就是基于xtime,获取或设置基准时间(00:00:00 GMT,1 January 1970)到当前的时间间隔。
RTC设备在linux中用/dev/rtc表示,可以通过hwclock查询RTC时间、将RTC时间与系统时间相互同步。
定时器
周期性发生的事件由定时器(timer)触发,定时器是PIT(programmable interval timer)或TSC(time stamp counter)或其他类型的硬件芯片,时钟中断由定时器产生。
一个定时器对应于一个时钟源,时钟源在内核中由clocksource结构表示,该结构定义了时钟源名称、读取时钟源方法、开启/关闭时钟源方法等内容。
一个时钟事件由clock_event_device结构表示,该结构包含了时钟事件名称、时钟时间处理方法(event_handler)等字段。
时钟中断发生的时间间隔称为节拍(tick),节拍在内核编译阶段设定:
linux # zcat /proc/config.gz | grep CONFIG_HZ
CONFIG_HZ_250=y
CONFIG_HZ=
以上设定节拍为250HZ,即每4ms发生一次时钟中断,每秒发生250次。jiffies是一个全局变量,它记录了自系统启动以来产生的节拍数。
每个cpu有各自的定时器,本地时钟中断发生时,由中断处理函数完成更新进程时间片、计算进程用户用时/系统用时等任务。update_process_times函数在本地时钟中断发生时被调用,该函数调用account_process_tick更新进程的用户态/内核态占用率,调用run_local_timers执行软时间中断,调用scheduler_tick更新当前进程的时间片。
单次触发
相比时钟中断提供4ms的计时精度,单次触发(one-shot)时钟提供更高的定时器精度。
高精度的时间由hrtimer结构表示,nanosleep函数的底层实现就用到了hrtimer以及相关操作函数。系统调用nanosleep的实现如下:SYSCALL_DEFINE2(nanosleep, …) -> hrtimer_nanosleep() -> do_nanosleep() -> hrtimer_start_expires()。超时的hrtimer事件由hrtimer_wakeup处理,hrtimer_wakeup调用wake_up_process唤醒相应进程。
suse11相比suse10提供了这种单次触发的时钟,由于其时间精度更高,poll、select、sleep等调用超时返回的频率更高,而cpu占用率、进程资源占用率等统计数据变得更精确。
以下为suse11、suse10下usleep命令对比的例子,在两个系统上执行strace -Ttt usleep 1,跟踪输出中与usleep对应的系统调用如下:
//suse11
::44.836889 nanosleep({, }, {, }) = <0.000061>
::44.836986 exit_group() = ?
//suse10
::21.406039 nanosleep({, }, NULL) = <0.000738>
::21.406838 exit_group() = ?
从以上对比例子可看出,同样调用usleep休眠1微秒,suse11下usleep实际执行效果更接近1微秒设定值。
clockchips.h文件中定义了定时器事件与单次触发事件相应的宏:
#define CLOCK_EVT_FEAT_PERIODIC 0x000001
#define CLOCK_EVT_FEAT_ONESHOT 0x000002
Reference: Chapter 11 - Timers and Time Management, Linux kernel development.3rd.Edition
kernel笔记——定时器与时间管理的更多相关文章
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- Linux之定时器与时间管理 【转】
转自:http://blog.chinaunix.net/uid-23228758-id-154820.html 定时器与时间管理: 次,为一秒.一般的情况下编程者不要改变这个值,因为内核编很多代码都 ...
- 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...
- Linux内核设计与实现 总结笔记(第十一章)定时器和时间管理
时间管理在内核中占用非常重要的地位,内核中有大量的函数都需要基于时间驱动的,内核对相对时间和绝对时间都非常需要. 一.内核中的时间概念 内核必须在硬件的帮助下才能计算和管理时间,系统定时器以某种频率自 ...
- (笔记)Linux内核学习(八)之定时器和时间管理
一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系 ...
- Linux内核设计基础(三)之定时器和时间管理
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/BlueCloudMatrix/article/details/29294529 内核知道连续两次时钟 ...
- FreeRTOS学习笔记4:时间管理
绝对时间:abs Time相对时间:百分比% time IDLE是空闲任务. RUN_Time_State:port...()初始化一个外设提供时基单元 //具体初始化要自己操作这个定时器的分辨率高于 ...
- Linux内核入门到放弃-时间管理-《深入Linux内核架构》笔记
低分辨率定时器的实现 定时器激活与进程统计 IA-32将timer_interrupt注册为中断处理程序,而AMD64使用的是timer_event_interrupt.这两个函数都通过调用所谓的全局 ...
- μC/OS-Ⅲ系统的时间管理函数和定时器
一.时间管理函数 μC/OS-Ⅲ系统提供一些列时间管理服务函数: 1.OSTimeDly():任务延时n个时钟节拍. 2.OSTimeDlyHMSM():任务延时指定的时间,采用“时:分:秒:毫秒”方 ...
随机推荐
- Python爬虫入门教程 15-100 石家庄政民互动数据爬取
石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/14900 ...
- IDEA使用总结
IDEA常用设置 在我们第一眼看见IDEA是这个样子的: 显示工具条 我们要显示工具条!,两个按钮哦 黑色主体 我们要黑色的主题,白色的太low了! 调整字体大小 现在的字体太小了,我要鼠标滑轮+cr ...
- C#线程安全使用(一)
关于Task的使用,一直都是半知半解,最近终于有时间详细的看了一遍MSDN,作为备忘录,将心得也记录下来和大家分享. 首先,根据MSDN的描述,Task是FrameWork4引进的新功能,他和ConC ...
- Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据
一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...
- mac终端代理
终端代理,需要首先有自己的梯子,以下方式需要配合shadowsocks 终端FQ有很多好处,对于一个程序员来说,墙外有很多优秀的代码,走终端可以方便下载和使用- (编程思想强调复用,软件开发避免重复造 ...
- WebBrowser Cookie
WebBrowser的Cookie操作 .在WebBrowser中获取Cookie CookieContainer myCookieContainer = new CookieContainer(); ...
- MySQL单行函数
1.CONCAT(str1,str2,...) 返回来自于参数连结的字符串.如果任何参数是NULL,返回NULL.可以有超过2个的参数.一个数字参数被变换为等价的字符串形式. select CONC ...
- [Go] golang无缓冲通道实现工作池控制并发
展示如何使用无缓冲的通道创建一个goroutine池,控制并发频率1.无缓冲通道保证了两个goroutine之间的数据交换2.当所有的goroutine都忙的时候,能够及时通过通道告知调用者3.无缓冲 ...
- nodejs cookie与session
cookie.session cookie:在浏览器保存一些数据,每次请求都会带过来 *不安全.有限(4K) session:保存数据,保存在服务端 *安全.无限 ------------------ ...
- 自定义控制台程序导出Dynamics 365实体信息到Excel中。
本人微信公众号:微软动态CRM专家罗勇 ,回复281或者20181116可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 有时 ...