当前位置: 首页 > Linux kernrl > 正文

Linux Kernel 定时器和时间管理(浅析)

前言

计算机时间:

这个三维的世界就是由时间,空间,物质构成的,即使是计算机也离不开时间这个东西,时间之于计算机举足轻重。

计算机的时间

时间管理在内核中占有很重要的地位。相对于事件驱动而言,内核中有大量的函数都是基于时间驱动的。

这里先说几个重要的概念:

相对时间:

假设某一个事件在5秒后发生,那么系统需要的时间就是相对时间。

绝对时间:

如果要求管理当前日期和当前时间,则内核不但需要计算流逝的时间还需要计算绝对时间。

定时器中断:

周期性产生的事件比如10MS一次都是由系统定时驱动的,系统定时器是一种可编程硬件芯片,它能以固定的频率发生中断。

它所对应的中断处理程序负责更新系统时间,也负责周期性运行任务。

动态定时器:

一种用来推迟执行程序的工具,内核可以动态的创建或撤销动态定时器。

内核中的时间

事实上内核必须在硬件的帮助之下才能计算和管理时间。硬件为内核提供了一个系统定时器用来计算流逝的时间。系统定时器以某种频率自行触发也称为“射中” 或 “击中” 时钟中断,该频率可以通过编程预定,称作节拍率。当时钟中断发生时,内核就通过一种特殊的中断处理程序对其进行处理。

这个间隔的时间就称为节拍,它等于节拍率分之一秒。

墙上时间

实际时间对用户空间的应用程序来说最重要,内核通过控制时钟中断维护实际时间,另外内核也为用户空间提供一组系统调用以获取实际日期和实际时间。

系统运行时间

自系统启动开始所经过的时间对用户空间和内核都很有用,因为许多程序都必须清楚流逝的时间。通过求两个时间的差就可以计算出相对的流逝时间了。

一些利用时间中断周期执行的工作

更新系统运行时间,更新实际的时间,在SMP上,各个CPU 运行队列,均衡。运行超时的动态定时器。更新资源消耗和处理器时间的统计值。

节拍率:

系统定时器是通过静态预处理定义的,就是HZ,在系统启动时按照HZ值对硬件进行设置。体系结构不同,HZ的值也不同。

内核也定义了这个值,接拍率有一个HZ频率,一个周期为1/HZ秒。在X86体系结构中,默认值为100,就是100HZ.也就是每秒钟时钟中断100次,当然也有体系结构的默认频率为250 和 1000,分别对应4ms 和 1ms .根据体系结构的不同选择一个合适的频率就必须在各个因素之中取的一个折中的结果。

高频率与低频率的争论:

提高频率的优势:

更高的时钟中断解析度可以提高时间驱动时间的解析度。

提高了时间驱动事件的准确度。

提高节拍率等同于提高中断解析度。比如HZ = 100 的时钟的执行粒度为10 ms ,就是系统中周期事件最快一次为每10ms 运行一次。但是当HZ = 1000 时解析度就便成了1ms 精细了10倍。

内核定时器能够以更高的频度和更高的准确度运行。

依赖定时执行的系统调用,比如poll 和 select 能够以更高的精度运行。

提高进程抢占的精度,尤其是对于需要高抢占精度的进程和对时间有着严格需求的时间来说的进程,有巨大提升。

高频率的劣势

首先高频率意味着系统负担的增加,这样会不断的调用时钟中断处理程序,更会频繁打乱处理器的高速
缓存直接增加了系统的耗电。(但是现在,1000HZ 的负担并不能对现在的处理器造成威胁)

无时钟OS

其实操作系统不一定必须使用固定频率的时钟,其实可以根据系统的空闲程度动态的改变频率,比如当一个系统比较空闲的时候我们假设可以设置50 MS 为中断间隔,当系统非常繁忙的时候我们可以假设设定1MS为系统中断的时间。

jiffies

全局变量jiffies 用来计算自系统启动以来产生的节拍总数,启动时内核将该初始变量设置为0 ,然后每次时钟中断处理程序会增加这个值.

实时时钟与定时器

实时时钟:

RTC 是用来持久存放系统时间的设备,就是电脑内部的那个微型电池,在PC体系结构中RTC 和 CMOS 集成在一起,而且RTC 和 BIOS 的保存设置都是通过统一个电池供电的。内核通过RTC 来初始化墙上时间每然后存放在xtime 中。

系统定时器:

系统定时器是内核定时机制中最为重要的角色。一些体系结构通过电子晶振进行分频来实现系统定时器。

在X86 体系结构中,主要采用可编程中断时钟(PIT)。PIT 在PC机器中普遍存在,而且从DOS 时代开始它就已经是时钟的中断源了。

 

时钟中断处理程序:

就是每次发生时钟中断后,需要执行的程序,类似于中断处理程序,已经注册到内核中了,这个程序一般会完成以下的一些工作:

1.获得墙上时间锁

2.设置系统时钟

3.周期性的使用墙上时间更新实时时钟。

4.调用体系结构无关的时钟例程。

 

所以简单来说:

从CPU的角度看进程:

时钟中断  —->    更新时间    —->    调用定时器(执行软中断)—-> 调度新进程  —->时钟中断

 

本文固定链接: http://zmrlinux.com/2015/12/24/linux-kernel-%e5%ae%9a%e6%97%b6%e5%99%a8%e5%92%8c%e6%97%b6%e9%97%b4%e7%ae%a1%e7%90%86%ef%bc%88%e6%b5%85%e6%9e%90%ef%bc%89/ | Kernel & Me

该日志由 root 于2015年12月24日发表在 Linux kernrl 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux Kernel 定时器和时间管理(浅析) | Kernel & Me
【上一篇】
【下一篇】