linux 的计时器机制,补充

        任何的cpu如果要支持操作系统的话,必须有一个可编程的内部计时器,周期性的给系统发出定时器中断,这种周期性的定时器中断叫做system clock tick,linux对时间管理是通过使用jiffies为单位的,这是一个内核中的全局变量,每次定时器中断到来它的值自增1。
        linux有两种类型的系统计时器,
        第一种,也是比较旧的方案,是一个含有32个指向timer struct 结构的指针的静态指针数组,以及还有一个当前处于激活状态的定时器的掩码(timer_active),这个指针数组所指向的timer struct是内部定义好的,在系统初始化时设置的。这很像bottom half handler table bh_base,是不能够供用户使用的,只对内核提供服务。
        第二种,也是较新的方案,即链表成员是timer_list结构的一个链表, 它们按照expire time的顺序进行排序。

        在每次clock tick中断到来时,系统(因该是时钟中断处理函数)把timer bottom half handler标志位置位,当调度器(scheduler)下次运行时,此timer queue会被处理(see bottom half for detail),timer bottom half handler 会处理以上二者。对于前者,它的掩码(timer_active)会按照bit 1到bit 32的顺序进行处理(分优先级,很类似bottom half hadler table bh_base),如果bit  x被置位并且已经expired,则会调用bh_base[x-1]中的处理函数,然会reset bit x。对于后者,系统会遍历此链表,当entry expired时,系统会呼叫相应的处理函数,然后此expired entry 会被从链表中移除。后者的好处是你可以对超时处理函数传递你自己相应的参数。

你可能感兴趣的:(linux 的计时器机制,补充)