您的位置:首页 > 运维架构 > Linux

悟空学Linux专栏----第19篇

2015-07-10 15:10 447 查看
  今天悟空早早地就下载了达人先生的课件,悟空打算接着昨天的问题继续研究。悟空先研究tv1、tv2、tv3、tv4、tv5中存放的数据的条件。按照达人老师的课件。tv1中存放的是定时器的到期时间减去tvec_base中的timer_jiffies(和jiffies相等)的值小于2^8的值的定时器,tv2是存放着这个值在2^8 ~2^14之间的定时器,tv3是存放着这个值在2^14 ~2^20之间的定时器,tv4是存放着这个值在2^20 ~2^26之间的定时器,tv5是存放着这个值在2^26 ~2^32之间的定时器。然而令悟空感到困惑的是timer_jiffies会随着时间jiffies的变化,如果每次jiffies变化系统按照上面的规则调整一次五个数组,那么当系统的定时器足够多的时候,系统就需要花费很多时间来维护这些链表。这点让悟空很不明白,悟空觉得红黑树处理的效果可能会更好。

  但是Linux内核为什么不用红黑树来管理定时器呢?悟空最后还是决定夜访达人去请教。

  悟空:老师,如果每经过一个jiffies的时间,系统就要调整一次管理定时器的五个数组,那么系统不是要花费很多时间来处理定时器。

  达人:其实Linux内核之所以要将定时器分为五个数组管理是由原因的,这五个数组就像五个轮子,前面的轮子转一圈,后面的轮子只需要转一个齿轮。

  悟空听了之后感觉更加困惑了,怎么这个还和轮子有关了。

  悟空:老师,你能不能具体一点?

  达人:哦,其实很简单,定时器并不是每增加一个jiffies系统就调整一次struct tvec_base中5个链表,而是当struct tvec_base中的timer_jiffies的低八位全为零时,调整一次tv2中的链表,将tv2中的满足条件的迁移到tv1中。而当timer_jiffies的8-13位为0时,调整一次tv3的链表,将符合条件的tv3的链表中的数据迁移到tv2中。

  悟空:哦,原来是这样啊,那么这个表示不是很复杂吗,为什么不用红黑树呢?

  达人:其实这样设计用到了一个很重要的思想,就是用空间换取时间的思想。对Linux系统来说时间是一种很宝贵的资源,通过这种设计,虽然占用了更多的内存,但是却很好的将算法复杂度降低了。而采用红黑树却会加大调整时间,导致系统要花费很多时间在红黑树的调整上。其实低分辨率的定时器的时间精度比较低,一般只有毫秒级别的,而且有些时候即使低分辨率的定时器到期了,系统也不一定会执行,系统只能保证延时不小于定时器设定的时间。而Linux系统中还有一种定时器叫高精度定时器,这种定时器可以达到ns级别。

  悟空:唉,学了半天原来白学了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息