10

深入浅出计算机组成原理

 3 years ago
source link: https://zhuanlan.zhihu.com/p/197944957
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

深入浅出计算机组成原理

今年一直在补计算机基础相关的内容。包括基础数据结构和算法,操作系统,计算机组成原理。近期刷完了《深入浅出计算机组成原理》专栏,后面还会刷编译原理。

我之前总结过一篇《操作系统导论》这本书(链接,https://zhuanlan.zhihu.com/p/163495639),内容还是相当易懂的。顺便提一句,最近看 CSAPP 又放弃了,第二次了。《深入浅出计算机组成原理》这个专栏的作者水平非常高,自己理解是第一层水平,输出为别人理解的内容是第二层水平,而能举一反三,高屋建瓴地介绍计算机的整个原理,是第三层,作者无疑处于这个水平。学完这个专栏之后,我又看了《Android 开发高手课》专栏,内容对于应用层开发的 Androider 坡度较高,但是没有多少 Android 基础的我,听起来却毫不费劲,知识真的是通用的,Android 底层是 linux,linux 底层是计算机组成原理,学来学去最终都绕不开底层知识。

这是一张作者总结的脑图,学习过程中一定要学会抽象,抽象就是一种体系化的建立知识结构的方式,而脑图就是一种抽象,我们学习过程中可以时常回来看看脑图。

冯诺依曼体系

计算机体系的基础,冯诺依曼提出了一台计算机应该拥有,运算器,处理器,存储器,输入设备和输入设备,五大部分组成。至今我们的计算机还是采用这种架构。

一台电脑有哪些参数

上面是我笔记本MacBook Pro的系统参数。

MacBook Pro (15-inch, 2016)

15 英寸,2016 年生产

Processor 2.6 GHz Quad-Core Intel Core i7

处理器的主频是 2.6GHz,主频是 CPU 的始终频率,计算机的操作都是在时钟信号下执行的,每个时钟信号可以完成一类任务, 2.6GHz 表示一秒钟可以执行 26 亿次时钟信号,它代表了 CPU 速度的快慢。

Quad-Core 代表 4 核,现在笔记本都是一个处理器多个核,可以并行处理多个任务。

Intel Core i7 表示这是 Intel i7 系列是英特尔 CPU 的一种类型,一般数字越大,性能越好,比如 i9 比 i7 速度更快。

Memory 16 GB 2133 MHz LPDDR3

内存为 16GB,频率为 2133MHz。LPDDR 全称为 Low Power Double Data Rate,中文直译低功耗双重数据比率,也是一块芯片,减少电脑的运行功耗,增加带宽等。现在的小米 10 已经使用 LDPPR5,拥有更大的带宽,功耗也更小。

Startup Disk Macintosh HD

启动盘是苹果的硬盘,苹果笔记本应该都是固态硬盘(SSD)。简单说一下固态硬盘和机械硬盘区别,固体硬盘和 CPU 一样,也有有一个个芯片组成,所以效率上会更快,但是寿命不长。机械硬盘是用机械的结构,用磁头在磁盘上进行读写,所以效率不高。

Graphics Intel HD Graphics 530 1536 MB

显卡也用的 Intel Graphics 530 系列,大小 1536MB,是集成显卡,和电脑是一体的。显卡决定了显示器成像的品质和速度。现在电脑,显卡越来越重要,显卡上最重要的是图形处理器(GPU),它也和 CPU 一样,是非常重要的一块芯片。

我们点击系统报告可以看到更多详细的信息,如上图。

比如 L2 缓存,L3 缓存,当然还有 L1 缓存,这里有没有写。从 L2 缓存括号里的 Per Core 就能知道,L2 缓存是每个核都有的,而 L3 是所有核共享的。

是否开启超线程技术。简单介绍一下超线程技术,它是提升 CPU 性能的架构设计。即一个物理的 CPU 核心可以维护两个逻辑层面的 CPU 核心,每个逻辑层面的 CPU 拥有独立 PC 寄存器、指定寄存器和条件寄存器等。

静态链接和动态链接

先找共同点,再分析不同。程序的链接,把对应的不同文件内的代码段,合并到一起,成为最后的可执行文件。通过链接的方式,不同的应用程序可以复用相同的代码,将相同的提取出来,这是计算机经常使用的一种技术。

1、静态链接

我们编写的代码最后都成可执行文件,而静态链接是编译的时候将库文件和我们编写的代码(目标文件)合并成一个可执行文件。特点:1、静态库的链接是在编译阶段完成。2、程序移植方便,与原静态库无关。3、第二个特点也带来了一些诟病,比如静态库更新,引用静态库的执行文件需要全量更新,同一库会被多次引用,浪费空间和资源。

2、动态链接

动态链接在编译阶段并不对连接到目前,运行时才会载入。特点:1、动态库一般是和操作系统强绑定的,可移植性不好。2、节省空间,不同应用程序只指向一份动态库。3、增量更新,应用程序不需要关心动态库的变更。但同时也带来了一个问题,过度依赖动态库,如果动态库出现了一些 bug,对应用程序的打击是致命的。

电路和算数逻辑单元(ALU)

计算机的大脑(CPU)由多个芯片组成,芯片又是由一个个电路组成。

1、门电路

计算机硬件层面设计最基础的单元。包括“与(AND)”,或(OR),非(NOT),异或(XOR),或非门(NOR),与非门(NAND)。这就像最小的积木,通过这个最小单元,我们就能组装成计算机的高楼大厦。

2、分层

分层的思想在计算机中无处不在,要组装一个我们可以用的逻辑单元(Algorithm Logic Unit,ALU)需要经历下面的步骤。

在 CPU 中有这种无数的 ALU,可以想象一台计算机到底有多复杂。

浮点数和定点数

1、定点数

假设我们的计算机是 32 位的,可以用 4 个比特(Byte)来表示 0 ~ 9 的整数,4 个比特 0000 ~ 1111 对应 10 进制是 0 ~ 15,会多出几位,但是 3 个比特又表示不全。32 位比特能表示 8 位数,如果最后两位为小数,可以表示 0 ~ 999999.99 范围内的 1 亿个数。假设用来表示钱,最多能表示 100 万,这显然是不够的,所以就引入了浮点数。

2、浮点数

用定点数表示的数值范围太少,而浮点数用科学计数法表示数值。如下图,32 位的比特被分为 3 个区域。s 为 symbol,表示符号位。e 为 exponent,指数位。f 为,有效位。

那我们就可以得到下面的公式,它表示的值的范围为 1.17×10^−38 和 3.40×10^38,比原来定点数的表示方法大得多。

3、浮点数丢失

浮点数的运算需要先对齐,再运算。整数用二进制表示是对 2 取余。而小数部分则是反向操作,一直乘以 2。以 0.1001 为例。

转成十进制为 0.5625。

用浮点数表示,这里我们发现最终会有一个 0.1无限循环,最终0011无限循环。而有效位最多为 23 位,所以最后多出来的 1 会被截断,导致精度丢失。

9.1 用浮点数表示为010000010 0010 0011001100110011 001,浮点数转成十进制为9.09999942779541015625,很明显的一个精度丢失的例子。

4、防止精度丢失

可以采用Kahan Summation算法,每次计算的时候,把计算中精度损失的部分保存下来,最后再做一次计算,将丢失的精度弥补回来。

CPU 原理

CPU = 指令 + 运算。我们的代码都可以转换成一条条指令,然后CPU控制执行的时序问题。(CPU的内容实在太多了,偷个懒)

GPU 原理

计算机里另一个重要的处理器。GPU相对于CPU,更加纯粹,没有分支预测,没有L1,L2等复杂的缓存技术,也不依赖之前的指令计算结果。适合顺序执行,没有依赖关系,可以并行独立计算的应用。

从上图可以看出,GPU采用了数量众多的计算单元和超长的流水线,控制逻辑简单,并且没有Cache。

RISC 和 CISC

CPU执行运算速度受三个因素的影响:
  (1)程序中指令数I;
  (2)每条指令执行所用周期数CPI;
  (3)周期时间T。
  这三者又有:程序执行时间=I*CPI*T,因此,从这个等式可看出减小其中任一个都可提高CPU的速度。

CISC,Complex Instrument Set Computing,复杂指令集。RISC,Reduced Instrument Set Computing,精简指令集。两者的差别在于 RISC 实现了更小粒度的指令集,更像程序里通过基础组件封装成高级组件。RISC 通过减少指令数,功能更简单,每个指令所执行的时间短,这样CPU可以达到高频,高频意味着CPI低,CPI低,CPU执行时间就变低。而CISC则通过将指令合并,这样程序中需要执行的指令集就大大减少。也就是减少了公式中的I,从而达到提高CPU性能的目的,但CISC有一个缺点,即只有20%的指令常用,80%的指令不常用。

存储器从上往下为寄存器存取器,L1高速缓存,L2高速缓存,L3高速缓存,计算机内存,计算机外部存储(SSD和HDD)。越往下容量越大,速度越慢,价格越低。

通用的知识越早学越好,早点在脑子建立知识地图,知识间建立链接,站在更高的角度降维打击。如 Redux 作用 Dan 说的,“有些人看我很厉害,我只是很早开始学习编程”。

可以看 Dan 是如何逆袭成为 React 核心成员。

从外包到React核心团队成员​mp.weixin.qq.com

我为什么喜欢在极客时间上学习,申明我不是托。我总结了学习的三要素,老师,价钱,配套设施。里面的讲师大都有 10 年以上的开发经验,基本都有一线大厂经验,保证了专栏质量的下限。其次是价钱,一个专栏一般 69 - 129。一般你学完一个专栏就有 20 优惠券,再找一个中间商,你通过他的二维码购买有 24 块钱返现,所以价钱在25 - 85,还是相当便宜。配套设施也相当重要,极客时间这个 App,可多端使用,基本可以做到随时随地学习,还可以统计每周学习情况,有不懂可以直接留言和讲师沟通。

注:文中图片有些来自专栏和网络。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK