7、linux中的时钟和定时测量

上传人:ldj****22 文档编号:49259698 上传时间:2018-07-26 格式:PPT 页数:36 大小:659.50KB
返回 下载 相关 举报
7、linux中的时钟和定时测量_第1页
第1页 / 共36页
7、linux中的时钟和定时测量_第2页
第2页 / 共36页
7、linux中的时钟和定时测量_第3页
第3页 / 共36页
7、linux中的时钟和定时测量_第4页
第4页 / 共36页
7、linux中的时钟和定时测量_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《7、linux中的时钟和定时测量》由会员分享,可在线阅读,更多相关《7、linux中的时钟和定时测量(36页珍藏版)》请在金锄头文库上搜索。

1、Linux操作系统分析中国科学技术大学计算机系 陈香兰(051287161312) 助教:裴建国、冯晓静 Autumn 2008Linux中的 时钟和定时测量中国科学技术大学计算机系 陈香兰(051287161312) 助教:裴建国、冯晓静 Autumn 2008*Linux OS Analysis3/36定时测量vLinux内核提供两种主要的定时测量获得当前的时间和日期 l系统调用:time(), ftime()以及gettimeofday() 维持定时器 lsettimer(), alarm() v定时测量是由基于固定频率振荡器和计数器的几 个硬件电路完成的*Linux OS Anal

2、ysis4/36主要内容v定时的硬件设备 vLinux内核中与时间有关的程序 v实现CPU分时、更新系统时间、维护软定时器v与定时测量相关的系统调用及相关服务例程*Linux OS Analysis5/36硬时钟v80x86体系结构上,内核必须显式的与四种时钟 打交道 实时时钟Real time clock,RTC 时间戳计数器Time stamp counter,TSC 可编程间隔定时器Programmable interval timer, PIT SMP系统上的本地APIC定时器用于跟踪 当前时间产生周期性的时钟中断, 用于计时*Linux OS Analysis6/36实时时钟RTCv

3、基本上所有的PC都包含实时时钟 独立于CPU与所有其他芯片 依靠一个独立的小电池供电给RTC中的振荡器 l即使关闭PC电源,还会继续运转 v与CMOS RAM往往集成在一个芯片内 例如:Motorala 146818 v能在IRQ8上发出周期性的中断,频率在 2HZ8192之间 可以对其编程实现一个闹钟*Linux OS Analysis7/36vLinux本身只使用RTC获得时间和日期 v对应的设备文件为/dev/rtc可以通过设备文件对其编程 v内核通过0x70和0x71两个端口访问RTCv系统管理员可以通过执行时钟程序设置时钟*Linux OS Analysis8/36时间戳计数器TSC

4、v在80x86微处理器中,有一个CLK输入引线接收外部振荡器的时钟信号 v从pentium开始,很多80x86微处理器都引入了一 个TSC 一个64位的、用作时间戳计数器的寄存器 它在每个时钟信号(CLK)到来时+1 l例如时钟频率400MHz的微处理器,TSC每2.5ns就+1 rdtsc指令用于读该寄存器*Linux OS Analysis9/36v与后面介绍的可编程间隔定时器相比,TSC可以 获得更精确的时钟 为此,Linux在系统初始化的时候必须确定时钟信号 CLK的频率(即CPU的实际频率) calibrate_tsc l根据在一个相对较长的时间间隔内(约50ms)所发生的TSC 计

5、数的个数进行计算 l那个间隔由可编程间隔定时器给出 l由于只在系统初始化的时候运行一次,因此本程序可以执行 较长时间,而不会引起问题*Linux OS Analysis10/36可编程间隔定时器PITv经过适当编程后,可以周期性的给出时钟中断 v通常是8254 CMOS芯片 使用I/O端口0x400x43 vLinux将PIT编程为: 100Hz 通过IRQ0发出时钟中断 l每10ms产生一次时钟中断,即一个tick*Linux OS Analysis11/36Tick的长短v短 优点:分辨率高 缺点:需要较多的CPU时间处理,会导致用户程序运 行变慢 适用于非常强大的机器,这种机器能够承担较

6、大的系 统开销 vTick的设置是一个折中,例如 在大多数惠普的Alpha和Intel的IA-64上约1ms产生一 个tick(每秒1024个时钟中断) Rawhide Alpha工作站采用更高(1200tick/秒)*Linux OS Analysis12/36v在Linux中,下列宏决定时钟中断频率每秒钟时钟中断的个数,即每秒tick的个数8254芯片的内部振荡器频率,每秒多少次对8254分频,获得HZ所需的时钟*Linux OS Analysis13/36v在init_IRQ()中初始化时钟中断频率此后,只要允许处理时钟中断,约每10ms就会产生一个时钟中断 1tick约为10ms*Li

7、nux OS Analysis14/36如何计算CPU的时钟频率CLKvLinux在初始化的时候,利用可编程间隔定时器 获得CPU的频率v观察calibrate_tsc(),了解如何计算CPU的频率 已知:PIT的频率 未知:CLK频率 方法:统计在PIT已知的一段时间内(50ms),CLK 发生了多少次;然后计算出CLK频率(次数/50ms)*Linux OS Analysis15/36Linux的计时体系结构vLinux要周期性的执行一些任务,例如更新系统自启动以来所经过的时间 更新时间和日期 确定进程运行了多久 检查每个软定时器是否已经到期*Linux OS Analysis16/36v

