课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间
目录
一、为什么需要学习计算机组成原理
二、冯·诺依曼体系结构:计算机组成的金字塔
1、计算机的基本硬件组成
2、冯·诺依曼体系结构
三、通过CPU主频谈性能
1、什么是性能
2、计算机的计时单位:CPU时钟
3、优化计算机性能的三条康庄大道
四、穿越功耗墙,我们该从哪些方面提升“性能”?
1、功耗:CPU的极限
2、并行优化,阿姆达尔定律
一、为什么需要学习计算机组成原理
计算机组成原理隔离了软件和硬件,提供了让软件无需关心硬件,就能直接操作硬件的接口。也就是说,你只需要对硬件有原理性的理解,就可以信赖硬件的可靠性,安安心心用高级语言来写程序。无论是写操作系统和编译器这样的硬核代码,还是写 Web 应用和手机 App 这样的应用层代码,你都可以做到心里有底。
二、冯·诺依曼体系结构:计算机组成的金字塔
1、计算机的基本硬件组成
首先要有三大件:CPU、内存和主板
CPU:计算机最重要的核心配件,全名叫中央处理器(Central Processing Unit),计算机的所有“计算”都是由 CPU 来进行的
内存(Memory):撰写的程序、打开的浏览器等,都要加载到内存里才能运行。程序读取的数据、计算得到的结果,也都要放在内存里。内存越大,能加载的东西自然也就越多。
主板:一个有着各种各样,有时候多达数十乃至上百个插槽的配件。我们的 CPU 要插在主板上,内存也要插在主板上。主板的芯片组(Chipset)和总线(Bus)解决了 CPU 和内存之间通信的问题。芯片组控制了数据传输的流转,也就是数据从哪里到哪里的问题。总线则是实际数据传输的高速公路。因此,总线速度(Bus Speed)决定了数据能传输得多快。
有了三大件,只要配上电源供电,计算机差不多就可以跑起来了,加上各类I/O设备、配上硬盘进行数据持久化,还可以装一个机箱,配上风扇,解决灰尘和散热的问题。不过机箱和风扇,算不上是计算机的必备硬件。
还有一个特殊的设备——显卡。显卡之所以特殊,是因为显卡里有除了 CPU 之外的另一个“处理器”,也就是 GPU(Graphics Processing Unit,图形处理器),GPU 一样可以做各种“计算”的工作。
鼠标、键盘以及硬盘,这些都是插在主板上的。作为外部 I/O 设备,它们是通过主板上的南桥(SouthBridge)芯片组,来控制和 CPU 之间的通信的。
北桥芯片组的主要功能是控制内存,现在,北桥的工作已经移到CPU的内部,不存在于主板上了。
2、冯·诺依曼体系结构
首先要包含一个算术逻辑单元(Arithmetic Logic Unit, ALU)和处理器寄存器(Processor Register)的处理器单元(Processing Unit),用来完成各种算术和逻辑运算。
要有一个包含指令寄存器(Instruction Register)和程序计数器(Program Counter)的控制器单元,用来控制程序流程
接着是存储数据(data)和指令(Instruction)的内存,以及更大容量的外部存储(现在通常是硬盘)
最后是输入和输出设备以及对应的输入和输出机制
任何一台计算机的任何一个部件都可以回归到运算器、控制器、存储器、输入和输出设备中,而所有现代计算机也都是基于这个基础架构来设计开发的。
可以说,冯·诺依曼体系结构确立了我们现在每天使用的计算机硬件的基础架构。因此,学习计算机组成原理,其实就是学习和拆解冯·诺依曼体系结构,就是学习控制器、运算器的工作原理,也就是 CPU 是怎么工作的,以及为何这样设计;学习内存的工作原理,从最基本的电路,到上层抽象给到 CPU 乃至应用程序的接口是怎样的;学习 CPU 是怎么和输入设备、输出设备打交道的。学习组成原理,就是在理解从控制器、运算器、存储器、输入设备以及输出设备,从电路这样的硬件,到最终开放给软件的接口,是怎么运作的,为什么要设计成这样,以及在软件开发层面怎么尽可能用好它。
三、通过CPU主频谈性能
1、什么是性能
性能就是时间的倒数
性能=1/响应时间
衡量计算机性能的标准中主要有两个指标:
一是响应时间,也叫执行时间;二是吞吐率(Throughput)或者带宽(BandWidth)
2、计算机的计时单位:CPU时钟
用时间来衡量计算机的性能有两个问题:
一是时间不准。计算机可能同时运行着好多个程序,CPU实际上不停地在各个程序之间切换;而且,有的程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和CPU;所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,我们得把这些时间给刨除掉。
Linux 下有一个叫 time 的命令,可以帮我们统计出来,同样的 Wall Clock Time 下,程序实际在 CPU 上到底花了多少时间。
它会返回三个值:
- real time,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;
- user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;
- sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。
而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。
备注:你最好在云平台上,找一台 1 CPU 的机器来跑这个命令,在多 CPU 的机器上,seq 和 wc 两个命令可能分配到不同的 CPU 上,我们拿到的 user time 和 sys time 是两个 CPU 上花费的时间之和,可能会导致 real time 可能会小于 user time+sys time。
二是即使拿到了CPU时间,也不一定可以比较出程序之间性能的差异,因为就算在同一台计算机上,CPU可能满载运行,也可能降频运行;
除CPU外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响,所以,需要对“时间”这个指标进行拆解——
程序的CPU执行时间=CPU时钟周期数(CPU Cycles)* 时钟周期时间(Clock Cycle)
对于CPU的时钟周期数还可以再做一个分解——
程序的CPU执行时间=指令数 * CPI(每条指令的平均时钟周期数)* 时钟周期时间
时钟周期时间:就是计算机的主频,取决于计算机硬件
CPI:每一条指令需要多少CPU Cycle(越少越优)
指令数:代表执行我们的程序需要多少指令
3、优化计算机性能的三条康庄大道
提升计算机主频
优化 CPU 设计使得在单个时钟周期内能够执行更多指令
通过编译器来减少需要的指令数。
四、穿越功耗墙,我们该从哪些方面提升“性能”?
1、功耗:CPU的极限
CPU一般都被叫做超大规模集成电路,这些电路实际上都是一个个晶体管组合而成的,就是让晶体管里的“开关”不断地去打开合关闭,来组合完成各种运算合功能。
想要计算得快,一方面,要在CPU里面,同样的面积里面,多放一些晶体管,也就是增加密度,另一方面,要让晶体管打开合关闭地快一点,也就是提升主频,这两者都会增加功耗,带来耗电合散热问题。因此,在 CPU 里面,能够放下的晶体管数量和晶体管的“开关”频率也都是有限的。
增加晶体管可以增加硬件能够支持的指令数量,增加数字通路的位数,以及利用好电路天然的并行性,从硬件层面更好地实现特定的指令。
一个CPU的功率,可以表示为:功耗~=1/2*负载电容*电压的平方*开关频率*晶体管数量
功耗增加太多会导致CPU散热跟不上,这时就需要降低电压。
(电压太低会导致电路无法联通,因为不管用什么作为电路材料,都是有电阻的,所以没办法无限制降低电压,另一方面,电压过低对工艺的要求也更高,成本也更贵)
2、并行优化,阿姆达尔定律
我们现在用的 2 核、4 核,乃至 8 核的 CPU就是通过并行提高性能。
能通过并行提高性能的问题,通常满足以下几个条件:
- 第一,需要进行的计算,本身可以分解成几个可以并行的任务
- 第二,需要能够分解好问题,并确保几个结果能够汇总到一起
- 第三,在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步来
阿姆达尔定律(Amdahl’s Law)说的是,对一个程序进行优化之后,处理器并行运算之后效率提升的情况,具体可以用这样一个公式来表示:
优化后的执行时间=受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
然而无论是简单地通过提升主频,还是增加更多的 CPU 核心数量,通过并行来提升性能,都会遇到相应的瓶颈。
在摩尔定律合并行计算之外,整个计算机组成层面,还有这样几个原则性的性能提升方法:
- 加速大概率事件
- 通过流水线提高性能
- 通过预测提高性能
课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间