初探linux子系统集之timer子系统(二)
想着博客中还没有翻译过一篇文章,虽然英文水平有限,但是借助google翻译慢慢地翻译出一篇文章也是不错的选择。那就来学习下hrtimer的文档吧,翻译的略搓,可以直接跳过这篇,这里仅作为学习的过程!^_^
hrtimers - 高精度内核timers子系统
----------------------------------------------------
这个补丁是介绍一个新的高精度内核timers子系统。
可能有人会问:我们已经有了一个timer子系统(kernel/timers.c),为什么我们需要两个timer子系统呢?在长期的来回试图将高分辨率和高精度的功能集成到现有的timer框架,并在实践中对高精度timers的实现经过各种测试后,我们最终得出了结论是timer的时间轮代码基本上说不适合这样的做法的。我们最初不相信这个(必须有一个解决方案),并发费了相当大的努力试图整合到timer时间轮里,但是我们失败了。事后看来,这种整合很难/不可能是有很多原因的:
1、强制将低分辨率和高分辨率的timers以同样的方式处理导致了很多妥协和很多#ifdef的宏。timers.c代码是非常严格地关于jiffies和采取32位数的,并且已经被磨练和优化到相对狭窄的用例很多年了,因此即使是很小的扩展,也很容易毁掉时间轮的概念,从而导致更加糟糕的妥协。timer时间轮代码是非常好的,紧凑的代码,而且在目前的使用情况下没有出现任何问题,但是它根本就不适合再扩展到高分辨率tmers了。
2、级联的不可预知的O(n)的开销会导致需要更复杂的处理高精度计时器的延迟,从而又降低了鲁棒性。这样的设计还是会引起相当大的时间不准确。级联是timer时间轮概念的基本属性,它不能被设计出在不可接受的方式中带来不必然的降低timer.c部分代码。
3、目前posix的timer子系统上timer时间轮的实现已经推出了相当复杂的处理CLOCK_REALTIME timers的settimeofday或者ntp time-我们的经验,进一步的例子:timer时间轮数据结构对于高精度timers过于严格了。
4、timer时间轮代码是可被确定的最优化的“timeout”用例。这样的超时通常设置为覆盖各种I/O路径的错误,如网络和块的I/O。绝大多数的timers永不过期,很少级联,因为预期正确的事件都及时到来,所以在需要处理它们之前就可以在timer时间轮里面删除了。因而这些超时的用户可以接受timer时间轮的粒度和精度的权衡,并在很大程度上期待timer子系统的开销接近于0。对它们来说准确不是核心目的-事实上大部分使用的超时值都是热点。对它们来说,至多是一个必要以保证超时的完成,因此,这应该是最便宜和不显眼的了。
精密timer的主要用户是用户空间的程序,它们使用nanosleep,posix的timers和itimer的接口。此外,在内核中,用户喜欢驱动程序和子系统也用timer的事件(例如多媒体),可以从一个单独的益高精度timer子系统中受益。
虽然该子系统目前还不提供高精度的时钟源,但是该高精度子系统可以很容易地扩展高精度时钟的功能,并且补丁已经存在并迅速成熟。为实时和多媒体应用的需求日益增加以及用于精确的计时器的其他潜在用户提供了另一个理由分开超时和精准计时器的子系统。
另一个潜在的好处是,这样的分离允许甚至更特殊用户在现有计时器轮低分辨率和低精度的用例的优化-一旦精确敏感API从计时器轮分离,并且被迁移过来hrtimers。例如,我们可以减少在超时子系统的频率从250HZ到100HZ(或者更小)。
hrtimer子系统的实现细节
----------------------------------------------------
基本的设计考虑是:
-简单
-数据结构不绑定jiffies或者任何其他粒度。一切内核逻辑工作在64位纳秒分辨率-不做任何妥协
-简化现有的,时间相关的内核代码
另一个基本的要求是直接入队列然后排列激活timers。看完一些可能的解决方案,比如基数树和哈希,我们选择了红黑树作为基本的数据结构。红黑树可以作为内核库,并且被用在了众多像内存管理和文件系统等的性能要求很严格的领域。这里红黑树仅用于时间排列顺序,一个单独的列表用于给出后可以让代码快速访问排列定时器,而无需遍历红黑树。
(这单独的列表对之后我们要介绍的高精度的时钟非常有用,此外我们需要分离申请中的和过期的队列,同时保持时间顺序完好)
timer排序的入队列不是纯碎用于高精度时钟而言,虽然它也简化了基于低分辨率CLOCK_REALTIME定时器的绝对的处理。现有的实现需要保持所有额外的列表绝对的CLOCK_REALTIME定时器以及复杂的锁。万一settimeofday和NTP,甚至所有的定时器不得不出队列,timer变化的代码不得不解决这些一个接着一个的问题,并且所有这些都必须再次入队列。timer排序的入队和到期时间,在绝对时间的单位存储将产出posix定时器实现的一切复杂的和缩放不好的代码-时钟可以简单地无需触摸红黑树而设置。这也通常情况下使得处理posix定时器变得更加简单。
锁定和hrtiemers的每个CPu的行为大部分是取自现有的定时器轮的代码,因为它十分成熟,非常适合。由于不同的数据结构,代码共享还不能成功。此外,hrtimer函数现在也越来月清晰明了了-比如hrtimer_try_to_cancel()和hrtimer_cancel()[这大致相当于del_timer()和del_timer_sync()]-所以没有将它们直接的1:1映射,因而没有真正潜力来实现代码的共享。
基本数据类型:每时刻time的值,绝对或者相对的,是在一个特殊的纳秒级分辨率的类型:ktime_t。内核内部是通过宏和内联函数来实现表示ktime_t的值和操作的,并且可以在混合联合类型和64位纳秒之间切换。混合联合类型优化了在32位的CPU的一次转换。这个构建时可选择ktime_t存储格式,实现避免在32位CPU上的64位乘法和除法对性能的影响。这样的操作是经常需要由内核和用户空间的接口和内部时刻格式提供的存储格式之间进行转换。(见/include/linux/ktime.h获取更多详细信息)。
hrtimers-四舍五入的计时器值
----------------------------------------------------
该hrtimer代码将以较低分辨率的时钟围绕计时器事件,因为它必须如此,否则它不会做任何人工舍入的。
一个问题是什么分辨率值应该通过返回给用户所述clock_getres()接口。这将返回一个给定时钟任何实际分辨率-无论是低分辨率,高分辨率,或者人工低分辨率。
hrtimers-测试和验证
----------------------------------------------------
我们用在hrtimers顶部的高分辨率时钟子系统验证,在实践中hrtimer实施细则,我们跑了posix计时器测试,以确保符合规范。我们也在低分辨率的时钟下试验。
该hrtimer补丁转换了下面的内核函数使用hrtimers:
- nanosleep
- itimers
- posix-timers
对于nano sleep喝posix定时器的转变启动了统一的nanosleeo和clock_nanosleep
该代码已经成功在以下平台编译成功:
i386, x86_64, ARM, PPC, PPC64, IA64
hrtimers也集成到-rt树,连同一个hrtimers型高分辨率时钟的实现,所以hrtimers代码也得到了海量的测试并在实践中使用。
初探linux子系统集之timer子系统(二)的更多相关文章
- 初探linux子系统集之timer子系统(三)
因为现在的linux虽然还是可以使用低精度的timer,但是趋势是高精度hrtimer,所以上一篇试着翻译一下hrtimer的一些介绍,翻译的不是很好,看来英语还得好好学习啊,下面还是好好学习下lin ...
- 初探linux子系统集之timer子系统(一)
一般来说要让整个linux系统跑起来,那么一个必须的就是linux的时钟,也就是时间子系统了,这里正好工作需要,那么就研究下linux下的时间子系统了. linux内核必须完成两种主要的定时测量.一个 ...
- 转载-lvs官方文档-Linux服务器集群系统(二)
Linux服务器集群系统(二) LVS集群的体系结构 章文嵩 (wensong@linux-vs.org) 2002 年 4 月 本文主要介绍了LVS集群的体系结构.先给出LVS集群的通用体系结构,并 ...
- 初探linux子系统集之led子系统(二)
巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...
- 初探linux子系统集之led子系统(二)【转】
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37606487 巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一 ...
- 初探linux子系统集之i2c子系统(二)
大概也是前年了,一直没有把那个i2c的子系统讲解完,这里偷个懒,把以前整理的i2c相关的知识再梳理一下,做个了结,然后再去学习timer子系统. 先看下i2c在内核中的代码分布: obj-$(CONF ...
- 初探linux子系统集之led子系统(一)
就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...
- 初探linux子系统集之led子系统(一)【转】
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...
- 初探linux子系统集之i2c子系统(一)
I2c子系统在进公司来的时候就学习过了,可是那是还不是很熟悉linux中的i2c子系统,就没有细看.记得当初很想熟悉linux中的各种总线驱动,想专门写一个关于总线驱动的专集,后来发现好像就没有几个, ...
随机推荐
- [Noi2013]矩阵游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i ...
- 勤拂拭软件系列教程 - java web开发
勤拂拭软件工作室持续推出Java Web开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢java的朋友们学习进步: 1. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建 勤拂拭 ...
- Java Servlet 笔记4
Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的. 读取 HTTP 头的 ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- SQl语句中使用占位符的优点
1.增加SQL代码可读性2.占位符可以预先编译,提高执行效率3.防止SQL注入4用占位符的目的是绑定变量,这样可以减少数据SQL的硬解析,所以执行效率会提高不少 绑定变量是Oracle解决硬解析的首要 ...
- 初识 Runtime
前言 之前在看一些第三方源码的时候,时不时的能碰到一些关于运行时相关的代码.于是乎,就阅读了一些关于运行时的文章,感觉写的都不错,写此篇文章为了记录一下,同时也重新学习一遍. Runtime简介 Ru ...
- …… are only available on JDK 1.5 and higher 错误(spring 的jdk版本检测在jdk 8下的修订)
正常方法 用更高的版本,因为spring向下兼容. 我公司需求的方法(真 迟早跑路) 1.在项目中创建一个package为org.springframework.core 2.在该package下面新 ...
- 去掉Bootstrap fileinput缩略图上面的上传删除按钮?
- Nginx+tomcat配置集群负载均衡
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...
- 全局变量&局部变量,global&nonlocal
###全局变量与局部变量 1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量 2.函数内部的变量名如果第一次出现,且 ...