文章目录
- 前言
- 概论
- 计算机的发展
- 计算机系统
- 计算机硬件组成
- 各个硬件的工作原理
- 计算机系统的层次结构
- 计算机系统结构、组成、实现
- 计算机性能指标
- 储存器
- CPU
- 整体指标
- Amdahl定律与加速比
前言
本文是对王道计算机考研《计算机组成原理》课程的总结,主讲咸鱼学长讲的确实清晰。
王道考研《计算机组成原理》
由于我们学校已经开设过汇编和计算机体系结构,所以计组的笔记内容会比较精炼,不适合无基础人听。
如果有不理解的,可以回去看看我前面的CSAPP笔记和汇编语言笔记(不过我感觉还是没啥必要,我这篇文章更多的是总结性质,不适合入门学习)
CSAPP笔记:
第一卷:程序结构与执行——信息表示、指令、处理器、性能优化、储存层次
第二卷:在系统上运行程序——链接、异常控制流、虚拟内存
第三卷:程序间的交流与通信——系统级IO、网络编程、并发编程
汇编语言笔记:
汇编语言笔记——微机结构基础、汇编指令基础
汇编语言笔记——汇编程序开发、汇编大作业
汇编语言笔记——接口技术与编程
概论
计算机的发展
计算机系统
计算机硬件组成
最开始计算机是没有内存的,程序员给条指令,计算机就执行一个行为。
冯诺依曼提出了储存程序
理论,程序记录了计算机要做的一系列流程,理应先放在储存器(内存)中,等计算机需要的时候按照规定顺序执行。
下图中,注意看实线,代表数据流。
输入设备把数据交给运算器,运算器和储存器进行交互,最后运算器再把结果输出给输出设备。控制器负责协调这4个部件,他只和储存器有数据交换,这是因为控制器需要从储存器中读取指令。虽然控制器负责协调,实际上还是以运算器为核心的。
现代计算器为了减轻运算器的压力,将储存器作为中心,整体运行没什么变化,只不过输入是先送到储存器中,储存器的数据也可以直接输出,都不需要经过运算器了。
各个硬件的工作原理
这一节比较抽象,我学过5级流水线CPU了,所以就直接从宏观层面去总结。
首先是主存:
- 储存体负责具体储存数据
- 储存单元指的是一个地址对应的空间
- 储存元指一个可以存1bit的电子元件
- 字就是储存单元具体的值,字长就是其bit数
- MAR。一个寄存器,储存了地址
- 即指向储存单元的指针
- 长度对应内存地址空间范围
- MDR。一个寄存器,储存一个字的数据
- 一般MDR长度=字长
- CPU存取数据都要经过MDR
CPU和主存通过寄存器交换着三个数据:地址,数据,指令,看一下交互过程:
- 假设CPU要取数据,就先设置MAR,然后发一个“取”指令给主存,然后主存把数据放到MDR里。
- 当CPU存数据时,CPU先把数据放MDR,然后设置MAR,发送一个“存”指令给主存,主存就会把MDR的数据放到目标位置。
现在CPU已经把MAR和MDR集成进去了。
再说运算器:
运算器是一个计算核心ALU+三个辅助寄存器构成:
- ALU负责计算
- ACC,默认的操作数和结果寄存器
- X,第二个操作数的寄存器
- MQ,执行乘除时会用到
一个完整的运算过程如下:
- 取指:控制器C收到运算指令
- 译码:取出操作符和操作数
- 执行:ALU计算,把结果放在对应寄存器
- 访存:输出到内存(有时候不执行)
- 写回
有时候要多执行一个周期,先去把内存的数放到辅助寄存器中,再进行一个周期的计算。
再论控制器:
控制器以CU为核心,IR和PC是两个辅助寄存器。IR存放指令内容,PC存放下一指令地址。
现在的CPU其实是把控制器和运算器集成在了一起,同时又集成了一大堆寄存器。指令的执行其实就是CPU和内存在反复打交道。
下图描述了一条指令被CPU执行的全过程。可以看到,无论是取指令,还是取数据,都要进行内存访问。
图灵机的神奇之处就在于,第一条指令存在IR之中,运行完毕后,会决定PC值是单纯+1还是做其他处理,也就是说一条指令可以决定下一条指令是什么,如此就可以自动执行,生生不息了,所以你的计算机只要开了机,指令就是在一直运行的。
计算机系统的层次结构
计算机系统=软件+硬件/固件,实际上,在开发设计人员眼中,软硬件在逻辑上是等价的,乘法运算可以用软件去写(基于底层硬件),也可以直接用底层硬件实现,所以说软硬件只不过处在不同层次罢了。
从整体的角度来看,软硬件还可以继续细化成若干层,形成7(或者5)层结构,自下向上为:
- 硬联逻辑。最基础的硬件,比如晶体管构成的各种逻辑门。
- 微程序级。由基础硬件构成的功能单元。比如什么控制器,加法器,移位器等等。
- 机器语言级。用0和1来描述抽象的模块行为。
- 操作系统级。建立在裸机之上,上面的人看不懂机器语言,机器也看不懂人的汇编语言,在此之间操作系统构成软硬件交流的界面。
- 汇编语言级。比如x86指令集汇编。
- 高级语言级。用来开发的编程语言。
- 应用语言级。应用程序。
计算机系统结构、组成、实现
- 系统结构(体系结构):计算机硬件有哪些部分,有哪些功能。比如CPU就是一个系统结构部分,CPU可以进行寻址,可以操作寄存器,执行指令,这是功能。又比如有内存,这是结构部分,内存空间是如何管理的,这是功能。
- 组成:是硬件实际的结构,比如CPU的结构如何,有没有Cache,有没有片外Cache。
- 实现:计算机组成其实是用各种模块进行组合,形成一个大型功能单位;而模块(微程序级)的物理实现,就是计算机实现部分。
程序员一般只能看到系统结构,再往下看不到了,也没必要看到。既然看不到,就可以说这就是透明的。(这个透明和生活中的透明正好是反过来的)
我们之前那本CSAPP,讲的其实是体系结构,而计组学的是组成,电子信息那帮人学的是实现。
计算机性能指标
储存器
- 字长=MDR长度
- 地址空间= 2 M A R 长度 2^{MAR长度} 2MAR长度
- 容量=字长×地址空间
CPU
- 主频:内部时钟频率
- 时钟周期:主频倒数
- CPI(cycles per instruction):一条指令消耗的平均周期数
- IPS(instructions per second):一秒执行的指令数=主频/CPI
- FLOPS:一秒执行浮点指令数
CPU时间=通过CPU计算出来的时间=CPU消耗周期数/时钟频率。CPU时间仅仅是程序在CPU上消耗的时间,实际上消耗的还有其他部分,比如等待,调度啥的。
CPI即每条指令平均消耗周期,CPI=CPU时钟周期数/指令数
CPI还可以通过加权计算,CPI=不同类指令的CPI加权和。
通过加权公式可以看出,CPI受到权重影响,而不同程序会影响指令权重,所以CPI实际上受到程序影响。
CPU真正执行的时间=(指令数×CPI)/时钟频率,由此可得三个因素:
- 时钟频率。取决于计算机实现技术
- CPI。取决于计算机实现技术和指令集技术,指令集够不够好,如何用越少的周期实现一个指令
- IC。指令数量,取决于从编程技术到计算机实现的一系列流程。
平时使用计算机,CPU时间太过理想,综合考虑各种因素,于是有了吞吐量这个衡量参数,更加实用。
吞吐量常用MIPS(Million IPS)衡量,即每秒百万条指令计算。为什么是百万呢。百万其实就是兆指令,对应6次方的MHz单位,通过CPU时间计算方便。
整体指标
- 数据通路带宽。我们一般说带宽指的是速度,但是这里指的其实是
数据总线位宽
- 吞吐量。单位时间执行请求的数量。请求可以是指令,任务等。
- 响应时间。
性能指标的评判要用到基准程序,其实就是我们说的跑分。但是这个东西只能参考,因为我们日常的使用场景是丰富的,基准程序只能测量某一个方面。
正如我们前面说的,CPU时间很复杂,受时钟频率,CPI,IC三者约束。
Amdahl定律与加速比
Amdahl定律用于衡量一个部分的性能对于整体性能的重要性,具体用加速比计算,加速比=改进后性能/改进前性能=改进前时间/改进后时间。原理很简单,改进的加速比取决于这一部分的占比(可向量化百分比)与提升空间(优化部分可以提升到什么程度)。