Linux的系统时间和硬件时间

一.概念:
Linux系统中时间分为系统时间和硬件时间:
系统时间是指Linux内核中的时间;
硬件时间是指主板上的硬件时钟所计算的时间。不同的时间,设置的方法也不一样。
详细说明如下:
1. “系统时间”与“硬件时间
    系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
    硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
2. “UTC时间”与“本地时间
    UTC时间:Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界协调时间(又称世界标准时间、世界统一时间),在一般精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是一样的,其实也就是说 GMT≈UTC,但 UTC 是以原子钟校准的,更精确。
    本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是
本地时间 = UTC + 时区   或   UTC = 本地时间 - 时区
    时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。

二.设置
1)系统时间的设置方法:date 月日时分年 如 1月21日13点50分2015年,sudo date 112113502015
注:
date可以打印/设定系统时间.(直接调用 date,得到的是本地时间。如果想得到UTC时间的话,使用 date -u。)
打印系统时间时,date命令会通过调用clock_gettime函数获取时间,同时会通过localtime文件(时区文件)计算出本地的时间.
设定系统时间时,date命令会通过读取localtime文件(时区文件)确定本地的时区,再调用clock_settime函数计算出本地的时间.

2)硬件时间的设置方法:hwclock --set --date="月/日/年 时:分"
注:
1)hwclock首先打开了/dev/rtc,读取硬件时钟.
2)打开/etc/adjtime文件,通过先前的记录来估算硬件时钟的偏差,并用来校正目前的时间.
3)打开/etc/localtime时区文件,将硬件时间转换为当前时区对映的时间.

-r, --show        读取并打印硬件时钟(read hardware clock and print result)
-s, --hctosys    将硬件时钟同步到系统时钟(set the system time from the hardware clock)
-w, --systohc    将系统时钟同步到硬件时钟(set the hardware clock to the current system time)

补充:
  直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,如果启用了UTC(UTC=true),显示的其实是经过时区换算的时间而不是BIOS中真正的时间,如果加上 --localtime 选项,则得到的总是 BIOS 中实际的时间.
[12-01 19:07> ~]# hwclock
2009年12月07日 星期一 14时28分43秒  -0.611463 seconds
[12-01 19:07> ~]# hwclock --utc
2009年12月07日 星期一 14时28分46秒  -0.594189 seconds
[12-01 19:07> ~]# hwclock --localtime
2009年12月07日 星期一 06时28分50秒  -0.063875 seconds

RTC
Real time clock(RTC):实时时钟是用来持久存放系统时间的设备,即便系统关闭后,它也可以靠主板上的微电池提供的电力保持系统定时.


三。总结:
我们可以通过date命令获取系统的时间,系统时间是由可编程定时/计数器产生的输出脉冲触发中断而产生的.每一个输出脉冲也叫做一个时间滴答.
在操作系统中可以通过修改grub中的内核引导参数(tick_divider)来调整时钟中断频率,例如:
我们将tick_divider=10,也就是100Hz,那么每秒就有100次时间滴答,每个时钟滴答就是10毫秒(10ms).相应的系统时间就会每10ms增1.
内核通过通过变量jiffy来记录系统启动后产生的时间滴答的总数.
tick_divider可使用下列值:
2=500 Hz
4=250 Hz
5=200 Hz
8=125 Hz
10= 100 Hz
只限于X86和X86_64架构,不支持Xen.


本文参考文献:http://blog.chinaunix.net/uid-21501855-id-3308222.html
                            http://jackiechen.blog.51cto.com/196075/115751/
                            http://www.linuxidc.com/Linux/2014-09/107029.htm

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。