`
dowhathowtodo
  • 浏览: 777975 次
文章分类
社区版块
存档分类
最新评论

linux世界里的时间概念

 
阅读更多

通常,操作系统可以使用三种方法来表示系统的当前时间与日期:

①最简单的一种方法就是直接用一个64位的计数器来对时钟滴答进行计数。
②第二种方法就是用一个32位计数器来对秒进行计数,同时还用一个32位的辅助计数器对时钟滴答计数,之子累积到一秒为止。因为232超过136年,因此这种方法直至22世纪都可以让系统工作得很好。
③第三种方法也是按时钟滴答进行计数,但是是相对于系统启动以来的滴答次数,而不是相对于相对于某个确定的外部时刻;当读外部后备时钟(如RTC)或用户输入实际时间时,根据当前的滴答次数计算系统当前时间。
UNIX类操作系统通常都采用第三种方法来维护系统的时间与日期。
1 基本概念
首先,有必要明确一些Linux内核时钟驱动中的基本概念。
(1)时钟周期(clock cycle)的频率:8253/8254 PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。
Linux用宏CLOCK_TICK_RATE来表示8254 PIT的输入时钟脉冲的频率(在PC机中这个值通常是1193180HZ),该宏定义在include/asm-i386/timex.h头文件中:
#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
(2)时钟滴答(clock tick):我们知道,当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,也即一次时钟滴答。PIT通道0的计数器的初始值决定了要过多少时钟周期才产生一次时钟中断,因此也就决定了一次时钟滴答的时间间隔长度。
(3)时钟滴答的频率(HZ):也即1秒时间内PIT所产生的时钟滴答次数。类似地,这个值也是由PIT通道0的计数器初值决定的(反过来说, 确定了时钟滴答的频率值后也就可以确定8254 PIT通道0的计数器初值)。Linux内核用宏HZ来表示时钟滴答的频率,而且在不同的平台上HZ有不同的定义值。对于ALPHA和IA62平台HZ的 值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。该宏在i386平台上的定义如下(include/asm- i386/param.h):
#ifndef HZ
#define HZ 100
#endif
根据HZ的值,我们也可以知道一次时钟滴答的具体时间间隔应该是(1000ms/HZ)=10ms。
(4)时钟滴答的时间间隔:Linux用全局变量tick来表示时钟滴答的时间间隔长度,该变量定义在kernel/timer.c文件中,如下:
long tick = (1000000 + HZ/2) / HZ; /* timer interrupt period */
tick变量的单位是微妙(μs),由于在不同平台上宏HZ的值会有所不同,因此方程式tick=1000000÷HZ的结果可能会是个小数, 因此将其进行四舍五入成一个整数,所以Linux将tick定义成(1000000+HZ/2)/HZ,其中被除数表达式中的HZ/2的作用就是用来将 tick值向上圆整成一个整型数。
另外,Linux还用宏TICK_SIZE来作为tick变量的引用别名(alias),其定义如下(arch/i386/kernel/time.c):
#define TICK_SIZE tick
(5)宏LATCH:Linux用宏LATCH来定义要写到PIT通道0的计数器中的值,它表示PIT将没隔多少个时钟周期产生一次时钟中断。显然LATCH应该由下列公式计算:
LATCH=(1秒之内的时钟周期个数)÷(1秒之内的时钟中断次数)=(CLOCK_TICK_RATE)÷(HZ)
类似地,上述公式的结果可能会是个小数,应该对其进行四舍五入。所以,Linux将LATCH定义为(include/linux/timex.h):
/* LATCH is used in the interval timer and ftape setup. */
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
类似地,被除数表达式中的HZ/2也是用来将LATCH向上圆整成一个整数。
2 表示系统当前时间的内核数据结构
作为一种UNIX类操作系统,Linux内核显然采用本节一开始所述的第三种方法来表示系统的当前时间。Linux内核在表示系统当前时间时用到了三个重要的数据结构:
①全局变量jiffies:这是一个32位的无符号整数,用来表示自内核上一次启动以来的时钟滴答次数。每发生一次时钟滴答,内核的时钟中断处 理函数timer_interrupt()都要将该全局变量jiffies加1。该变量定义在kernel/timer.c源文件中,如下所示:
unsigned long volatile jiffies;
C语言限定符volatile表示jiffies是一个易该变的变量,因此编译器将使对该变量的访问从不通过CPU内部cache来进行。
②全局变量xtime:它是一个timeval结构类型的变量,用来表示当前时间距UNIX时间基准1970-01-01 00:00:00的相对秒数值。结构timeval是Linux内核表示时间的一种格式(Linux内核对时间的表示有多种格式,每种格式都有不同的时间 精度),其时间精度是微秒。该结构是内核表示时间时最常用的一种格式,它定义在头文件include/linux/time.h中,如下所示:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
其中,成员tv_sec表示当前时间距UNIX时间基准的秒数值,而成员tv_usec则表示一秒之内的微秒值,且1000000>tv_usec>=0。
Linux内核通过timeval结构类型的全局变量xtime来维持当前时间,该变量定义在kernel/timer.c文件中,如下所示:
/* The current time */
volatile struct timeval xtime __attribute__ ((aligned (16)));
但是,全局变量xtime所维持的当前时间通常是供用户来检索和设置的,而其他内核模块通常很少使用它(其他内核模块用得最多的是 jiffies),因此对xtime的更新并不是一项紧迫的任务,所以这一工作通常被延迟到时钟中断的底半部分(bottom half)中来进行。由于bottom half的执行时间带有不确定性,因此为了记住内核上一次更新xtime是什么时候,Linux内核定义了一个类似于jiffies的全局变量 wall_jiffies,来保存内核上一次更新xtime时的jiffies值。时钟中断的底半部分每一次更新xtime的时侯都会将 wall_jiffies更新为当时的jiffies值。全局变量wall_jiffies定义在kernel/timer.c文件中:
/* jiffies at the most recent update of wall time */
unsigned long wall_jiffies;
③全局变量sys_tz:它是一个timezone结构类型的全局变量,表示系统当前的时区信息。结构类型timezone定义在include/linux/time.h头文件中,如下所示:
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
};
基于上述结构,Linux在kernel/time.c文件中定义了全局变量sys_tz表示系统当前所处的时区信息,如下所示:
struct timezone sys_tz;

分享到:
评论

相关推荐

    操作系统安全:linux常用安全技术.docx

    限制特定用户在指定时间从指定地点登录; ?引入概念“client?plug-in?agents”,使PAM支持C/S应用中的机器——机器认证成为可能。? PAM为更有效的认证方法的开发提供了便利,在此基础上可以很容易地开发出替代常规的...

    Linux 文件权限总结

    理解它们是如何实现的是你进入 Linux 世界的第一步。如您所料,这一基本操作在类 UNIX 操作系统中大同小异。实际上,Linux 文件权限系统直接取自于 UNIX 文件权限(甚至使用许多相同的工具)。  但不要以为理解...

    Linux网络操作系统基础:多任务管理.ppt

    守护进程(Daemon): Linux启动时初始化,后台进程 普通进程 常驻内存进程:系统或网络服务 启动: 手工启动: 前台启动 后台启动 调动启动: 调度安排进程的执行时间/场合 (命令或cron守护) 查看系统运行的进程 监测...

    网络课程设计---Linux服务器的配置---ubuntu操作系统.doc

    在这业已竞争纷繁的世界里,Ubuntu 是又一个参与者。那么 Ubuntu 何以有所不同? Debian 是一个广受称道、技术先进且有着良好支持的发行版,Ubuntu 正是基于 Debian 之上,旨在创建一个可以为桌面和服务器提供一个...

    嵌入式系统工程师认证复习资料

    Linux操作系统诞生于1991年的10月5日(第一次正式向外公布的时间)。以后借助于Internet网络,经过全世界各地计算机爱好者的共同努力下,才成为今天世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增长。...

    Block Based CDP module for linux kernel-开源

    此块级CDP模块在开放源代码世界中引入了时间可寻址存储的概念。 它提供了连续的数据保护,还确保了物理和逻辑数据保护。 它还提供了动态恢复点。

    book_linuxkernel_blockdrv:了解 Linux 内核 v4.4 中的多队列块设备是如何工作的

    几年前,一个新的概念被合并到了 Linux 内核的块层中。 在此之前,每个块设备都有一个队列用于 IO 处理。 每个进程向队列中插入一个 IO 请求,块设备驱动程序从队列中提取一个请求。 是的,许多进程和许多处理器共享...

    知者无畏 —— 一个真实的病毒世界.rar

    从事这一行业近十年的时间,我目睹了无数用户的热情、希望和失望,也经历了一次又一次的病毒流行所造成的恐惧,作为一个长期以来以电脑病毒为生的行业人士,感觉到有必要向大家讲述一些真实的病毒故事,在病毒和反...

    leetcode中等题时间-learning:软件工程师、沙箱、算法培训的路线图,它还包含我的日常任务仪表板

    关键概念 吻: 雅格尼 坚硬的 干燥: 设计模式 四人组 - 4 种主要设计模式 战略 单身人士 检查第一个和第二个答案 建设者 适配器 原型 装饰师 游客 抽象工厂 工厂 正面 观察者 [ ] 代理人 代表 命令 状态 纪念 迭代...

    mingw-get-inst-20111118

    编辑本段概念  MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时库。 MinGW,即 Minimalist GNU For Windows。它是一些头文件和...

    大数据路线图:大数据如何改变商业.pdf

    大数据路线图:大数据如何改变商业 如果说 2012 年是大数据概念为人所知、 引人瞩目、 小试牛刀的一年, 那么 2013 年大数据将会实现产品部署,早期投资获得回报,一小部分的产业被颠覆。到了 2014 年,各种大数据...

    黑客反汇编揭秘(第二版).part2.rar

    上架时间:2010-6-12 出版日期:2010 年6月 开本:16开 页码:1 版次:2-1 所属分类: 计算机 > 软件与程序设计 > 汇编语言/编译原理 > 汇编语言程序设计 编辑推荐 俄罗斯著名的安全技术专家Kris Kaspersky...

    黑客反汇编揭秘(第二版).part1.rar

    上架时间:2010-6-12 出版日期:2010 年6月 开本:16开 页码:1 版次:2-1 所属分类: 计算机 > 软件与程序设计 > 汇编语言/编译原理 > 汇编语言程序设计 编辑推荐 俄罗斯著名的安全技术专家Kris Kaspersky...

    harmonyos2-cities-skylines-detour:城市中函数的简单绕行的概念证明:天际线(或更一般地说:Windows上的U

    它达到了它的目的,不仅为城市:天际线启用了高级修改,让世界变得更美好。 任务完成 :) 但是现在,有一个更好、更闪亮、更安全、更棒的替代品: -塞巴斯蒂安 执照 带有相关代码的文件有一个非常明确的许可声明(MIT...

    真实世界的Python仪器监控 数据采集与控制系统自动化

    《真实世界的Python仪器监控:数据采集与控制系统自动化》是2013年 出版的图书,作者是休斯。ISBN 978-7-121-18659-2 本书主要帮助读者了解如何通过自行开发应用程序来监视或者控制仪器硬件。本书内容涵盖了从接线到...

    java8集合源码-jarvis_data_eng_noshin:jarvis_data_eng_noshin

    我的职业目标是能够用我获得的知识和经验解决现实世界的问题。 技能 精通: Java、Bash、SQL、Agile/Scrum、OOP、数据结构、算法、HTML 胜任: Spring、Springboot、Git、R、CSS、Python、机器学习(Scikit-learn)...

    leetcode答案-leapcode:leetcode研讨会和讲座

    问题比答案更重要:世界上万千答案腐烂,只为等待一个好问题 讨论比讲课更重要 您将参加会议,并尝试通过以下方式更好地理解 leetcode 问题 ✧ 参与讨论 ✧ 说出您对算法的想法和设计 ✧ 提出启发性的问题 ✧ 回答...

    matlab精度检验代码-tagbeat:Tagbeat-通过反向散射信号感应振动!

    本文提出了“通信即感知”的概念,即纯粹基于通信载体而不是专用传感器来理解世界。 该项目提出了一个基于RFID的解决方案Tagbeat,用于使用COTS RFID标签和读取器来检查机械振动。 基本和有用的功能列表: 通过COTS ...

    Python语言程序设计源代码.zip

    本书按照首先论道、继而论理、然后操作的顺序,从哲学视角看程序设计,使读者在认识物质世界规律的过程中了解计算机的特点、程序设计的特点和人机交互的规律,在认识世界、解释世界和改造世界的实践中掌握Python编程...

    圣天诺加密锁虚拟程序

    圣天狗是一个强大的软件保护设备,它实现了 163 位椭圆曲线非对称算法和 AES 对称 算法,提供了很多具有创新性的功能 , 并且首次把安全通道的概念引入到基于硬件的软件保护中,彻底解决了被保护软件和安全硬件的安全...

Global site tag (gtag.js) - Google Analytics