第五章学习笔记

一、摘要

本章讨论了定时器和定时器服务;介绍了硬件定时器的原理和基于 Intel x86 的 PC 中的硬件定时器;讲解了 CPU操作和中断处理;描述了 Linux 中与定时器相关的系统调用、库函数和定时器服务命令;探讨了进程间隔定时器、定时器生厅成的信号,并通过示例演示了进程间隔定时器。编程项目的目的是要在一个多任务处理系统中实现定时器、定时器中断和间隔定时器。多任务处理系统作为一个 Linux 进程运行,该系线2统是 Linux 进程内并发任务的-个虚拟 CPU。Linux 进程的实时模式间隔定时器被设计为定期期生成 SIGALRM 信号,充当虚拟 CPU 的定时器中断,虚拟 CPU 使用 SIGALRM 信号捕捉器作为定时器的中断处理程序该项目可让读进程通过定时器队列实现任务间隔定时器,还可可让读进程使用 Linux 信号掩码来实现临界区,以防止各项任务和中断处理程序之间出现竞态态条件

二、学到了什么

1.硬件定时器
定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个倒计时值对计数器进行编程,每个时钟信号减1。当计数减为0时,计数器向CPU生成一个定时器中断,将计数值重新加载到计数器中,并重复倒计时。计数器周期称为定时器刻度,是系统的基本计时单元。
2.间隔定时器
所谓“间隔定时器就是指定时器采用“间隔”值来作为计时方式,当定时器启动后,间隔值interval将不断减小。当interval值减到0时,我们就说该间隔定时器到期。与上一节所说的内核动态定时器相比,二者最大的区别在于定时器的计时方式不同。内核定时器是通过它的到期时刻expires值来计时的,当全局变量jiffies值大于或等于内核动态定时器的expires值时,我们说内核内核定时器到期。而间隔定时器则实际上是通过一个不断减小的计数器来计时的。虽然这两种定时器并不相同,但却也是相互联系的。假如我们每个时钟节拍都使间隔定时器的间隔计数器减1,那么在这种情形下间隔定时器实际上就是内核动态定时器(下面我们会看到进程的真实间隔定时器就是这样通过内核定时器来实现的)

各间隔定时器在参数 which指定的不同时间域中工作。当间隔定时器定时到期时,会向进程发送一个信号,并将定时器重置为指定的间隔值(如果是非零数)。一个信号就是发送给某个进程进行处理的一个数字(1到31)。有3类间隔定时器,分别是:

(1)ITIMER_REAL****:实时减少,在到期时生成一个SIGALRM(14)信号。

(2)ITIMER_VIRTUAL****:仅当进程在用户模式下执行时减少,在到期时生成一个SIGVTALRM(26)信号。

(3)ITIMER PROF****:当进程正在用户模式和系统(内核)模式下执行时减少。
3.个人计算机定时器
基于Intel x86的个人计算机有数个定时器(Bovet和 Cesati 2005).
(1)实时时钟(RTC):RTC由一个小型备用电池供电。即使在个人计算机关机时,它也能连续运行。它用于实时提供时间和日期信息。当Linux启动时,它使用RTC更新系统时间变量,以与当前时间保持一致。在所有类Unix系统中,时间变量是一个长整数,包含从1970年1月1日起经过的秒数。
(2)可编程间隔定时器(PIT)(Wang2015):PIT是与CPU分离的一个硬件定时器。可对它进行编程,以提供以毫秒为单位的定时器刻度。在所有IO设备中,PIT可以最高优先级IRQ0中断。PIT定时器中断由Linux内核的定时器中断处理程序来处理,为系统操作提供基本的定时单元,例如进程调度、进程间隔定时器和其他许多定时事件。
(3)多核CPU中的本地定时器(Intel1997;Wang2015):在多核CPU中,每个核都是一个独立的处理器,它有自已的本地定时器,由 CPU时钟驱动。
(4)高分辨率定时器;大多数电脑都有一个时间戳定时器(TSC),由系统时钟驱动。它的内容可通过64位TSC寄存器读取。由于不同系统主板的时钟频率可能不同,TSC不适合作为实时设备,但它可提供纳秒级的定时器分辨率。一些高端个人计算机可能还配备有专用高速定时器,以提供纳秒级定时器分辨率。
4.CPU操作
每个CPU都有一个程序计数器(PC),也称为指令指针(IP),以及一个标志或状态寄存器(SR)、一个堆栈指针(SP)和几个通用寄存器,当PC指向内存中要执行的下一条指令时,SR包含CPU的当前状态,如操作模式、中断掩码和条件码,SP指向当前堆栈栈顶。堆栈是CPU用于特殊操作(如 push、pop调用和返回等)的一个内存区域。CPU操作可通过无限循环进行建模
5.时钟服务函数
在linux下,常用的获取时间的函数有如下几个:

asctime, ctime, gmtime, localtime, gettimeofday ,mktime, asctime_r, ctime_r, gmtime_r, localtime_r

(1)gettimeofday-settimeofday

#include<sys/time.h>
int gettimeofdat(struct timeval *tv,struct timezone *tz);
int settimeofdat(const struct timeval *tv,const struct timezone *tz);

(2)time系统调用

time_t time (time_t *t)

(3)times系统调用

clock_t times(struct tms *buf);

(4)time和data命令

  • date:打印或设置系统日期和时间
  • time:报告进程在用户模式和系统模式下的执行时间和总时间
  • hwclock:查询并设置硬件时钟(RTC),也可通过BIOS来完成

三、实践与代码

5.1gettimeofdat系统调用:
源代码:

运行结果:

5.3.time系统调用
源代码:

运行结果:

posted @ 2021-11-06 14:21  李业达  阅读(58)  评论(0编辑  收藏  举报