计算机 与 时间

114 阅读7分钟

计算机与时间

计算机之中 时间相关的概念

  • 节拍率 赫兹(HZ)
  • 节拍(tick)
  • 实时时钟
  • 硬件时间
  • 系统时间
  • 时区
  • 时间戳
  • 时间
  • 时钟中断
  • 时钟周期
  • 机器指令
  • 指令周期

节拍率 赫兹(HZ)

节拍率是什么?

节拍率 是 软件设置的实时时钟的频率。

Linux 与 节拍率

在Linux下,节拍率 作为一个 预定义变量 被内置在操作系统之中。

节拍

什么是节拍

多久触发一次时间中断

节拍率 与 节拍

节拍 = 1 / 节拍率

实时时钟

什么是 实时时钟

实时时钟(RTC,是硬件):一种可编程的硬件芯片,能以固定的频率产生脉冲,在进一步的设计下,产生中断。
实时时钟又可以被称为 硬件时钟,时钟硬件,实时硬件。
实时时钟的频率是可以通过编程来设置的。
实时时钟通过纽扣电池的支持而能在计算机断电的情况下继续运行。

实时时钟位于计算机的哪个位置

实时时钟 位于 计算机的主板。

时钟中断

什么是时钟中断?

首先 时钟中断 是一个中断,是由硬件定时产生的一个中断。

时钟中断 与 实时时钟(RTC)的关系

实时时钟会按照一定的频率产生脉冲,根据实时时钟产生的脉冲的次数来设置阈值,来判定是否触发时钟中断。

时钟中断的作用?更准确地问 应该是时钟中断处理程序的作用有哪些(程序会执行哪些逻辑?)

  • 1: 更新系统时间
  • 2: 更新本地cpu统计数
  • 3: 检查进程的时间片是否耗尽,如果进程的时间片耗尽,则触发进程调度,使进程让出cpu。
  • 4: 统计cpu使用率 ......

时钟周期 机器周期 指令周期

时钟周期

时钟周期是cpu时钟晶振频率的倒数。时钟周期是计算机之中 最基本,最小的时间单位。时钟周期是cpu这边引出的概念。

机器周期

cpu之中,一条指令的执行 需要分为多个阶段,每个阶段执行完成所需的时间,被称为是机器周期。

指令周期

cpu执行一条指令所耗费的时间。

时钟周期 机器周期 指令周期 之间的关系

一个 指令周期 包含 若干个 机器周期;
一个 机器周期 包含 若干个 时钟周期。

时间片

时间片的含义是什么

时间片 又被称为 cpu时间片。是cpu分配给每个进程的执行时间。

时间片 与 时钟中断 之间的关系

每次时钟中断 会 触发时钟中断处理程序,时钟中断处理程序会进行 进程被分配的时间片是否耗尽的检查。

计算机断电一段时间后,重启,为什么计算机的时间还能是正常的?

这是由于 实时时钟的功劳。主板上的纽扣电池为 实时时钟 提供电源支持,是实时时钟在断电的情况下依然能够运行,进行计时。

硬件时间

什么是硬件时间

就是实时时钟所维持的时间,实时时钟由主板上的纽扣电池来维持运行。

硬件时间 存储的是 UTC 还是 LTC?

ubuntu:
cat /etc/default/rcS
如果输出值为 utc=no,那么硬件时间是LTC(本地时间)

Linux 与 硬件时间

Linux 下 硬件时间的客户端命令

hwclock

硬件时间的查看

hwclock --show

如何设置硬件时间

hwclock --set --date "20140225 20:23:00"

系统时间

什么是系统时间

在系统开机的时候,会自动从BIOS中取得硬件时间,根据时区设置,计算得到系统时间。
系统时间靠 tick 来维持更新

Linux 与 系统时间

Linux下 系统时间的客户端

date

Linux 如何查看当前的系统时间

执行命令 date

image.png

Linux 如何设置当前的系统时间

例子:

date -s "20140225 20:16:00" 

系统时间 和 硬件时间 之间的关系

从三个阶段来分析 系统时间 和 硬件时间 之间的关系

  • 在开机的时候:
    在系统开机的时候,会自动从BIOS中取得硬件时间,设置为系统时间

  • 在Linux 运行的时候:
    系统时间 和 硬件时间 以异步的方式来运行,互不干扰

  • 在关机的时候:
    系统时间不会被保存,会被丢弃

系统时间 和 硬件时间之间的同步

  • 以系统时间为基准,修改硬件时间
hwclock --systohc
  • 以硬件时间为基准,修改系统时间
hwclock --hctosys

为什么要 进行 系统时间 和 硬件时间 之间的同步?

因为 Linux 启动的时候,会从实时时钟读取硬件时间作为系统时间, Linux关机的时候,并不会将系统时间写入到硬件时间,所以当我们发现计算机的系统时间不对,进行系统时间设置之后,还需要将系统时间写入到硬件时间之中,这样的话,计算机重启之后的系统时间才是正确的,不然的话,被设置的系统时间会丢失。

系统时间变化后,sleep函数会有如何反应?

假如 程序 sleep 10分钟,然后在另一个Linux终端,将系统时间调整到 10分钟之后,是否程序立刻结束睡眠呢?

实验方式:
1: 开启两个Linux终端,在一个终端上执行

date; sleep 300; date

在另一个终端上将时间设置为两分钟之后,查看第一个终端的输出结果即可。

实验结果证明:即使将系统时间调后,但是sleep还是会沉睡指定的时间。

时间戳

时间戳的含义是什么?

时间戳:也叫unix时间戳。在同一刻,地球上所有人看到的时间戳都是一致的。unix时间戳是指 从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

编程语言 与 时间戳 (或者说 程序员如何看待时间戳)

编程语言之中获取当前时间戳的方法 的返回值 和 时区无关,修改时区,所返回的时间戳也是不会变化的。

时间

时间的表示

2019-07-04T00:00:00.000Z

程序员看到时间应该注意的

时间是有时区属性的,如果一个时间没有时区的标志,那么这个时间一定是有歧义的,既然是有歧义的时间,那么就会存在bug。

golang 与 时间

golang之中使用什么来表示时间?时间的默认时区是什么?

使用 time.Time 这个结构体来表示时间。
使用 time.Location 这个结构体来表示时区。

golang 如何查看当前使用的时区?

func CurrentZone() {
   fmt.Println(time.Local)
}

golang 如何修改时区?

var cstZone = time.FixedZone("UTC", 0) // 东八
time.Local = cstZone

golang 如何获得当前的时间

  t := time.Now()

golang 如何获得当前的时间戳

  t := time.Now().Unix()

时间戳 时区 时间 的关系

时间戳 + 时区 = 时间

时区

时区的一些信息

全球分为24个时区,在同一时刻,处于不同时区的人所看到的时间是不同的。

Linux 与 时区

Linux系统的时区 会影响哪些方面

Linux 系统启动的时候,会从实时时钟读取时间,并获取当前时区,进行计算,得到系统时间。(这是自己目前的认知)

ubuntu 如何查看当前系统时间的时区

cat /etc/localtime
文件的内容会包含 当前系统时间所出的时区。

Linux 之中的时区是进程级别的嘛?换个问法,进程可以拥有和操作系统不同的时区嘛?

进程是可以拥有与操作系统不同的时区的(java 其实就可以设置时区)