25考研,参考了王道和部分博主
一、计算机系统的发展(了解即可)
什么是计算机系统
计算机系统=硬件+软件
-
硬件:计算机的实体,如主机,外设等。外设就是鼠标,键盘,显示器这些设备。
-
软件:由具有各类特殊功能的程序组成
软件又可以分为系统软件和应用软件
- 系统软件:用来管理整个计算机系统
二、计算机硬件的基本组成
1.早期冯诺依曼机的结构
冯诺依曼提出了“存储程序”的概念。指将指令以二进制代码的形式事先输入计算机的主存储器(内存),然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
程序是指令和数据的集合
注意说的是主存储器不是存储器!存储器包括主存(内存)和辅存(固态硬盘),前者属于主机,后者则属于I/O设备。像我们平时手机里的APP就是存放在辅存里面的,只有需要启动运行的时候才会把辅存里面的APP相关程序代码数据读到主存里面
下图就是一个冯诺依曼机的示意图
冯诺依曼计算机的特点:!!!!!!!!!!!!!!!!!!!
- 计算机由五大部件组成:运算器,控制器,存储器,输入输出设备
- 指令和数据以同等地位存于存储器,可按地址寻访
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
- 存储程序的工作方式
- 以运算器为中心
CPU区分指令与数据是根据指令周期的不同阶段 。
2.现代计算机的结构
现代计算机以存储器为中心
我们常说的CPU=运算器+控制器,所以也可以上图的结构框图简化一下为下图
(1)各个硬件的工作原理
①输入设备和输出设备
②主存储器的基本组成
存储器分为主存储器(内存存储器和主存)和辅助存储器(外存储器或外存)。
主存储器的存取方式是按地址存取存取方式。
存储体存放二进制信息,存储器地址寄存器(MAR)存放访存地址,相当于存储单元个数;存储器数据寄存器(MDR)用于存放从存储器中读或写的信息,相当于存储字长(单个存储单元的长度)。
③运算器的基本组成
进行算术运算和逻辑运算。包含ALU,MQ,X,IX。BR,PSW等。
④控制器的基本组成
计算机最主要的工作就是执行代码,而我们所用的代码就是一条条的指令。每完成一条指令需要三个阶段。先取指令,根据PC里记录的指令地址从内存里取出对应的指令。取出的指令放在IR中,CU分析这条指令到底要干什么。分析完后CU控制其他部件配合着完成指令的具体执行。
主要有PC,IR,CU。
(2)计算机软件
①系统软件和应用软件
系统软件是一组保证计算机系统高效,正确运行的软件,通常作为系统资源提供给用户使用。
应用软件是指用户为解决某个应用领域的各类问题而编制的程序。
②三个级别语言
重要!!!!!!!!!!!!!!!:
- 机械语言:二进制代码语言,是计算机唯一可以识别的语言。
- 汇编语言:用英文单词或其缩写代替二进制的指令代码。
- 高级语言:方便程序设计人员写出的解决问题的处理方案和解题过程的程序。
- 汇编程序(汇编器):将汇编语言翻译成机械语言的程序
- 解释程序(解释器):将源程序中的语句按执行顺序逐条翻译成机器指令并立即执行。
- 编译程序(编译器):将高级语言程序翻译成汇编语言或机器语言程序。
(3)计算机系统的层次结构
没有配备软件的纯硬件系统叫做裸机。
软件和硬件之间的的界面就是指令集体系结构(ISA)是软件可见部分。
(4) 计算机的工作原理
①存储程序工作方式
需要将程序所含的指令和数据送入主存储器。
②从源程序到可执行文件
注意!!!!!!!!!!!!!!!!!!!:
翻译过程的四个阶段
- 预处理阶段:预处理器(CPP)对源程序中以#开头的命令处理.h—>.i
- 编译阶段:编译器对预处理后的源程序惊醒编译生成一个汇编语言源程序.s。
- 汇编阶段:汇编器将.s翻译为机器语言指令。并把这些指令打包成一个称为可重定位目标文件.o。
- 链接阶段:链接器将多个可重定位目标文件和标准库函数合并成一个可执行目标文件,简称可执行文件。最终生成的文件保存在磁盘上。
③指令执行过程的描述
注意:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 取指令:PC->MAR->M->MDR->IR:根据PC取指令到IR。
- 分析指令:OP(IR)->CU:指令译码并送出控制信号。
- 执行指令:AD(IR)->MAR->M->MDR->ACC:取数操作。
下面举一个具体的例子来演示计算机的工作过程。
C语言写好的程序经过编译链接后从高级语言被翻译为机器语言并装入主存。
由上图可以看到每一个存储单元都是16个b i t bitbit,也就是存储字长是16b i t bitbit。每一条指令的两个部分也是占16b i t bitbit,只不过在执行这些指令的时候CPU会自动把它们拆解成操作码和地址码两个部分
首先指令和变量的数据都存放在存储体当中。这个程序要执行的第一个指令存放在0号位置。所以在程序运行之前,PC指向0位置。
接下来把这个位置存放的指令取出执行,首先PC存放的指令需要通过地址总线传送到MAR中。因为PC=0,所以该操作导致(MAR)=0,也就是控制器向主存指明了接下来要访问的是0号地址所对应的数据。同时控制器会通过控制总线告诉主存储器这次要进行的是读操作。
把寄存器外面打一个括号表示的是寄存器里面的内容
接下来主存储器会根据MAR记录的地址信息去存储体中找出0号位置所对应的二进制数据并将这些数据放到MDR中。导致现在MDR当中存放的就是我们要读取的第一条指令。
M(MAR)→ \to→MDR。括号外M表示主存储器,主存储器里的MAR地址所指明的数据放到MDR当中
这条指令会沿地址总线被放到IR当中,导致IR中存放此次要执行的指令。
这条指令的前6个b i t bitbit(操作码,对应00001)会被送到CU控制单元里。CU分析得出这是“取数”指令。所以接下来要把地址码所指明的内存单元里的数据取出并放到ACC寄存器当中。
既然要读取主存的这个地址的信息,就需要把地址码信息(0000000101,转换为二进制为5)送到主存的MAR当中,导致(MAR)=5。5号存储单元所指向的刚好就是a这个变量所存放的位置。
接下来主存储器根据MAR指明的地址去存储体当中找出5号单元的这些数据并且把这些数据放到MDR当中,也就是把a这个变量的值放到MDR里。
最后在控制单元的指挥下,MDR里的数据会被传送到ACC当中。
到此为止我们就完成了取数的指令,最终导致a这个变量的值被放到ACC当中。
在上一步的取指令动作完成之后PC值就自动加一了,0+1=1指明了下一条我们要执行的指令应该在1这个单元。
接下来根据PC所指向的位置取得第2条指令,取指令的过程和之前是类似的。通过前4步把第2条指令放到IR当中。
取完指令之后就要分析指令。和之前一样会把操作码部分(00100)送到CU控制单元,CU控制单元分析得出这是乘法指令。接下来CU会指挥其他部件来协调完成乘法操作。
现在这步要完成的是 a × b a\times ba×b 的操作。而a变量之前已经被送到ACC中。所以现在这条乘法指令的地址码(0000000110=6)指明的是另一个乘数b的存放位置,这条指令的地址码会被送到MAR中指明我要取出6号存储单元里的数据。
接下来主存会根据MAR所指明的地址取出相应的数据,也就是把b变量的值放到MDR当中。
接下来b的值会通过数据总线送到MQ中。
接下来还要把a的值放到x中。
当CPU执行乘法操作的时候,它会把被乘数放到x中,然后把被乘数放到MQ中
接下来CU通过控制线告诉ALU让它进行乘法运算。ALU会把x和MQ里面存储的数进行相乘操作然后把最终结果放到ACC中。
在这个例子中相乘的两个数很小,如果两个数很大,ACC可能存不下结果,这时就需要MQ辅助存储。MQ里面会用来存放乘法结果的低位。
到此为止就完成了第2条指令也就是乘法指令
和前边的一条指令相比,其实第1步到第5步每一步要做的事情都是一模一样的。只有当CU分析出这条指令是乘法指令的时候接下来的操作才会产生区别。取指令结束后PC的值也会自动加1指向下一条要执行的指令。
上次取指令结束的时候,PC的值也会自动加1,所以这条指令执行结束之后得到的效果就是PC指向了2,也就是指向了下一条要执行的指令。ACC里面存储了上一个运算的结果,即a × b = 6 a\times b=6a×b=6。
接下来执行2这个地址存放的指令,前面的几个步骤都是一样的。通过5个步骤可以完成取指令和分析指令的操作。最终CU分析得到这是“加法”指令。接下来CU会根据”加法“指令的步骤来指挥其他部件协调工作。
这次要计算的是 a × b + c a\times b+ca×b+c。a × b a\times ba×b的结果已经存放在ACC当中,所以这个加法指令的地址码(0000000111=7)指明的是c这个变量的存放地址。
接下来要取出7这个地址存放的数据。需要把这个地址码送到MAR,主存根据MAR指明的地址取出相应的数据,也就是把c的值放到MDR当中。
接下来这步会把MDR的值传送到x中。
当我们进行加法运算的时候,ACC里面会先存入被加数,x里面存放加数。
然后控制单元会向ALU发送一个信号,告诉其此次要执行的是加法操作。ALU就会把ACC和x里面存放的值进行相加,并且把加得的值结果再次存回ACC当中。
因此这就导致了(ACC)=7,也就是把a × b + c a\times b+ca×b+c的值存放到了ACC里面。
到此为止我们完成了第三条指令也就是加法指令。
前面的5个步骤和之前的两条指令没有任何区别。另外在取完指令之后也会自动地进行PC加1的操作,也就是PC会指向下一条我们应该执行的指令
接下来这条指令的执行前边的步骤都是一样的。根据PC记录的地址取出这条指令并且放到IR寄存器当中,然后第5个步骤会把操作码送到CU中进行分析得到这是“存数”指令。也就是要把ACC里面的数据存到地址码(0000001000=8)所指明的存储单元中,而8这个存储单元刚好对应的是y这个存储单元的位置。现在ACC里面存的是7,也就是a × b + c a\times b+ca×b+c的值。
接下来执行存数指令。首先会把指令的地址码部分送到MAR中,用来指明此次我要存入的是哪个存储单元。另外还需要把ACC里面的运算结果通过数据总线送到MDR当中。也就是说此时MDR里面保存了a × b + c a\times b+ca×b+c的值,并且此时MAR里边指明了这个值是要存到内存地址为8的地方。
接下来CU控制单元会通过控制总线告诉主存储器说此次要进行的是写操作。于是主存储器会根据MAR的地址把MDR当中的数据放到相应的位置当中。这就导致了8号存储单元的值变为了7,也就是最终我们想要得到的结果y = a ∗ b + c y=a*b+cy=a∗b+c。
同样存数指令的执行,取指令和分析指令的阶段做的事情和前面那些指令没有什么区别。只有分析出了指令之后才会在CU控制单元的控制之下执行一些不一样的操作。同样PC会加1指向下一条应该执行的指令
接下来执行这条指令。和之前一样首先需要取出指令,把这个指令取到IR中。接下来要把操作码部分送到CU里面,CU分析得到这是“停机”指令。
执行到这一步就知道我们的这段程序运行结束了。学过操作系统就会知道要停止一个进程的运行需要通过系统调用或者中断机制来通知操作系统终止该进程。于是接下来执行的指令就不是这一系列指令,而是操作系统相关的指令,后续的部分就不需要再关心了。
到此为止我们就一步一步模拟了这个程序执行的过程
总结一下
“取数”指令的执行可以分为取指令,分析指令和执行指令这三个阶段。任何一条指令的执行一定都是这样3个阶段。
无论我们执行的是什么指令,前面取指令和分析指令的步骤其实都是一模一样的,只有分析完指令之后,CU才会知道这条指令到底要做什么。于是接下来的步骤对于不同的指令来说就有可能不一样。
在取指令的阶段,MDR里的数据肯定是要传到IR,而在执行指令的阶段CU会根据具体的这条指令来决定MDR里的数据应该是放到ACC还是MQ还是其他的通用寄存器里面。所以根据指令执行周期的不同,它处于不同的阶段,CPU就会区分出我们这次从内存里取出的到底是指令还是数据了。
我们这个小节给的例子中,每一条指令只有一个操作码和一个地址码。但有的计算机它所支持的指令有可能有多个地址码,比如后面会讲的二地址指令。
三、计算机的性能指标(重点)
1.机器字长
注意:!! !!!!!!!!!!!!!!!!!!
字、字长、机器字长、指令字长、存储字长的区别和联系是什么?
字长(机器字长)是指CPU 内部用于整数运算的数据通路的宽度,因此字长等于 CPU 内部用于整数运算的运算器位数和通用寄存器宽度,它反映了计算机处理信息的能力。
字和字长的概念不同。字用来表示被处理信息的单位,用来度量数据类型的宽度,如x86机器中将一个字定义为16位。
指令字长: 一个指令字中包含的二进制代码的位数。
存储字长: 一个存储单元存储的二进制代码的位数。
它们都必须是字节的整数倍。
指令字长一般取存储字长的整数倍,若指令字长等于存储字长的2倍,则需要2个访存周期来取出一条指令;若指令字长等于存储字长, 则取指令周期等于机器周期。
早期的存储字长一般与指令字长、字长相等,因此访问一次主存储器便可取出一条指令或一个数据。随着计算机的发展,指令字长、字长都可变,但必须都是字节的整数倍。
2.数据通路带宽
指数据总线一次所能并行传送信息的位数。
3.主存容量
MAR位数表示存储单元的个数。
MDR位数表示存储单元字长。
4.运算速度
①吞吐量
指系统在单位时间内处理请求的数量。评价计算机系统性能的综合参数。
②响应时间
用户向计算机发送一个请求,到系统对该请求做出响应并获得所需结果的等待时间。通常包括CPU时间与等待时间。
③CPU时钟周期
机器内部主时钟脉冲信号的宽度,他是CPU工作的最小时间单位。(一条指令的时间)
④主频(CPU时钟频率)
机器内部主时钟的频率,及时钟周期的倒数。每秒多少个时钟周期。单位是HZ。(10HZ表示每秒十次)
⑤CPI
执行一条指令所需的时钟周期数。(CPI通常是一个平均值)。与时钟频率无关
⑥IPS
每秒执行多少条指令,IPS=主频/平均CPI
⑦CPU执行时间
CPU执行时间=CPU时钟周期数/主频=指令条数*CPI/主频
⑧MIPS
每秒钟执行多少百万条指令
MIPS=指令条数/(执行时间*10^6)=主频/(CPI*10^6)
⑨FLOPS
每秒执行多少浮点数运算。
MLOPS 10^6
GLOPS 10^9
TLOPS 10^12
PLOPS 10^15
ELOPS 10^18
ZLOPS 10^21
5.基准程序
常说的“跑分软件”比如鲁大师之类就是基准程序