版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux操作系统分析,中国科学技术大学计算机系 陈香兰(051287161312) Autumn 2010,Linux中的时钟和定时测量,2020/8/14,Linux OS Analysis,3/49,定时测量,Linux内核提供两种主要的定时测量 获得当前的时间和日期 系统调用:time(), ftime()以及gettimeofday() 维持定时器 settimer(), alarm() 定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的,2020/8/14,Linux OS Analysis,4/49,主要内容,定时的硬件设备 Linux内核中与时间有关的程序 实现CPU分
2、时、更新系统时间、维护软定时器 与定时测量相关的系统调用及相关服务例程,2020/8/14,Linux OS Analysis,5/49,硬时钟,80 x86体系结构上,内核必须显式的与四种时钟打交道 实时时钟Real time clock,RTC 时间戳计数器Time stamp counter,TSC 可编程间隔定时器Programmable interval timer, PIT CPU本地定时器 高精度事件定时器 ACPI电源管理定时器,用于跟踪 当前时间,产生周期性的时钟中断, 用于计时,2020/8/14,Linux OS Analysis,6/49,实时时钟RTC,基本上所有的P
3、C都包含实时时钟 独立于CPU与所有其他芯片 依靠一个独立的小电池供电给RTC中的振荡器 即使关闭PC电源,还会继续运转 与CMOS RAM往往集成在一个芯片内 例如:Motorala 146818 能在IRQ8上发出周期性的中断,频率在2HZ8192之间 可以对其编程实现一个闹钟,2020/8/14,Linux OS Analysis,7/49,Linux本身只使用RTC获得时间和日期 对应的设备文件为/dev/rtc 可以通过设备文件对其编程 内核通过0 x70和0 x71两个端口访问RTC 系统管理员可以通过执行时钟程序设置时钟,2020/8/14,Linux OS Analysis,8
4、/49,时间戳计数器TSC,在80 x86微处理器中,有一个CLK输入引线 接收外部振荡器的时钟信号 从pentium开始,很多80 x86微处理器都引入了一个TSC 一个64位的、用作时间戳计数器的寄存器 它在每个时钟信号(CLK)到来时+1 例如时钟频率400MHz的微处理器,TSC每2.5ns就+1 rdtsc指令用于读该寄存器,2020/8/14,Linux OS Analysis,9/49,与后面介绍的可编程间隔定时器相比,TSC可以获得更精确的时钟 为此,Linux在系统初始化的时候必须确定时钟信号CLK的频率(即CPU的实际频率) tsc_calibrate 根据在一个相对较长的
5、时间间隔内(约5ms)所发生的TSC计数的个数进行计算 那个间隔由可编程间隔定时器给出 由于只在系统初始化的时候运行一次,因此本程序可以执行较长时间,而不会引起问题,2020/8/14,Linux OS Analysis,10/49,可编程间隔定时器PIT,经过适当编程后,可以周期性的给出时钟中断 通常是8254 CMOS芯片 使用I/O端口0 x400 x43 Linux将PIT编程为: 100Hz、1000Hz 通过IRQ0发出时钟中断 每若干毫秒(100Hz为10ms)产生一次时钟中断,即一个tick,2020/8/14,Linux OS Analysis,11/49,Tick的长短,短
6、 优点:分辨率高 缺点:需要较多的CPU时间处理,会导致用户程序运行变慢 适用于非常强大的机器,这种机器能够承担较大的系统开销 Tick的设置是一个折中,例如 在大多数惠普的Alpha和Intel的IA-64上约1ms产生一个tick(每秒1024个时钟中断) Rawhide Alpha工作站采用更高(1200tick/秒),2020/8/14,Linux OS Analysis,12/49,在Linux中,下列宏决定时钟中断频率,对8254分频,获得HZ所需的时钟,HZ:每秒钟时钟中断的个数,即每秒tick的个数,8254芯片的内部振荡器频率,每秒多少次,2020/8/14,Linux OS
7、 Analysis,13/49,在init_pit_timer ()中初始化时钟中断频率,此后,只要允许处理时钟中断,约每10ms就会产生一个时钟中断 1tick约为10ms (当HZ=100),2020/8/14,Linux OS Analysis,14/49,Linux的计时体系结构,更新自系统启动以来所经过的时间 更新时间和日期 确定当前进程的执行时间,考虑是否要抢占 更新资源使用统计计数 检查到期的软定时器,2020/8/14,Linux OS Analysis,15/49,在单处理器系统中,所有定时活动都由IRQ0上的时钟中断触发,包括 在中断中立即执行的部分,和 作为下半部分延迟执
8、行的部分,2020/8/14,Linux OS Analysis,16/49,计时体系结构中的关键数据结构和变量,系统时钟system timer 时钟中断发生源 Jiffies变量 计时时钟源 Xtime变量,2020/8/14,嵌入式OS,17/49,Jiffies变量,记录系统自启动以来系统产生的tick数 每次时钟中断1 jiffies,32位 关于jiffies_64,约50天就溢出,数十亿年才会溢出,2020/8/14,Linux OS Analysis,18/49,2020/8/14,Linux OS Analysis,19/49,2020/8/14,Linux OS Analy
9、sis,20/49,时钟源,时钟源抽象 参见数据结构clocksource 是系统时钟源,定义了系统时钟源的接口 缺省时钟源,kernel/time/jiffies.c,include/linux/clocksource.h,2020/8/14,Linux OS Analysis,21/49,注册时钟源: clocksource_register clocksource_list 按rating排序,kernel/time/clocksource.c,2020/8/14,Linux OS Analysis,22/49,Jiffies时钟源(缺省时钟源),2020/8/14,Linux OS A
10、nalysis,23/49,PIT时钟源,2020/8/14,Linux OS Analysis,24/49,2020/8/14,Linux OS Analysis,25/49,2020/8/14,嵌入式OS,26/49,Xtime变量,存放当前时间和日期,kernel/time/timekeeping.c,2020/8/14,嵌入式OS,27/49,时间纪元 1970年1月1日(UTC)午夜,include/linux/time.h,2020/8/14,嵌入式OS,28/49,Xtime的更新,基本上每个tick更新一次 参见:update_wall_time 根据时钟源来更新xtime的秒
11、数和纳秒数 时钟源,kernel/time/timekeeping.c,kernel/time/timekeeping.c,2020/8/14,Linux OS Analysis,29/49,X86中的时钟源及其初始化,start_kernel,tick_init 注册 tick_notifier,time_init,timekeeping_init 初始化xtime,read_persistent_clock,get_wallclock即 native_get_wallclock,mach_get_cmos_time,注册 clocksource_tsc,tsc_init,choose_ti
12、me_init即 hpet_time_init,setup_pit_timer,注册pit_clockevent 设置global_clock_event,time_init_hook,设置irq0,2020/8/14,Linux OS Analysis,30/49,时钟中断处理函数,2020/8/14,Linux OS Analysis,31/49,global_clock_event 在setup_pit_timer中被初始化为pit_clockevent 其event_handler在注册过程中,被初始化为tick_handle_periodic tick_handle_periodic
13、的关键是tick_periodic,该函数 调用do_timer和update_process_times,2020/8/14,Linux OS Analysis,32/49,do_timer,全局变量,存放自系统启动 以来的时钟节拍数,2020/8/14,Linux OS Analysis,33/49,update_process_times,2020/8/14,Linux OS Analysis,34/49,软定时器,定时器是一种软件功能,它允许在将来的某个时刻调用某个函数 大多数设备驱动程序利用定时器完成一些特殊工作 软盘驱动程序在软盘暂时不被访问时就关闭设备的发动机 并行打印机利用定时
14、器检测错误的打印机情况,2020/8/14,Linux OS Analysis,35/49,Linux中存在两类定时器: 动态定时器 内核使用 间隔定时器 由进程在用户态创建 注意:由于软定时器在下半部分处理,内核不能保证定时器正好在时钟到期的时候被执行,会存在延迟,不适用于实时应用 延迟函数,2020/8/14,Linux OS Analysis,36/49,动态定时器,动态定时器被动态的创建和撤销,当前活动的动态定时器个数没有限制,include/linux/timer.h,2020/8/14,Linux OS Analysis,37/49,创建并激活一个动态定时器,创建一个新的timer
15、_list对象 调用init_timer初始化,并设置定时器要处理的函数和参数 设置定时时间 使用add_timer加入到合适的链表中 通常定时器只能执行一次,如果要周期性的执行,必须再次将其加入链表,2020/8/14,Linux OS Analysis,38/49,动态定时器的维护,2020/8/14,Linux OS Analysis,39/49,数据结构,kernel/timer.c,2020/8/14,Linux OS Analysis,40/49,处理,kernel/timer.c,kernel/timer.c,函数init_timers中,2020/8/14,Linux OS A
16、nalysis,41/49,kernel/timer.c,阅读kernel/timer.c,2020/8/14,Linux OS Analysis,42/49,动态定时器应用之delayed work,kernel/workqueue.c,include/linux/workqueue.h,2020/8/14,Linux OS Analysis,43/49,动态定时器应用之schedule_timeout,kernel/timer.c,2020/8/14,Linux OS Analysis,44/49,延迟函数,2020/8/14,Linux OS Analysis,45/49,2020/8/14,Linux OS Analysis,46/49,与定时测量相关的系统调用,time() 返回从1970年1月1日凌晨0点开始的秒数 ftime() 返回从1970年1月1日凌晨0点开始的秒数以及最后一秒的毫秒数 数据结构为timeb gettimeofday() 返回从1970年1月1日凌晨0点开始的秒数 对应于sys_gettimeofday(),2020/8/14,Linux OS Analysis,47/49,settimer() 间隔定时器 频率:周期性的触发
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗行业外科医生工作效果绩效考核表
- 产品经理汽车配件行业绩效分析表
- 2026年销售数据提交截止时间通知函6篇
- 电商平台直播带货营销策略及执行手册
- 互联网平台数据合规管理实施指引
- 酒店业供应链中断恢复方案手册
- 消费者投诉处理结果通报(8篇)
- 回复贵方关于交货时间确认函(4篇)
- 关于紧急调整2026年年度销售目标的通知函4篇
- 外部顾问绩效考核表
- 财务调账审批制度
- 人像摄影培训课件
- 2026中国电信广西公司春季校园招聘笔试模拟试题及答案解析
- 学校上下学交通疏导、家长接送秩序及安全保障方案
- QC成果-提高钢结构厂房箱形柱施工一次验收合格率
- 物业燃气安全培训课件
- 四川省凉山州2026届高中毕业班第一次诊断性考试物理(凉山州一诊)(含答案)
- 2025心肌梗死心电图诊断标准和报告规范中国专家共识解读课件
- ADHD执行功能训练的个体化方案
- 派出所年工作汇报
- 加油站全员安全生产责任制清单
评论
0/150
提交评论