8、在单处理器系统中,所有定时活动都由IRQ0上 的时钟中断触发,包括 在中断中立即执行的部分,和 作为下半部分延迟执行的部分*Linux OS Analysis17/36PIT的时钟中断处理例程vLinux初始化时由time_init()建立IRQ0对应的中断 处理函数将irq0作为irq_desc的第一项 的中断处理函数*Linux OS Analysis18/36如果有TSC,那么就得到时钟中断处理延迟, 以给用户提供更精确的时钟该函数会调用do_timer进一步处理*Linux OS Analysis19/36do_timer全局变量,存放自系统启动 以来的时钟节拍数 32位 约497天会

9、溢出(回归为0)检查当前进程对时间片的使用 情况激活下半部分如果tq_timer非空,还要激活相关的下半部分处理*Linux OS Analysis20/36update_process_times更新时间片 视需要进行调度统计当前进程对 CPU时间的使用 情况*Linux OS Analysis21/36TIMER_BH下半部分v当时钟中断处理例程运行结束并返回时,会立即 处理下半部分更新系统日期和时间,计算当前的系统负载维护软定时器处理*Linux OS Analysis22/36更新时间和日期v用户程序从下面这个变量中获得当前时间和日期存放从1970年1月1日凌晨0点 以来经过的所有秒数

10、最后一秒已经过去的微秒数 取值范围:0999999*Linux OS Analysis23/36v系统初始化时,time_init()初始化时间和日期v观察get_cmos_time()获得coms时间 一旦完成,Linux不再需要RTC, 依靠下半部分维护xtime*Linux OS Analysis24/36更新xtime上一次xtime更新后的jiffies*Linux OS Analysis25/36软定时器v定时器是一种软件功能,它允许在将来的某个时 刻调用某个函数 v大多数设备驱动程序利用定时器完成一些特殊工 作 软盘驱动程序在软盘暂时不被访问时就关闭设备的发 动机 并行打印机利用

11、定时器检测错误的打印机情况*Linux OS Analysis26/36vLinux中存在两类定时器:动态定时器 l内核使用 间隔定时器 l由进程在用户态创建注意:由于软定时器在下半部分处理,内核不能保证 定时器正好在时钟到期的时候被执行,会存在延迟, 不适用于实时应用*Linux OS Analysis27/36动态定时器v动态定时器被动态的创建和撤销,当前活动的动 态定时器个数没有限制 v数据结构:系统使用512个双向链表维护动态定时器定时器到期时要执行的函数函数使用的参数到期时间*Linux OS Analysis28/36创建并激活一个动态定时器v创建一个新的timer_list对象

12、v调用init_timer初始化,并设置定时器要处理的函 数和参数 v设置定时时间 v使用add_timer加入到合适的链表中v通常定时器只能执行一次,如果要周期性的执行 ,必须再次将其加入链表*Linux OS Analysis29/36动态定时器的处理v为提高处理动态定时器的效率,必须给定时器排 序,并使用合适的数据结构 vLinux根据expires的值,维护这样的数据结构*Linux OS Analysis30/36=64, 64个双向链表,包含了未来某个时间段内的 动态定时器 index指向当前应当用来更新上一级定时器的链表(=256),256个双向链表,每个表示对应 时钟到期时的动

13、态定时器链表 Index表示当前节拍对应的那个链表未来214-1个节拍内的定时器 每256个节拍内的定时器为1个链表 共64个未来220-1个节拍内的定时器 每214个节拍内的定时器为1个链表 共64个未来226-1个节拍内的定时器 每220个节拍内的定时器为1个链表 共64个未来232-1个节拍内的定时器 每226个节拍内的定时器为1个链表 共64个一点点不同:最后一个链表中的 定时器的时间可以任意大*Linux OS Analysis31/36run_timer_listv下半部分timer_bh()调用run_timer_list()检查到期 的动态定时器,包括: 执行动态定时器 更新链

14、表观察run_timer_list()*Linux OS Analysis32/36动态定时器的应用v使用schedule_timeout()可以使进程被延迟(睡眠 一段时间)v观察schedule_timeout()并看一个内核应用实例*Linux OS Analysis33/36与定时测量相关的系统调用vtime() 返回从1970年1月1日凌晨0点开始的秒数 vftime() 返回从1970年1月1日凌晨0点开始的秒数以及最后一 秒的毫秒数 数据结构为timeb vgettimeofday() 返回从1970年1月1日凌晨0点开始的秒数 对应于sys_gettimeofday()*Lin

15、ux OS Analysis34/36vsettimer()间隔定时器 l频率:周期性的触发定时器(若为0,只触发一次) valarm() 引起SIGALARM信号*Linux OS Analysis35/36与时钟相关的命令vdate:显示或者更改系统时钟v使用time获得时钟v使用ctime改变时钟格式*Linux OS Analysis36/36Project 5v具体要求参见课程主页 分析下列几个内核函数 lcalibrate_tsc、 get_cmos_time、 run_timer_list、 schedule_timeout 在用户态编写一个程序,该程序设定一个定时器,在 时间到期的时候做出某种可观察的响应 l方法不限分析你的程序的实际执行借助了内核的哪些机制

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号