硬件上,一个soc上面有:时钟源、定时器。时钟源用于产生不同频率的clock,用于不同的模块,比如ahb和apb总线的频率不同;以及用于不同的cpu模式下,比如低功耗模式下的clock的频率更低。定时器是时钟clock作为输入,进行计数,周期性产生中断,定时器的计数周期都是可编程的。这是硬件上时钟和定时器的概念。
而软件上,一般linux系统中提及比较多的概念有:系统时钟、rtc时钟以及local定时器。其实这么三个硬件上都是定时器(计数器)。系统时钟输入是硬件上时钟源clock,然后然后通过编程在一定周期内产生中断,用途是用于产生系统事件执行的节拍,相当于软件概念的clock。rtc时钟也叫cmos时钟,是一个独立的芯片,又bios的电池供电,及时系统关机了,rtc也会保持计时。而local定时器,硬件和系统时钟一样是定时器,但是它的作用不是为整个系统提供节拍,而是用在事件的定时延时上。
linux中,时间有两个:1,系统时间,从系统启动到当前的时间;2,墙上时间,也叫实际时间,存放着UTC以来经过的时间,我们在操作系统上看到的时间就是该时间。系统时间以节拍jiffy为单位,每隔jiffy系统时钟会产生一个中断。系统的调度等事件都是基于系统时间,系统中一个jiffies_64变量来记录系统启动在当前总共的节拍数。系统时钟的功能通过中断处理程序实现,它分为两个部分:体系结构相关部分和体系结构无关部分。
体系结构无关部分tick_periodic()函数实现:
(1)给jiffies_64变量加1,维护系统的节拍计数
(2)更新资源消耗的统计值,比如当前进程所消耗的系统时间和用户时间。这里需要解释一下:这个计数并不准确,它的机制是,当前系统时钟到来,是在哪个进程的内核态,那么将该节拍算作该进程的系统时间,在哪个进程的用户态,将该节拍算作进程的用户时间。实际上有可能:1,在这个期间有可能多次进出用户态\内核态之间;2,该进程也不一定是唯一一个运行进程(比如期间发生了主动调用schedule()函数进行调度)。
(3)执行已经到期的动态定时器。动态定时器用来将某事件延迟到一定时间后执行。具体机制是:将该事件的函数绑定为该定时器的处理函数,并且设定计数值,并且所有的定时器形