OS - 计算机组成原理及CPU主频揭秘

2021-08-17 16:34:10 浏览数 (1)


大纲视图

我们把整个计算机组成原理的知识点拆分成了四大部分,分别是计算机的基本组成、计算机的指令和计算、处理器设计,以及存储器和I/O设备


计算机的基本组成

运算器、控制器、存储器、输入设备和输出设备这五大基本组件 . 除此之外,我们还需要了解计算机的两个核心指标:性能和功耗


计算机的指令和计算

一条条指令执行的控制过程,就是由计算机五大组件之一的 控制器来控制的。

实现这些运算功能的ALU(Arithmetic LogicUnit/ALU),也就是算术逻辑单元,其实就是计算机五大组件之一的运算器


计算机性能指标

计算机的性能,类比我们自己搬东西 ,有两个指标可以衡量

  • 响应时间(Response time)或叫执行时间(Execution time): 可以理解为让计算机“跑得更快” 。 我们执行一个程序, 花的时间越少,自然性能就越好
  • 吞吐率(Throughput)或者带宽(Bandwidth):可以理解为让计算机“搬得更多”

和搬东西来做对比,如果我们的响应时间短,跑得快,我们可以来回多跑几趟多搬几趟。所以说,缩短程序的响应时间,一般来说都会提升吞吐率。

除了缩短响应时间, 还可以多找几个人一起来搬,这就类似服务器都是8核、16核的。人多力量大,同时处理数据,在单位时间内就可以处理更多数据,吞吐率自然也就上去了。


计算机的计时单位 :CPU时钟

时间是一个很自然的用来衡量性能的指标,但是用时间来衡量时,有两个问题

  • 时 间 不 “ 准 ”

随便写的一个程序,来统计程序运行的时间,每一次统计结果不会完全一样。有可能这一次花了45ms,下一次变成了53ms。

为什么会不准呢?首先,我们统计时间是程序运行结束的时间减去程序开始运行的时间。这个时间也叫Wall Clock Time或者Elapsed Time,就是在运行程序期间,挂在墙上的钟走掉的时间。

但是,计算机可能同时运行着好多个程序,CPU实际上不停地在各个程序之间进行切换。在这些走掉的时间里面,很可能CPU切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和CPU。

所以说, 要 想 准 确 统 计 某 个 程 序 运 行 时 间 , 进 而 去较 两 个 程 序 的 实 际 性 能 , 我 们 得 把 这 些 时 间 给 刨 除

Linux下有一个叫time的命令,可以帮我们统计出来,同样的Wall Clock Time下,程序实际在CPU上到底花了多少时间

代码语言:javascript复制
$ time seq 1000000 | wc -l
1000000
real 0m0.101s
user 0m0.031s
sys 0m0.016s
代码语言:javascript复制
 real time,也就是我们说的Wall Clock Time,也就是运行程序整个过程中流逝掉的时间
 user time,也就是CPU在运行你的程序,在用户态运行指令的时间
 sys time,是CPU在运行你的程序,在操作系统内核里运行指令的时间。

程序实际花费的CPU执行时间(CPU Time),就是user time加上sys time

实际上程序用了0.101s,但是CPU time只有0.031 0.016 = 0.047s。运行程序的时间里,只有不到一半是实际花在这个程序上的


  • 即使我们已经拿到了CPU时间,我们也不一定可以直接“比较”出两个程序的性能差异

即使在同一台计算机上,CPU可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。除了CPU之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。

那如何量化呢?

代码语言:javascript复制
程序的CPU执行时间=CPU时钟周期数×时钟周期时间

时钟周期时间是什么?

Intel Core-i7-7700HQ 2.8GHz,这里的2.8GHz就是电脑的主频(Frequency/Clock Rate)。这个2.8GHz,可以先粗浅地认为,CPU在1秒时间内,可以执行的简单指令的数量是2.8G条。

更准确一点描述,这个2.8GHz就代表,我们CPU的一个“钟表”能够识别出来的最小的时间间隔。就像我们挂在墙上的挂钟,都是“滴答滴答”一秒一秒地走,所以通过墙上的挂钟能够识别出来的最小时间单位就是秒。

在CPU内部,和我们平时戴的电子石英表类似,有一个叫晶体振荡器(Oscillator Crystal)的东西,简称为晶振。我们把晶振当成CPU内部的电子表来使用。晶振带来的每一次“滴答”,就是时钟周期时间。

在这个2.8GHz的CPU上,这个时钟周期时间,就是1/2.8G。CPU,是按照这个“时钟”提示的时间来进行自己的操作。主频越高,意味着这个表走得越快,CPU也就“被逼”着走得越快。

在回到上面程序CPU执行时间的公式

代码语言:javascript复制
程序的CPU执行时间=CPU时钟周期数×时钟周期时间

最简单的提升性能方案,自然缩短时钟周期时间,也就是提升主频。换句话说,就是换一块好一点的CPU。

这个是硬件的,控制不了, 那我们看另一个因子——CPU时钟周期数上。如果能够减少程序需要的CPU时钟周期数量,一样能够提升程序性能。

对于CPU时钟周期数,可以再做一个分解,把它变成“指令数× 每 条 指 令 的 平 均 时 钟 周 期 数(Cycles PerInstruction,简称CPI)”。

不同的指令需要的Cycles是不同的,加法和乘法都对应着一条CPU指令,但是乘法需要的Cycles就比加法要多,自然也就慢。

在这样拆分了之后,程序的CPU执行时间就可以变成这样三个部分的乘积。

代码语言:javascript复制
程序的CPU执行时间=指令数×CPI×Clock Cycle Time

因此,如果想要解决性能问题,其实就是要优化这三者。

  1. 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。
  2. 每条指令的平均时钟周期数CPI,就是一条指令到底需要多少CPU Cycle。 现代的CPU通过流水线技术(Pipeline),让一条指令需要的CPU Cycle尽可能地少。因此,对于CPI的优化,也是计算机组成和体系结构中的重要一环。
  3. 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。

类比一下 ,把自己想象成一个CPU,坐在那里写程序。

计算机主频就好像是打字速度,打字越快,你自然可以多写一点程序。

CPI相当于你在写程序的时候,熟悉各种快捷键,越是打同样的内容,需要敲击键盘的次数就越少。

指令数相当于你的程序设计得够合理,同样的程序要写的代码行数就少。

如果三者皆能实现,自然可以很快地写出一个优秀的程序,“性能”从外面来看就是好的。


小结

“响应时间”这个性能指标主要体现在 提升计算机主频,优化CPU设计使得在单个时钟周期内能够执行更多指令,以及通过编译器来减少需要的指令数。

0 人点赞