- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux内核源代码-定时器与时间管理详解
定时器与时间管理、内存管理 上次课的回顾及后面的安排 内核中的时间概念 Linux中时间表示 硬件时钟和定时器 Linux下的时钟中断和相关时间应用 Linux内存页 Linux内存区 内存管理提供的服务 内存管理缓存机制 内存映射 上次内容回顾和后面的安排 系统调用和中断(回顾上节课内容) 中断处理程序的上、下半部机制 LINUX下半部处理机制 同步的经典问题 LINUX内核同步实现 增加一次课,课本内容完成后通过两个专题的形式增加对内核的认识 内核中的时间概念 事件驱动与时间驱动 内核中需管理相对时间和绝对时间 内核时间的硬件基础(系统定时器以某种频率触发,hitting or poping,该频率可以通过编程预定(tick rate) 直接用处: 更新系统运行时间 更新实际时间 定期均衡运行队列(SMP上) 时间片 定期统计 Linux中时间表示(HZ) 节拍率(HZ) 系统定时器频率,可以通过设置修改,系统启动时设置,不同体系结构下不同。 如:在include/asm-i386/param.h中: #define Hz 1000 //相当于1秒中断1000次 思考:时间的精确性 书上P116表9-1给出一般情况下各种体系结构下的时钟中断频率 理想的HZ值应该是多少? 多时会产生中断频繁 但提高精度(分析:平均误差) Linux中时间表示(HZ) 精度提高的进一步讨论 一些关键系统调用的效率提高(poll(),select()) 进程抢占的精度提高 时间测量方面精度提高 中断次数增加带来的问题 综合考虑认为目前体系结构的系统设为1000可以忍受。 Linux中时间表示(jiffies) 全局变量,用来记录系统启动以来产生的节拍总数 在linux/jiffies.h中定义: Extern unsigned long volatile jiffies;响应地有: Seconds* HZ = jiffies; (jiffies/HZ) = seconds;(还有一些其他的转换) 有关jiffies的内部位数问题: 溢出时间问题 64位问题(2.6中) Linux中时间表示(jiffies) 64位与32位的结合 Jiffies的回绕 unsigned long timeout = jiffies + HZ/2; /*执行一些任务….*/ if (timeout jiffies) { 未超时,正常处理} else { 超时,错误处理; } Linux中时间表示(jiffies) 回绕的处理: time_after Time_before Time_after_eq Time_before_eq 分析怎样避免的回绕影响(借用了LONG的符号) Linux中时间表示(用户空间和HZ) 内核改变HZ的值会影响一些基于原来值的应用 内核需要导出合适的jeffies值 若新旧HZ数差整数倍则比较简单 #define jiffies_to_clock(x) ((x)/(HZ/USER_HZ)) 否则,需要向时间上做一下转换,误差会小一些。 思考一下,为什么? 硬件时钟和定时器 体系结构提供了两种设备计时 系统定时器 实时时钟(RTC),不开机时靠电池供电工作,系统启动时,初始化xtime变量。 Linux下的时钟中断和相关时间应用 时钟中断处理程序做的工作: 获得xtime_lock锁,对jiffies_64和xtime进行保护(为什么jiffies不用保护) 应答或重新设置系统时钟 周期性地使用墙上时间更新实时时钟 调用体系结构无关的时钟例程:do_timer(): Jiffies_64变量加1 更新资源消耗的统计值 执行到期的动态定时器 执行sheduler_tick()函数 更新墙上时间并存到xtime变量中 计算平均负载值 Linux下的时钟中断和相关时间应用 Do_timer() void do_timer(struct pt_regs *regs) { jiffies_64++; update_process_times(user_mode(regs)); update_times(); } Linux下的时钟中断和相关时间应用 Void update_process_times(int user_tick) { Struct task_struct *p = current; Int cpu = smp_processor_id() Int system = user_tick ^1; … }(见书上P123) Linux下的时钟中断和相关时间应用 统计的不精确性 根据上面的处理可以看出,一个节拍的时间要么给一个用户进程,要么给系统,这样做很不精确,因为在一个节拍中进程可能多次进
文档评论(0)