本文目录:
计算机组成原理,英文叫Computer Organization。这里的Organization是“组织机构”的意思。计算机由很多不同的部件放在一起,组成了一个Organization,这个组织机构最终能够进行各种计算,控制,输入输出,达到各种强大的功能。计算机的基础组成硬件有哪些呢?
1 计算机的基础组成硬件
CPU(Central Processing Unit):中央处理器。计算机最重要的核心配件,计算机中所有的计算都是由CPU来进行的。
内存(Memory):你撰写的程序,打开的浏览器,运行的游戏,都要加载到内存里才能运行。程序读取的数据,计算得到的结果,也都要放在内存里,内存越大,能加载的东西也就越多。
主板(Motherboard):存放在内存里的程序和数据,需要被CPU读取,CPU计算完之后,还要把数据写回内存。但CPU不能直接插在内存上,反之亦然。于是就有了主板。主板是一个有着各种各样插槽的配件,CPU和内存都插在主板上。
芯片组(Chipset)和总线(Bus):芯片组控制数据传输的流转,也就是数据从哪里到哪里的问题。总线是实际数据传输的高速公路。总线速度决定了数据能传输得多快。在主板的北面,是北桥芯片组,用来连接着CPU和内存,显卡之间的通信。不过现在主板上北桥芯片的工作已经被移到了CPU内部,在主板上已经看不到北桥芯片组了。
I/O设备:也就是输入输出设备,有了显示器,我们才能看到计算机输出的各种图像、文字,有键盘鼠标,我们才能把信息输入到计算机。它们是通过主板上的南桥芯片组来控制和CPU之间的通信的。南桥芯片组位于主板的南面。
硬盘:有了硬盘,各种数据才能持久的保存下来。
显卡:使用图形界面操作系统,如Windows、Mac OS、Linux,显卡必不可少。一般的主板上都集成了显卡,如果对图像要求高,需要单独的显卡插在主板上。显卡里有一个处理器,叫做GPU(Graphics Processing Unit)图形处理器,GPU一样可以做各种计算的工作。
2 冯诺依曼体系结构
冯诺依曼体系结构说明了一台计算机应该由哪些部分组成,包括:
2.1 CPU
算数逻辑单元(ALU):用来完成各种算术和逻辑运算的运算器单元。
指令寄存器和程序计数器:用来控制程序的流程的控制器单元。
以上的算术逻辑单元和控制器单元,共同组成了CPU。
2.2 内存 用来存储数据和指令。
2.3 外部存储 容量更大,用来存放永久性数据。
2.4 输入输出设备
冯诺依曼体系结构,也叫存储程序计算机。这其中其实暗含了两个概念,一个是“可编程”计算机,一个是“存储”计算机。
什么是可编程呢?先来看看什么是不可编程。不可编程的计算机,就是在计算机硬件层面写死程序的计算机。再来看存储式计算机,就是程序本身是存储在计算机的内存中,通过加载不同的程序来解决不同的问题。
任何一台计算机的任何一个部件都可以归到运算器、控制器、存储器、输入设备和输出设备中,而所有的现代计算机也都是基于这个基础架构来设计开发的。而所有的计算机程序,也都可以抽象为从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中。
学习计算机组成原理,其实就是学习和拆解冯诺依曼体系结构。具体来说,就是学习控制器、运算器的工作原理,学习内存的工作原理,学习CPU是怎么和输入输出设备打交道的。
3. 性能
3.1 什么是计算机性能
如何衡量计算机的性能,我们有两个指标:响应时间和吞吐率。
响应时间也叫执行时间,也就是说我们执行一个程序,需要花多少时间。花的时间越少,自然性能就越好。
吞吐率也叫带宽,是指我们在一定时间范围内,到底能处理多少事情。对于计算机来说,就是能处理多少数据或者执行多少程序指令。
3.2 怎么提升计算机性能
提升吞吐率的方式有很多,比如我们可以多找几个人一起来处理事情,这样吞吐率是不是就增大了?所以现在的CPU动辄8核、16核,人多力量大,同时处理数据,在单位时间内就可以处理更多的数据,吞吐率自然也就上去了。响应时间的提升却没有那么容易,因此CPU的性能,我们一般定义为响应时间的倒数。
性能 = 1/响应时间
也就是说,响应时间越短,性能越好。那么怎么衡量响应时间呢?我们计算一个程序运行的时间,使用的是程序运行结束的时间-程序开始运行的时间。这个时间也叫Wall Clock Time。但是,计算机同时运行着好多个程序,CPU实际上不停地在各个程序之间切换,Wall Clock Time中肯定有一部分时间是CPU切换去运行别的程序了。另外,有些程序在运行的时候,可能要从网络,硬盘中读取数据,这部分损耗的时间取决于网络质量,硬盘运行速度等因素。所以我们计算程序运行的准确时间时,需要去掉这些因素。
在Linux中有一个time命令,就是帮我们统计CPU运行某个程序的准确时间的。
运行time命令,会返回三个值:real time、user time、sys time。
real time: Wall Clock Time,运行程序整个过程的时间
user time:CPU在运行你的程序,在用户态运行指令的时间
sys time:CPU在运行你的程序,在操作系统内核里运行指令的时间
实际花费的时间 CPU Time = user time + sys time;
除了CPU外,时间这个性能指标还可能受到主板,内存这些硬件的影响,所以,我们需要对“时间”进行拆解。
程序的CPU执行时间 = CPU时钟周期数 * 时钟周期时间
时钟周期时间
要搞清楚什么是时钟周期时间,就不得不提到CPU的主频了,什么是CPU的主频呢?看图:
图中这个3.10GHz,就是CPU的主频,我们可以认为是:CPU在1秒时间内,可以执行的简单指令的数量是3.10G条。更准确一点,这个3.10GHz就是CPU的一个“钟表”,能识别出来的最小的时间间隔。
这个最小时间间隔该怎么理解呢?类比我们挂在墙上的时钟,能识别出来的最小时间间隔是秒。在CPU内部,有一个晶体振荡器,简称晶振,晶振就是CPU内部的电子表,晶振带来的每一次滴答,就是时钟周期时间。在这个3.10GHz的CPU上,这个时钟周期就是1/3.10G。
到这里可能还是很难理解,没关系,只需要记住,CPU是按照这个1/3.10G的时钟周期来进行自己的操作。因此主频越高,意味着这个表走得越快,CPU也就被逼着走得越快,CPU性能越高。
知识扩展:超频
既然讲到这里来了,再扩展一点小知识,所谓超频,就是人为的把CPU内部这个时钟给调快来提升CPU性能,但这个快不是没有代价的,CPU跑的越快,散热的压力也就越大,寿命也就越短。
回到上面的公式:
程序的CPU执行时间 = CPU时钟周期数 * 时钟周期时间
提升性能的方案之一,就是提升CPU的时钟周期时间,也就是提升主频。方案之二,减少CPU的时钟周期数。
时钟周期数
对于CPU的时钟周期数,可以再做一个拆解:
CPU时钟周期数 = 指令数 * 每条指令的平均时钟周期数(CPI)
CPI是指一条指令需要多少的CPU Cycle。 加法指令和乘法指令,都是一条CPU指令,乘法指令比加法指令复杂,所以乘法需要的Cycles就比加法的要多。后面会详细讲解到现代CPU通过流水线技术,让一条指令的CPU Cycle尽可能的减少。
总结一下,提升计算机性能需要增大吞吐率和降低响应时间,具体的提高方法:1、多核CPU 2、提高CPU主频 3、降低CPU Cycle.
4 功耗
我想大家应该都思考过这个问题,既然提升CPU主频,就能提升CPU性能,那我们为什么不把CPU主频提升到10GHz甚至更高呢?CPU的主频从1978年8086 CPU的5MHz开始,到2000年的奔腾4 CPU的1.4GHz,提升了300倍。但2000年到2019年,计算机的CPU主频从奔腾4的1.4GHz到intel i9的5GHz,仅仅提升了三倍,这又是为啥呢?
答案就是:功耗问题。
我们的CPU,一般都被叫作,超大规模集成电路,这些电路实际上是一个个晶体管组合而成的,CPU在计算,其实就是让晶体管里面的“开关”不断地去“打开”和“关闭”,来组合完成各种运算和功能。想要计算得快,一方面,我们要在CPU里,同样的面积,多放一些晶体管,也就是增加密度,另一方面,我们要让晶体管“打开”和“关闭”更快,也就是提升主频。这两者都会增加功耗,带来耗电和散热问题。因此,在CPU里面,能够放下的晶体管数量和晶体管的“开关”频率也都是有限的。一个CPU的功率,可以用这样一个公式来表示:
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
从上面的公式可以看出来,降低功耗方式有下面几种:
1.增加晶体管的数量,在同样的面积下,要增加晶体管的数量,就必须降低晶体管的体积,要把晶体管造的小一些。也就是我们平时所说的提升“制程”。从28nm->7nm,晶体管的体积变成了原来的1/4。
2.提升主频,让开关的频率变快。
3.降低电压 在整个功耗的公式里面,功耗和电压的平方是成正比的,这就意味着电压下降1/2,功耗下降1/4.事实上,从8086 CPU到intel i9,CPU的电压已经从5V左右下降到了1V左右。
到这里我们已经大致的了解了计算机的基础组成,冯诺依曼结构体系等内容。为后面更深入的学习打好了基础。