一. 简介
“练拳不练功,到老一场空”。计算机底层原理,跟下层思维严密相连。
二. 计算机组成
2.1 计算机根本硬件组成
CPU
计算机最重要的外围配件,全名叫中央处理器。
计算机的所有“计算”都是由 CPU 来进行的。天然,CPU 也是整台计算机造价最低廉的局部之一。
内存
你撰写的程序、关上的浏览器、运行的游戏,都要加载到内存里能力运行。程序读取的数据、计算失去的后果,也都要放在内存里。内存越大,能加载的货色天然也就越多。
主板
寄存在内存里的程序和数据,须要被 CPU 读取,CPU 计算完之后,还要把数据写回内存,然而 CPU 不能间接插到内存上,反之亦然。
主板是一个有着各种各样,有时候多达数十乃至上百个插槽的配件,咱们的 CPU 要插在主板上,内存也要插在主板上,主板的芯片组(Chipset)和总线(Bus)解决了 CPU 和内存之间如何通信问题,芯片组管制了数据传输的流转,也就是数据从哪里到哪里的问题。总线则是理论数据传输的高速公路。因而,总线速度(Bus Speed)决定了数据能传输的多快。
有了三大件,只有配上电源供电,计算机差不多能够跑起来了,然而当初还短少各类输出(Input)/ 输入(Output)设施,也就是咱们常说的 I/O 设施。如果你用的是本人的个人电脑,那显示器必定必不可少,只有有了显示器咱们能力看到计算机输入的各种图像、文字,这也就是所谓的输出设备。
显示器、鼠标、键盘和硬盘这些货色并不是一台计算机必须的局部。其实只须要有 I/O 设施,能让咱们从计算机里输出和输入信息。
显卡
当初,应用图形界面操作系统的计算机,无论是 Windows、Mac OS 还是 Linux,显卡都是必不可少的。
当初的主板都带了内置的显卡,如果你用计算机玩游戏,做图形渲染或者跑深度学习利用,你多半就须要买一张独自的显卡,插在主板上。显卡之所以非凡,是因为显卡里有除了 CPU 之外的另一个“处理器”,也就是 GPU(Graphics Processing Unit,图形处理器),GPU 一样能够做各种“计算”的工作。
南桥
鼠标、键盘以及硬盘,这些都是插在主板上的,作为内部 I / O 设施,它们是通过主板上的南桥(SouthBridge)芯片组,来管制和 CPU 之间通信。“南桥”芯片的名字很直观,一方面,它在主板上的地位,通常在主板的“南面”。另一方面,它的作用就是作为“桥”,来连贯鼠标、键盘以及硬盘这些外部设备和 CPU 之间的通信。
北桥
有了南桥,天然对应着也有“北桥”。以前主板上通常也有“北桥”芯片,用来作为“桥”,连贯 CPU 和内存、显卡之间通信。不过随着工夫的变迁,当初主板上的“北桥”芯片的工作,曾经被移到 CPU 外部,所有你在主板上,曾经看不到北桥芯片了。
2.2 冯·诺依曼体系结构
手机里只有 SD 卡这样相似硬盘性能存储卡插槽,并没有内存插槽,CPU 插槽,因为手机尺寸起因,手机制造商门抉择把 CPU、内存、网络通信、乃至摄像头芯片,都封装到一个芯片,而后再嵌入到手机主板上。这种形式 SoC,也就是 System on a Chip(零碎芯片)。
写智能手机上的 App,和写个人电脑的客户端利用仿佛没有什么差异,都是通过“高级语言”这样的编程语言撰写、编译之后,一样是把代码和数据加载到内存里来执行。这是为什么呢?因为,无论是个人电脑、服务器、智能手机,还是 Raspberry Pi 这样的微型卡片机,都遵循着同一个“计算机”的抽象概念。
计算机祖师爷之一冯·诺依曼(John von Neumann)提出的冯·诺依曼体系结构(Von Neumann architecture),也叫存储程序计算机。
存储程序计算机(可编程,可存储)
2.2.1 可编程计算机
不可编程
计算机是由各种门电路组合而成的,而后通过组装出一个固定的电路板,来实现一个特定的计算程序。一旦须要批改性能,就要从新组装电路。
因为程序在计算机硬件层面是“写死”的。
2.2.2 存储计算机
程序自身是存储在计算机内存里,能够通过加载不同的程序来解决不同的问题。
有“存储程序计算机”,天然也有不能存储程序的计算机。典型的就是早年的“Plugboard”这样的插线板式的计算机。整个计算机就是一个微小的插线板,通过在板子上不同的插头或者接口的地位插入线路,来实现不同的性能。这样的计算机天然是“可编程”的,然而编写好的程序不能存储下来供下一次加载应用,不得不每次要用到和以后不同的“程序”的时候,从新插板子,从新“编程”。
驰名的 Engima Machine 就用到了 Plugboard 来进行“编程”
能够看到,无论是“不可编程”还是“不可存储”,都会让应用计算机效率大大降落,而这个对效率的谋求,也就是“存储程序计算机”由来。
2.2.3 第一份草案
冯祖师爷,基于过后在机密开发的 EDVAC 写了一篇报告 First Draft of a Report on the EDVAC,形容了他心目中的一台计算机应该长什么样。这篇报告在历史上有个很非凡的简称,叫 First Draft,翻译成中文,其实就是《第一份草案》。这样,古代计算机的倒退就从祖师爷写的一份草案开始了。
首先是一个蕴含算术逻辑单元(Arithmetic Logic Unit,ALU)和解决寄存器(Processor Register)的处理单元,用来实现各种算术和逻辑运算,。因为它可能实现各种数据的解决或者计算工作,因而也有人把这个叫作数据通路(Datapath)或者运算器。
而后一个蕴含指令寄存器(Instruction Register)和程序计数器(Program Counter)的管制单元(Control Unit/CU)),用来控制程序的流程,通常就是不同条件下的分支和跳转。在当初的计算机里,下面的算术逻辑单元和这里的控制器单元,独特组成了咱们说的 CPU。
接着是用来存储数据(Data)和指令(Instruction)的内存,以及更大容量的内部存储,在过来,可能是磁带、磁鼓这样的设施,当初通常就是硬盘。
最初就是各种输出和输出设备,以及对应的输出和输入机制。咱们当初无论是应用什么样的计算机,其实都是和输入输出设施在打交道。
任何一台计算机的任何一个部件都能够归到运算器、控制器、存储器、输出设施和输出设备中,而所有的古代计算机也是基于这个基础架构来设计开发的。
而所有的计算机程序,也都能够形象为从输出设施读取输出信息,通过运算器和控制器来执行存储在存储器里的程序,最终把后果输入到输出设备中。而咱们所有撰写的无论高级还是低级语言的程序,也都是基于这样一个形象框架来进行运作的。
2.3 组成原理常识地图
三. 性能
3.1 什么是性能?工夫的倒数
掂量计算性能两个规范:响应工夫和吞吐率。
响应工夫
执行工夫,想要晋升响应工夫这个性能指标,你能够了解为让计算机“跑得更快”。
图中是咱们理论零碎里性能监测工具 NewRelic 中的响应工夫,代表了每个内部的 Web 申请的执行工夫。
吞吐率
吞吐率或者带宽,想要晋升这个指标,你能够了解为让计算机“搬得更多”。
服务器应用的网络带宽,通常就是一个吞吐率性能指标
吞吐率是指咱们在肯定的工夫范畴内,到底能解决多少事件。
性能,定义成响应工夫的倒数,就是:性能 = 1/ 响应工夫。
这样一来,响应工夫越短,性能的数值就越大。同样一个程序,在 Intel 最新的 CPU Coffee Lake 上,只须要 30s 就能运行实现,而在 5 年前 CPU Sandy Bridge 上,须要 1min 能力实现。
3.2 计算机的计时单位:CPU 时钟
尽管工夫是一个很天然的用来掂量性能的指标,然而用工夫来掂量时,有两个问题。
工夫来掂量
第一个就是工夫不“准”。如果用你本人轻易写的一个程序,来统计程序运行的工夫,每一次统计后果不会齐全一样。有可能这一次花了 45ms,下一次变成了 53ms。
然而,计算机可能同时运行着好多个程序,CPU 实际上不停地在各个程序之间进行切换。在这些走掉的工夫外面,很可能 CPU 切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 CPU。所以说,要想精确统计某个程序运行工夫,进而去比拟两个程序的理论性能,咱们得把这些工夫给刨除掉。
time 命令。它会返回三个值,第一个是 real time,也就是咱们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的工夫;第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的工夫;第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的工夫。而程序理论破费的 CPU 执行工夫(CPU Time),就是 user time 加上 sys time。
$ time seq 1000000 | wc -l
1000000
real 0m0.101s
user 0m0.031s
sys 0m0.016s
其次,即便咱们曾经拿到了 CPU 工夫,咱们也不肯定能够间接“比拟”出两个程序的性能差别。即便在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候天然花的工夫会多一些。
除了 CPU 之外,工夫这个性能指标还受到主板,内存,这些其余相干硬件的影响。
程序的 CPU 执行工夫 = 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 外部的种给调快了,于是 CPU 计算跟着这个时钟的节奏,也就天然变快了。
当然这个快不是没有代价的,CPU 跑得越快,散热的压力也就越大。就和人一样,超过生理极限,CPU 就会解体了。
CPU 时钟周期数
最简略的晋升性能计划,天然缩短时钟周期时间,也就是晋升主频。换句话说,就是换一块好一点的 CPU。
CPU 时钟周期数 = 指令数×每条指令的均匀时钟周期数(Cycles Per Instruction,简称 CPI)
不同的指令须要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,然而乘法须要的 Cycles 就比加法要多,天然也就慢。
程序的 CPU 执行工夫 = 指令数×CPI×Clock Cycle Time
优化
- 时钟周期时间,就是计算机主频,这个取决于计算机硬件。咱们所熟知的摩尔定律就始终在不停地进步咱们计算机的主频。比如说,我最早应用的 80386 主频只有 33MHz,当初手头的笔记本电脑就有 2.8GHz,在主频层面,就晋升了将近 100 倍。
- 每条指令的均匀时钟周期数 CPI,就是一条指令到底须要多少 CPU Cycle。在前面解说 CPU 构造的时候,咱们会看到,古代的 CPU 通过流水线技术(Pipeline),让一条指令须要的 CPU Cycle 尽可能地少。因而,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
- 指令数,代表执行咱们的程序到底须要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的示意形式。
四. 功耗
程序的 CPU 执行工夫 = 指令数×CPI×Clock Cycle Time
这么来看,如果要晋升计算机的性能,咱们能够从指令数、CPI 以及 CPU 主频这三个中央动手。要搞定指令数或者 CPI,乍一看都不太容易。于是,研发 CPU 的硬件工程师们,从 80 年代开始,就挑上了 CPU 这个“软柿子”。在 CPU 上多放一点晶体管,一直晋升 CPU 的时钟频率,这样就能让 CPU 变得更快,程序的执行工夫就会缩短。
于是,从 1978 年 Intel 公布的 8086 CPU 开始,计算机的主频从 5MHz 开始,一直晋升。1980 年代中期的 80386 可能跑到 40MHz,1989 年的 486 可能跑到 100MHz,直到 2000 年的奔流 4 处理器,主频曾经达到了 1.4GHz。而消费者也在这 20 年里养成了“看主频”买电脑的习惯。过后曾经根本垄断了桌面 CPU 市场的 Intel 更是夸下了海口,示意奔流 4 所应用的 CPU 构造能够做到 10GHz,颇有一点“鼎力出奇观”的意思。
4.1 功耗:CPU 的“人体极限”
奔流 4 的 CPU 主频素来没有达到过 10GHz,最终它的主频下限定格在 3.8GHz。这还不是最糟的,更蹩脚的事件是,大家发现,奔流 4 的主频尽管高,然而它的理论性能却配不上同样的主频。想要用在笔记本上的奔流 4 2.4GHz 处理器,其性能只和基于奔流 3 架构的奔流 M 1.6GHz 处理器差不多。
于是,这一次的“鼎力出喜剧”,不仅让 Intel 的对手 AMD 取得了喘息之机,更是代表着“主频时代”的终结。前面几代 Intel CPU 主频岂但没有回升,反而降落了。到现在,2019 年的最高配置 Intel i9 CPU,主频也只不过是 5GHz 而已。相较于 1978 年到 2000 年,这 20 年里 300 倍的主频晋升,从 2000 年到当初的这 19 年,CPU 的主频大略进步了 3 倍。
功耗问题
咱们的 CPU,个别都被叫作超大规模集成电路(Very-Large-Scale Integration,VLSI)。这些电路,实际上都是一个个晶体管组合而成的。CPU 在计算,其实就是让晶体管外面的“开关”一直地去“关上”和“敞开”,来组合实现各种运算和性能。
想要计算得快,一方面,咱们要在 CPU 里,同样的面积外面,多放一些晶体管,也就是减少密度;另一方面,咱们要让晶体管“关上”和“敞开”得更快一点,也就是晋升主频。而这两者,都会减少功耗,带来耗电和散热的问题。
因而,在 CPU 外面,可能放下的晶体管数量和晶体管的“开关”频率也都是无限的。
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
“制程”工艺, 从 28nm 到 7nm,相当于晶体管自身变成了原来的 1/4 大小。
然而,功耗减少太多,就会导致 CPU 散热跟不上,这时,咱们就须要升高电压。这里有一点十分要害,在整个功耗的公式外面,功耗和电压的平方是成正比的。这意味着电压降落到原来的 1/5,整个的功耗会变成原来的 1/25。
4.2 并行优化,了解阿姆达尔定律
于是,从奔流 4 开始,Intel 意识到通过晋升主频比拟“难”去实现性能晋升,边开始推出 Core Duo 这样的多核 CPU,通过晋升“吞吐率”而不是“响应工夫”,来达到目标。
并行处理
- 须要进行的计算,自身能够分解成几个能够并行的工作。好比下面的乘法和加法计算,几个人能够同时进行,不会影响最初的后果。
- 须要可能合成好问题,并确保几个人的后果可能汇总到一起。
- 在“汇总”这个阶段,是没有方法并行进行的,还是得程序执行,一步一步来。
阿姆达尔定律(Amdahl’s Law)。这个定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率晋升的状况。
优化后的执行工夫 = 受优化影响的执行工夫 / 减速倍数 + 不受影响的执行工夫
4.3 原则性的性能晋升办法
- 减速大概率事件。
- 通过流水线进步性能,咱们的 CPU 其实就是一个“运算工厂”。咱们把 CPU 指令执行的过程进行拆分,细化运行,也是古代 CPU 在主频没有方法晋升那么多的状况下,性能依然能够失去晋升的重要起因之一。
- 通过预测进步性能。通过事后猜想下一步该干什么,而不是等上一步运行的后果,提前进行运算,也是让程序跑得更快一点的方法。
参考 集体 Java 学习园地
《深入浅出计算机组成原理》