本文主要是介绍考研408《计算机组成原理》复习笔记,第一章计算机系统概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本人打算从今到2026年不再更新过多的前后端开发的笔记,因为要准备考研了,所以停更前面的开发教程。
这些都是我看完书、视频、做完题后,结合个人理解总结的知识点,希望对各位有帮助。一切都是用最快最精炼的方式讲清楚。
一、计算机发展历程
- 第一代:电子管时代
- 第二代:晶体管时代
- 第三代:中小规模集成电路时代
- 第四代:超大规模集成电路时代
就这么记就行了,很少考你历程这些细节的。
二、计算机系统结构
1、计算机系统有大概的两个组成
首先记住这句话:【计算机系统 = 软件 + 硬件】为什么这么记,后面解释。
还有一句话很重要:软件跟硬件在逻辑上都是等价地位的。
相同的功能其实硬件也能完成、软件也能完成,只不过它两各有各的优点:软件更灵活便捷、硬件时效更高,缺点就是:软件时效没有硬件快,复杂的硬件造价成本高。
所以简单一句话:【当要用一个频繁要复用的功能,硬件造价成本相对又不是很高的话,可以优先选硬件,否则就选软件。】
例题:
以下说法错误的是( D )
A、硬盘是外部设备 √
B、软件的功能与硬件的功能在逻辑上是等价的 √
C、硬件实现的功能一般比软件实现具有更高的执行速度 √
D、软件的功能不能用硬件取代 ×
。
(※ 硬件更快,软件更灵活,当造价成本不高、反复执行一个功能时,硬件可以代替软件)
2、冯·诺依曼机思想
冯·诺依曼机很重要,他的计算机思想奠定了现代计算机的基本结构。主要是这么几个特点:
- 采用 “存储程序” 的工作方式
- 计算机由运算器、控制器、存储器、输入设备、输出设备组成。(运算器+控制器叫“CPU”,输入设备+输出设备叫“I/O设备”)
- 【指令】、【数据】具有同等地位,形式相同,都是以二进制形式存在计算机里
- 【指令】又分为【操作码】和【地址码】,【操作码】是要干什么,【地址码】是数据是什么
- 以运算器为中心
这里以我个人理解来解释这几个专业术语:
1、【存储程序】思想:就是将原始程序和数据先存入计算机里,然后程序执行时,无需人工操作,计算机自动按照【按地址寻找访问数据,并按顺序自动执行指令】的规则运行程序。
2、【指令】与【数据】具有同等地位的存在计算机存储器里,都是二进制,虽然我们可能分辨不出来但是计算机能分辨出哪些是【指令】哪些是【数据】
3、【指令】又分【操作码】跟【地址码】,【操作码】就是这个指令要计算机干什么,【地址码】就是取数据的地址,比如下图第一条指令【操作码】就是【读数】,【地址码】就是【去地址5的地方取a=2这个数据】
例题:
1)冯诺依曼机的基本工作方式( A )
A、控制流驱动方式 √ ——> 翻译人话:按顺序执行指令,按指令执行程序,对
B、多指令多数据流方式 × ——> 不知道是啥,直接不管
C、微程序控制方式 × ——> 不知道是啥,直接不管
D、数据流驱动方式 × ——> 翻译人话:按数据来执行程序;错,数据是被动存在存储器的,由指令操控
2)下列是冯诺依曼机的工作特点的是( B )
A、多指令流单数据流 × ——> 不存在,不知道是啥玩意
B、按地址访问并顺序执行指令 √ ——>【按地址寻找访问数据,并按顺序自动执行指令】
C、堆栈操作 × ——> 跟题目没关系
D、存储器按内容选择地址 × ——> 存储器的特点,跟冯诺依曼机整体没关系
其他的下面细讲。
3、计算机结构
大概由这几部分组成:【输入设备】+【运算器】+【存储器】+【控制器】+【输出设备】
然后【运算器】+【控制器】=【CPU】,【输入设备】+【输出设备】=【I/O设备】
存储器又分为【主存储器】跟【辅助存储器】
其中【主存储器】简称【主存】就是装在计算机里面的内存,就是我们常说的 “内存”;
;
【辅助存储器】又叫【外存】,就是U盘、硬盘这些东西,内存不够了就可以靠他们存储
然后【I/O设备】里
【输入设备】就是键盘鼠标、摄像头、扫描仪之类的 “将程序、数据转化成计算机所能接受并认识” 的外部接入设备
;
【输出设备】就是音响、打印机、显示器这些 “将计算机处理的结果变成人能理解的” 外部设备
那么注意这里的一个点:
【辅助存储器(外存储器)】可以当作【输入设备】也可以当作【输出设备】,总之就是属于【I/O设备】,然后【I/O设备】就是【外部设备】。
例题:
完整的计算机系统应该包括( D )
A、运算器、存储器、控制器 × ——> 这只一个是【主机】的结构
B、外部设备和主机 × ——> 这只是【计算机系统硬件部分】的结构
C、主机和应用程序 × ——> 还有【软件系统和I/O设备】呢
D、配套的硬件设备和软件系统 √ ——> 我开头那句话:【计算机系统 = 软件 + 硬件】
4、存储器
1)简单内部结构
存储器的内部结构简单来说就是【存储体】+【MAR(地址寄存器)】+【MDR(数据寄存器)】
(尽量也记一下MAR、MDR的英文全称,说不定考研英语还会考到呢,也方便记住它两)
抽象理解:【数据、指令】全都在【存储体】里,计算机取【指令、数据】时就要那“取件码”去存储器,先找【MAR(地址寄存器)】“店员”,给他看取件码让他去取货;然后【MAR(地址寄存器)】“店员”把货物放到【MDR(数据寄存器)】“柜台”,计算机再去那里取走。
注意:这里有个重要的点,虽然MAR、MDR是【存储器】里的部件,但是现代计算机中,MAR、MDR也可以存在于CPU里了。
2)存储体
然后有个大概了解之后,重点是对一些存储体的【单位】的理解:
【存储体】里有很多【存储单元】,【存储单元】有很多 “存储元件”,里面可以存二进制“0”和“1”,因此【存储单元】可以存一长串二进制代码
这么一串二进制代码就是【存储字】,这串二进制代码的位数就是【存储字长】。【存储字长】通常就是一字节、或者一字节的偶数倍(8bit,或者8bit的偶数倍)。
(注意:二进制代码的位数、存储字的位数不是指这个二进制代码有几位数,而是一个代表大小的单位)
计算机里最小单位是bit(比特位),【一个字节】就是【8bit】(8个比特位)
【bit】可以写成:b、bit
【一个字节】可以写成:1B、1Byte
(1B = 8b \ 1B = 8bit \ 1字节 = 8b \ 1字节 = 8bit \ 1Byte = 8b \ 1Byte = 8bit)
【一个字】不等于【一个字节】,【一个字】的大小取决于不同的计算机结构
3)各种【“字长”】的混淆理解
然后重点!!!!!区分【字长】、【机器字长 \ 存储字长】、【指令字长】
【字长】
当有人这么说:“一个N位的计算机以M位来表示地址”,要区分这个N位跟M位是啥!!!
;
【N位】是指计算机的【字长】,而【字长】就是【CPU内部用于计算整数运算的数据通路的宽度】,也就是【一次能处理多少位的数据】,CPU、数据总线、内存地址的设计跟它有关。
【M位】就是这个计算机的【地址总线的宽度】,也就是【地址码的长度】
;
那么我们前面说过,计算机是根据【地址】来寻找数据的,数据可以有无数种,但是【地址空间】就固定那么几个,你的地址码有N位,那么【存储器的存储体】里就要有(2的N次方)个【地址空间】。
这么说可能有点懵,这么解释吧:这个【N位】也就是【字长】,就是一个马路有多宽,一次能过多少载具;【存储体】就是一个小区,【M位】也就是【地址码的长度】,就是一个小区的门牌号,假设这个小区的门牌号是N位的,只用0跟1来组合,那不就是得准备(2的N次方)种组合的门牌号嘛,也就代表小区有(2的N次方)个商品房。
【指令字长】
就是一个【指令的二进制代码的位数】,一般是【存储字长】的整数倍
【指令字长】是【存储字长】的几倍,就需要几个周期来取出一个指令;如果相等,则取指令周期就是一个机器周期。
【机器字长 \ 存储字长】
【机器字长】 就是【存储字长】,也就是一个【存储单元有多大】,通常是字节的倍数
例题:
一个8位的计算机以16位来表示地址,那么这个计算机系统要有( B )个地址空间
A、2的8次方 ×
B、2的16次方 √
4)MAR、MDR的位数、主存空间计算
1、MDR:
【MDR位数 = 存储字长】,【MDR位数】就相当于【一个存储单元的大小】
虽然【存储单元】是【存储体】里的东西,但是!请看下图,前面我们说了:【MDR】是用来【存数据】的,【存储体】里的数据被MAR取出来之后是要放到MDR那的,那么你MDR就必须得有存储体里一个存储单元的大小。这么说吧,你一个货架隔间能放一个货物,那你柜台也至少能放得下一个货物,不然从一个货架隔间取出的一个货物怎么放下到柜台那?
2、MAR:
【MAR的位数 = 能处理N位的二进制代码】
(这里的N位就是字面意思,xx就是2位,xxx就是3位,xxxx就是4位...)
【MAR的个数 = 0和1能凑成几种N位二进制代码 = 2的N次方】
(比如:MAR位数是2,那就能凑出【00、01、10、11】“2的2次方 = 4种”可能;位数是3,就能凑出【000、001、011、111、100、101、010、110】“2的3次方 = 8种”可能)
为什么呢?因为【MAR】是用来【存地址码】的,这么解释:还是假设【存储体】是一个小区,那么前面我们举例子小区有(2的N次方)个商品房,那么【MAR】就相当于这个小区的门牌号记录本、或者就是装所有门牌号的一个箱子,那有(2的N次方)个商品房,不久对应要有(2的N次方)个门牌号吗。
3、主存容量:
【存储体容量】=【2的MAR位数次方】*【MDR位数】/ 8bit
既然主存的数据指令都存在存储体里,那么【主存容量】就等于【存储体容量】了,那么【存储体容量】=【有几个存储单元】*【1个存储单元多大】,或者说【存储体容量】=【有几个存储单元】*【存储字长】
因为我们刚刚解释了MAR个数、位数、MDR位数,已知【MDR位数 = 存储字长】,【MAR个数 = 有几个存储单元】,那么【存储体容量】=【MAR个数】*【MDR位数】
而【MAR个数 = 2的MAR位数次方】,所以【存储体容量】=【2的MAR位数次方】*【MDR位数】
因为得到的结果最终要以字节单位的形式显示,所以一字节是8bit,那么就把容量结果除8bit就行了。
例题:
MAR和MDR位数分别为( A )
A、地址码长度、存储字长 √
B、存储字长、存储字长 ×
C、地址码长度、地址码长度 ×
D、存储字长、地址码长度 ×
5)存储器层次结构
存储器其实还分为【缓存-主存】、【主存-辅存】两层:
【缓存-主存】层次主要解决CPU和主存速度不匹配的问题,速度接近缓存
【主存-辅存】层次主要解决存储系统的容量问题,容量接近与价位接近于辅存
那么可以发现,【寄存器】在【存储器】中有,在【CPU】中也有,那么既然【寄存器】就是在CPU内的,所以它对CPU的存取速度最快;然后是缓存【Cache】,它采用高速SRAM制作,对CPU的存取速度次快;最后是【内存】,常用DRAM制作,相对于CPU的存取速度最慢,但是它保证容量够大。
总结:对CPU的存取速度快慢,【寄存器】>【Cache】>【内存】
6)相联存储器
相联存储器(也称为关联存储器或缓存),是计算机体系结构中的一种存储器类型,用于提高计算机系统的性能。
它既可以按照地址寻址、又可以按内容(通常是某些字段)寻址,与传统存储器区别。
5、运算器
运算器主要就4个组成部分:【ALU算术逻辑单元】+【ACC累加器】+【MQ乘商寄存器】+【X通用寄存器】,当然还有很多别的寄存器,其中就一个比较重要的寄存器是【PSW状态寄存器】(又叫标志寄存器)
(还是建议大家记一下英文全称:ACC(Accumulate)、MQ(Multiplier-Quoetitent Register)、ALU(Arithmetic And Logic Unit))
【ALU算术逻辑单元】:最后进行运算的,最重要
【ACC累加器】:暂存一些乘积高位、被加数、被减数、被除数、和、差、余数,结果一般都存ACC这
【MQ乘商寄存器】:乘积低位、商
【X通用寄存器】:ACC或MQ这些寄存器要存放下一个数的时候,就先把数放它这个
6、控制器
主要由三部分组成:【CU控制单元】+【IR指令寄存器】+【PC程序计数器】
(还是建议大家记一下英文全称:CU(Control Unit)、IR(Instruction Register)、PC(Program Counter))
【PC程序计数器】:跑腿的,一条指令执行完就自动去找下一条指令的地址并存到IR那里,有自动【+1】的功能,就像朝廷里跑腿的信差。这也符合了前面“存储方式”的【按顺序执行指令】
【IR指令寄存器】:接收【指令】并保存,将【指令】拆成【操作码】和【地址码】,【操作码】给CU分析这是这么指令,【地址码】给存储器的MAR找到数据,像干杂活的大臣。
【CU控制单元】:分析【IR指令寄存器】给的【操作码】是啥意思,然后时机到了就给出【控制信号】,控制各个部件的各项工作。
7、一条指令到底是怎么执行的流程
这真是一个复杂的流程,我先放一张我自己画的贼丑的图片给各位看看吧,当然觉得画得丑的没法看可以跳过......
以这个表作为例子:
首先PC跑腿到【存储器】找【指令】去了,
PC拿着“取件码”(按顺序自动获取的指令的地址)去【存储器】找“快递员”MAR帮取指令,
取出来的指令先放“驿站柜台”MDR处,再通知IR过来“取货”;这就完成了【取指令】
【取指令】步骤写成专业术语就是:PC ——> MAR ——> M ——> MDR ——> IR
或: (PC) ——> MAR
M(MAR) ——> MDR
(MDR) ——> IR
这里()代表这个设备携带着数据,但是在表示数据流通的过程时其实可以省略(),除了运算不能省略,比如 PC 自动+1执行下一条指令时要写 (PC)+1,而不是PC+1
接下来IR就要把【指令】拆分成【操作码】和【地址码】,
【操作码】拿给【CU】去分析 “这个指令是什么意思?”,分析出是“取数a到ACC”;完成【分析指令】
【地址码】去拿给MAR接着找数据,MAR找到数据之后就还是老样子,给到MDR存放,
(但是刚刚当【CU】分析完指令后,这次MDR就不是给IR了,而是应该把数据给运算器的ACC了,因为IR只会取【指令】然后到【控制器】那边分析指令,而ACC才是取【数据】回【运算器】那执行指令)MDR叫ACC过来“取货”;开始【执行指令】。
【分析指令】步骤专业术语:OP(IR) ——> CU
OP意思就是option,选择、操作
;
【执行指令】步骤专业术语:AD(IR) ——> MAR ——> M ——> MDR ——> ACC
或: AD(IR) ——> MAR
M(MAR) ——> MDR
(MDR) ——> ACC
接下来(PC)+1,到下一条指令,还是大致走一遍上面的流程
然后这时候已经获得a=2,b=3这两个数据了,要执行a*b这个操作了,轮到【运算器】登场
刚刚【ACC】已经获得了a=2,那等会因为所有的【计算结果】他还需要再去接收,也就是a*b的结果,那就得先把a=2给【x通用寄存器】,然后第二个数据b=3其实是【MQ】去“取货”的,因为【ACC】取乘积高位,【MQ】取低位,所以现在MQ装着a=2、x装着b=3;
然后【CU】开始控制运算器干活了,它下命令让【ALU】开始运算了,【ALU】无奈只好把装着数据的【MQ】跟【X】强行交合融合(就是相乘...),最终得到【a*b= 2*3 = 6】,然后把结果给到【ACC】,一切结束。
专业术语就是:
ACC ——> X
CU ——> ALU
ALU ——> (MQ)与(X)运算
ALU ——> ACC结果
总结第二大点的例题:
1、存放当前执行指令的寄存器是( D )
A、MAR ×
B、PC ×
C、MDR ×
D、IR √ ——> IR指令寄存器,专门去MDR取指令存放,除此之外还要拆分指令成【操作码】和【地址码】
2、CPU不包括( C )
A、地址寄存器 √ ——> MAR,前面说了MAR、MDR都可以才CPU里也有
B、指令寄存器 √ ——> IR,控制器里的东西,控制器属于CPU
C、地址译码器 × ——> 它是主存里的东西,既不是MAR也不是MDR,就是不属于CPU
D、通用寄存器 √ ——> X,运算器的东西,运算器属于CPU
3、CPU组成中不包括( C )
A、寄存器 √ ——> 注意:现代计算机中存储器、CPU里都有
B、运算器 √
C、存储器 ×
D、控制器 √
4、下列正确的是( 三个都对 )
A、实际应用程序的测试结果能够全面代表计算机的性能 √
B、系列机的基本特性是指令系统向后兼容 √ ——> 指时间上向后兼容,新系统兼容老系统
C、软件和硬件在逻辑功能上是等价的 √
5、关于相联存储器,下列说法正确的是( C )
A、只可以按地址寻址 ×
B、只可以按内容寻址×
C、既可以按地址寻址,也可以按内容寻址 √
D、上述说法都对 ×
三、计算机系统层次结构
1、三大级别语言
机器语言:机器能看得懂,能直接执行的语言,就是0、1二进制代码
汇编语言:使用英文单词或英文单词缩写作为【助记符】,方便人理解,写完的代码翻译成机器语言后才能被机器运行
高级语言:我们现在学的C、C++、JAVA...这些代码,要先转成汇编语言,然后由汇编程序传承机器语言才能被执行。
那么需要记住的几个特点是:
1、机器只会机器语言,除此之外任何语言他都看不懂,其它语言都必须转成机器语言才能被机器执行,所以机器只会直接执行机器语言。
2、不管机器语言、汇编语言、高级语言都能写出相同功能的东西,因为本质就是一个操控机器的语言而已,只是有难有简单,只要你够牛逼,你用机器语言0跟1也能写出《黑神话·悟空》,只不过你得有超人脑子跟几万年的寿命......
3、汇编语言要直接翻译各种不同设备的机器语言,因此要对应不同的设备的不同指令集,所以汇编语言跟设备结构密切相关
2、翻译程序
【翻译程序】,就是把高级语言程序转化成机器语言程序,汇编程序也是一种翻译程序,他把汇编语言翻译成机器语言。
【翻译程序】里其实也分为编译程序跟解释程序两种:
解释程序:你写好的代码程序,按顺序一句一句翻译成机器指令,并直接执行,特点就是读一句干一件事比较慢,也不会产生目标代码文件,用一次翻译一次,但是可以翻译成机器语言直接执行。(常见的有:java、JavaScript、shell、python....)
编译程序:你写好的代码程序,整个编译完后翻译成汇编语言或机器语言,特点是这样比较快,编译过后会产生目标代码文件(或者叫可执行文件,比如C语言产生的.exe文件),编译一次以后可以不用编译直接执行。(常见的有:C、C++、C#、Rust...)
3、两种程序编译执行的过程不同
编译程序:
解释程序:
例题:
1、将高级语言源程序转换成可执行文件的主要过程是( A )
A、预处理 —> 编译 —> 汇编 —> 链接 ——>翻译程序里,会产生可执行文件的只有编译程序,而编译程序的顺序就是这样
B、预处理 —> 汇编 —> 编译 —> 链接
C、预处理 —> 编译 —> 链接 —> 汇编
D、预处理 —> 汇编 —> 链接 —> 编译
2、将高级语言程序转成机器级目标代码文件的程序是( C )
A、汇编程序
B、连接程序
C、编译程序 ——>翻译程序里,会产生目标代码文件的只有编译程序
D、解释程序
这篇关于考研408《计算机组成原理》复习笔记,第一章计算机系统概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!