Linux计时体系结构

【Linux操作系统分析】定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数

1 基本概念

定时机制连同一些更可见的内核活动(如检查超时)来驱使进程切换。

两种主要的定时测量:

  • 保存当前的时间和日期,以便能通过time(), ftime()和gettimeofday()系统调用把它们返回给用户程序。
  • 维持定时器,这种机制能够告诉内核或用户程序某一时间间隔已经过去了。

定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的。

2 时钟和定时器电路

时钟电路用于跟踪当前时间和产生精确的时间度量。

定时器电路由内核编程,所以它们以udingde,预先定义的频率发出中断。

时钟电路的分类

  • 用于跟踪当前时间

    • 实时时钟RTC
    • 时间戳计数器TSC
  • 产生周期性的时钟中断,用于计时

    • 可编程间隔定时器PIT

2.1 实时时钟RTC——IRQ8上产生中断

当PC被切断电源,RTC还继续工作。

内核通过0x70和0x71I/O端口访问RTC。

能在IRQ8上发出周期性的中断,频率在2HZ~8192HZ之间,可编程

2.2 时间戳计数器TSC

在80x86微处理器中,有一个CLK输入引线接收外部振荡器的时钟信号。TSC在每个时钟信号到来时加1.

TSC是一个64位的时间戳计数器寄存器,汇编指令rdtsc读这个寄存器。Linux在初始化时系统时必须确定时钟信号的频率。

获得tsc的时钟频率:calibrate_tsc()函数通过计算一个大约在5ms的时间间隔内所产生的时钟信号的个数来算出CPU实际频率。

Linux通过rdtscll()或rdtscl()用来读取TSC的事。

与可编程间隔定时器相比,TSC可以获得更精确的时钟。

2.3 可编程间隔定时器PIT

使用I/O端口0x40~0x43

LInux给PC的第一个PIT进行编程,使它以大于1000Hz的频率向IRQ0发出时钟中断,即每1ms产生一次时钟中断,这个时间间隔叫做一个节拍(tick),它的长度以纳秒为单位存放在tick_nsec变量中。

由setup_pit_timer()进行初始化。在init_pit_timer()中初始化时钟中断频率。

与系统时钟信号有关的宏定义:

(1)宏定义Hz

在不同的体系机构下,系统时钟所要求的可编程定时器中断的频率,即每秒tick的个数

(2)宏定义CLOCK_TICK_RATE

记录了不同体系结构下,驱动可编程定时器工作的输入时钟频率

(3)宏定义LATCH

记录了上述两个宏定义的比值,用于在内核初始化过程中设置可编程定时器中计数器寄存器counter的初始值。

3 Linux计时体系结构

LInux的计时体系结构是一组与时间流相关的内核数据结构和函数。

功能:

  • 更新自系统启动以来所经过的时间
  • 更新时间和日期
  • 确定当前进程的执行时间,考虑是否要抢占
  • 更新资源使用统计计数
  • 检查到期的软定时器

内核有两个基本的计时函数:

  • 保持当前最新的时间
  • 计算在当前秒内走过的纳秒数

在单处理器系统中,所有定时活动都由IRQ0上的时钟中断触发,包括:

  • 在中断中立即执行的部分
  • 作为下半部分延迟执行的部分

3.1 计时体系结构的数据结构

3.1.1定时器对象(时钟源)

为了使用一种统一的方法来处理可能存在的定时器资源,内核使用能够了“定时器对象”,它是timer_opts类型的一个描述符。其中最重要的两个方法:

mark_offset:由时钟中断处理程序调用,并以适当的数据结构记录每个节拍到来时的准确时间。

get_offset:使用已记录的值来计算上一次时钟中断(节拍)以来经过的时间。

这两种方法,使得Linuxd计时体系结构能够打到子节拍的分辨率,也就是说,内核能够以比节拍周期更高的精度来测定当前的时间,这种操作被称为“定时插补”。

在内核初始化期间,select_timer()函数设置cur_timer指向适当定时器对象(时钟源)的地址。变量timer_cur存放了某个定时器对应的那个的地址,该定时器是系统可利用的定时器资源中最好的。

3.1.2jiffies变量

一个计数器,用来记录自系统启动以来产生的节拍总数。

因为一秒钟内产生系统时钟中断次数等于宏定义HZ的值,所以变量jiffies的值在一秒内增加HZ。

3.1.3xtime变量

xtime变量存放当前时间和日期,它是一个timespec类型的数据结构。以便内核对某些对象和事件作时间标记,如记录文件的创建时间、修改时间、上次访问时间,或者供用户进程通过系统调用来使用。

基本每个tick更新一次。

3.2 单处理器系统上的计时体系结构

考点:tick_handle_periodic函数的功能(Linux的计时体系结构的功能)

tick_init调用clockevents_tegister_notifier注册tick_notifier到clockevents_chain上。

Update_wall_time()完成变量xtime的更新。

time_init_hook()来设置系统时钟中断处理程序。

在时钟中断处理函数中:

会调用tick_init函数,书上很多流程中的函数最终都是被这个函数所调用,流程如下:

4 软定时器和延迟函数

软定时器:

  • 动态定时器(内核)
  • 间隔定时器(可以用户)

动态定时器:被动态的创建和撤销,当前活动的动态定时器个数没有限制

定时器是一种软件功能,即允许在将来的某个时刻,函数在给定的时间间隔用完时被调用。每个定时器都包含一个字段,表示定时器将需要多长时间才到期。这个字段的初值就是jiffies的当前值加上合适的节拍数。

注意,对于必须严格遵守定时时间的那些实时应用而言,定时器并不适合,因为定时器的检查总是由可延迟函数进行。

4.1创建并激活一个动态定时器——init_timer初始化一个time_list对象

  • 创建一个新的timer_list对象
  • 调用init_timer初始化,并设置定时器要处理的函数和参数
  • 设置定时时间
  • 使用add_timer加入到合适的链表中

具体的步骤:

4.2动态定时器的数据结构

用于和系统核心变量jiffies进行比较。

  • 成员变量function:该函数指针变量保存了内核定时器超时后要执行的函数,即定时器超时处理函数。
  • 成员变量data:该无符号长整型变量用作定时器超时处理函数的参数。
  • 成员变量base:该指针变量表明了该内核定时器节点归属于系统中哪一个处理器,在使用函数init_timer()初始化内核定时器节点的过程中,将该指针指向了一个每处理器变量tvec_bases的成员变量t_base。

4.3动态定时器的维护

run_timer的主要功能

  • 定时器时间表示参数加一
  • 处理的定时器去除
  • 依次处理到期定时器

动态定时器应用之delayed work

动态定时器应用之schedule_timeout:  setup_time_on_stack(&timer, process_timeout, (unsigned long)current);  timer时间到了之后,process_timeout函数将当前进程变为等待态。

4.4延迟函数:

当内核需要等待一个较短的时间间隔,如几毫秒,通常设备驱动器会等待预先定义的整个微秒直到硬件完成某些操作。这些情况下,内核使用udelay()和ndelay()函数:前者接收一个微秒级的时间间隔作为它的参数,并在指定的延迟结束后返回,后者与前者类似,但是指定延迟的参数是纳秒级的。

http://www.cnblogs.com/suzhou/archive/2013/06/04/3638986.html

时间: 2024-10-07 03:10:49

Linux计时体系结构的相关文章

linux异常体系结构

以arm处理器为例, 外部中断和处理器内核异常(soc内部)都属于异常, 异常都是相对于主程序来讲的, 当soc正常执行主程序时, 中断和异常都可以打断它, 但是依据异常对于主程序所体现出来的"中断"性质可以区分出中断和异常的区别: 异常: 由于soc本身的内核活动产生的, 如当执行主程序时候由于arm soc预取指令/数据而产生异常等, 这个异常来自soc的内核, 所以对于soc内核来说是"同步"的. 中断: 当soc在执行主程序的时候, 各种片上外设和外部中断引

linux文件系统体系结构 和 虚拟文件系统(VFS)

图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点. VFS 是底层文件系统的主要接口.这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大.有两个针对文件系统对象的缓存(inode 和 dentry).它们缓存最近使用过的文件系统对象. 每个文件系统实

Linux异常处理体系结构

目录 更新记录 1.异常处理概述 1.1 异常的作用 1.2 常见的异常类型 2.异常处理流程 2.1 异常处理框架 2.2 中断处理流程 2.3 中断的注册与卸载 3.案例:按键 3.1 轮询方式 3.2 中断方式 参考 更新记录 version status description date author V1.0 C Create Document 2019.1.1 John Wan V2.0 A 添加案例 2019.1.13 John Wan status: C―― Create, A-

学习Linux的体系结构

一.Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件--控制计算机的硬件资源,并提供上层应用程序运行的环境.用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源.存储资源.I/O资源等.为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用. 系统调用是操作系统的最小单位,这些系统调用根据不同的应用场景可以进行扩展和裁剪,现在各种版本的U

准备把深入理解Linux内核这本书细看一遍

第一章 绪论 Linux与其他类Unix内核的比较 硬件的依赖性 Linux版本 操作系统基本概念 Unix文件系统概述 Unix内核概述 第二章 内存寻址 内存地址 硬件中的分段 Linux中的分段 硬件中的分页 Linux中的分页 第三章 进程 进程.轻量级进程和线程 进程描述符 进程切换 创建进程 撤销进程 第四章 中断和异常 中断信号的作用 中断和异常 中断和异常处理程序的嵌套执行 初始化中断描述符表 异常处理 软中断及tasklet 工作队列 从中断和异常返回 第五章 内核同步 内核如

Linux用户管理(一)Linux系统概述

Linux系统概述 一. 认识Linux 1.Linux的性质 Linux为一种源码公开的自由软件,是一种真正多任务和多用户的网络操作系统. Linux的多用户和多任务.同时开设多个用户终端.可以由用户同时运行多个程序 2.  Linux的发展历史 (1)  UNIX和Linux的发展: -1968年 美国的kenThompson在贝尔实验室关于一个Multics项目开始了UNIX的历史(基于PDP-11平台,使用汇编语言) -1970年 第一版的UNIX出现在贝尔实验室,此时的UNIX支持三个

linux内核编译与开发

一.Linux内核简介linux kernel map: linux 系统体系结构: linux kernel体系结构: arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RING0级别最高, 这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了 充分的保护 用户空间(用户模式)转到内核空间(系统模式)方法: ·系统调用 ·硬件中断 linux kernel 体系结构: 虚拟文件系统VFS: VFS(虚拟文件系统)隐藏各种文件系统的具体细节,

【转】LINUX文件系统剖析

引自:http://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/   在文件系统方面,Linux? 可以算得上操作系统中的 "瑞士军刀".Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统.对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台.本文讨论 Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构.

2016版《Linux 集群原理与实践》视频教程上线了!

课程简介: 在本课程中,我们通过学习群集基础原理,了解Pacemaker.Corosync等常见开源群集解决方案,再通过大量动手实验,深入掌握多种场景下高可用业务的构建,包括NFS.SAN.DRBD存储,HTTP.MySQL应用等. 实验环境为:CentOS 7.2 课程链接:http://edu.51cto.com/course/course_id-7249.html 课程大纲: 第1章:群集基础 群集概述 使用群集益处 高可用解决方案概述 故障转移群集概述 仲裁模式概述 第2章:Linux群