计算机组成原理目录
一、计算机的发展历史
1、计算机发展的四个阶段
第一阶段:电子管计算机(1946~1957) 埃尼阿克ENIAC
第二阶段:晶体管计算机(1957~1964) TX-0,PDP-1
第三阶段:集成电路计算机(1964~1980)
第四阶段:超大规模集成电路计算机(1980~至今)
电子管计算机:
- 集成度小,空间占用大
- 功耗高,运算速度慢
- 操作复杂,更换程序需要接线
晶体管计算机:
- 集成度相对较高,空间占用相对较小
- 功耗相对较低,运行速度较快
- 操作相对简单,交互更加方便
集成电路计算机:
- 计算机变得更小
- 功耗更低
- 计算速度更快
(计算机具备进入千家万户的条件)
超大规模集成电路计算机:
- 一个芯片集成了上百万的晶体管
- 速度更快,体积更小,价格更低,更能被大众接受
- 用途丰富:文本处理,表格处理,高交互游戏与应用
2、微型计算机的发展历史
单核CPU —>>多核CPU
二、计算机的分类
1、超级计算机
- 功能最强,运算速度最快,存储容量最大的计算机
- 多用于国家高科技领域和尖端技术研究
- 运算速度的单位是TFlop/s(每秒一万亿次浮点计算)
2、大型计算机
- 大型机,大型主机,主机
- 具有高性能,可处理大量数据与复杂的运算
3、迷你计算机
- 也称为小型机,普通服务器
- 不需要特殊的空调场所
- 具备不错的算力,可以完成较复杂的运算
4、工作站
- 高端的通用微型计算机,提供比个人计算机更强大的性能
- 类似普通台式电脑,体积较大,但性能强劲
5、微型计算机
- 个人计算机,功能齐全
- 分为台式机,笔记本电脑,一体机
三、计算机的体系与结构
摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。
1、冯诺伊曼体系
定义:将程序指令和数据一起存储的计算机设计概念结构
早期计算机仅包含固定用途程序,改变程序需要更改结构、重新设计电路,冯诺伊曼把程序存储起来,在设计底层硬件的时候,设计成通用电路。当运行某个程序的时候,先翻译成电路理解的语言,然后让通用电路去执行相应的逻辑。它的核心是存储程序指令,设计通用电路
。现代计算机都是冯诺伊曼机。
有五个重要组件
- 必须有一个存储器用于存储运行的程序以及运行所需要的数据
- 必须有一个控制器来控制程序的执行
- 必须有一个运算器负责运算的操作
- 必须有输入设备
- 必须有输出设备
所必须完成的四点工作内容
- 能够把需要的程序和数据送至计算机中,依赖输入设备
- 能够长期记忆程序、数据、中间结果以及最终运算结果的能力,依赖存储器实现
- 必须具备算术、逻辑运算和数据传送等数据加工处理的能力,由运算器和控制器完成
- 能够按照要求把处理结果输出给用户,需要输出设备实现
冯诺伊曼体系结构示意图
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
冯诺伊曼瓶颈
是指CPU和存储速率之间的问题无法调和。可以看到上图存储器是和CPU分开的,CPU处理速度很快,而到存储设备的传输速度却很慢,会导致CPU经常空转等待数据传输,非常浪费资源。
2、现代计算机的结构
现代计算机的结构是以存储器为核心的结构
,本质上讲还是冯诺伊曼体系计算机,在原有结构进行改变,来解决冯诺伊曼瓶颈问题。
- 现代计算机在冯诺伊曼体系结构基础上进行修改
- 解决CPU与存储设备之间的性能差异问题
现代计算机体系结构示意图
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
四、计算机的层次与编程语言
1、程序翻译与程序解析
较为高级的计算机语言L1
较为低级的计算机语言L0
程序翻译
L1编写程序,在执行的时候先会生成一个逻辑等价的L0由计算机执行,L0为计算机实际执行的语言,L1生成L0的过程被成为程序翻译,生成的东西被称为编译器,整个过程是程序翻译的过程。
程序解析
使用L1进行逻辑描述,为了执行L1,还要使用L0语言实现另外一个程序,它将L1作为输入进行执行,每一个L1语句都会在L0里进行等价的逻辑转换,这个过程被称为程序解析,使用L0语言生成的另外一个程序被称为解释器。
区别:
- 计算机执行的指令都是L0
- 翻译过程生成新的L0程序,解析过程不生成新的L0
- 解析的过程由L0编写的解释器去解析L1程序
翻译型语言:C/C++,Object-C,Golang
解析型语言:Python,Php,Javascript
翻译+解释型语言:Java,C#
2、计算机的层次与编程语言
按照层次来划分计算机系统,大致划分为七个层次:
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
硬件逻辑层
- 门、触发器等逻辑电路组成
- 属于电子工程领域
微程序机器层
- 编程语言是微指令集
- 微指令所组成的微程序直接交由硬件执行
传统机器层
- 编程语言是CPU指令集(机器指令)
- 编程语言和硬件直接相关
- 不同架构的CPU使用不同的CPU指令集
#一条机器指令对应一个微程序
#一个微程序对应一组微指令
操作系统层
- 向上提供简易的操作界面
- 向下对接了指令系统,管理硬件资源
- 是在软件和硬件之间的适配层
汇编语言层
- 编程语言是汇编语言
- 汇编语言可以翻译成可直接执行的机器语言
- 完成翻译的过程的程序是汇编器
高级语言层
- 编程语言为广大程序员所接受的高级语言
- 高级语言类别有两百多种
- 常见有Python,Java,C/C++等
应用层
- 满足计算机对某种用途而专门设计。office,Adobe等
- 面向问题的应用程序
五、计算机的计算单位
1、容量单位
- 物理层面,高低电平记录信息
- 高电平表示1,低电平表示0,理论上只认识0/1两种状态,0/1称为bit(比特位)
- 0/1表示的内容太少,需要更大的容量的表示方法,催生了早期字节单位
bit | Byte | KB | MB | GB | TB | PB | EB | |
---|---|---|---|---|---|---|---|---|
名字 | 比特位 | 字节 | 千字节 | 兆字节 | 吉字节 | 太字节 | 拍字节 | 艾字节 |
比例 | - | 8bits | 1024B | 1024KB | 1024MB | 1024GB | 1024TB | 1024EB |
常见设备 | 门电路 | - | 寄存器 | 高速缓存 | 内存/硬盘 | 硬盘 | 云硬盘 | 数据仓库 |
1024=2^10
硬盘商家一般用10进位标记容量,所以买到的U盘容量偏小
2、速度单位
网络速度
网络中常用单位为(Mbps),所以在进行运算的时候要除以8得到实际的网络速度
1M/s=1Mbps=1Mbit/s
100M/s=100Mbps=100Mbit/s
100Mbit/s=(100/8)MB/s=12.5M/s
CPU速度
- CPU的速度一般体现为CPU的时钟频率,单位一般用赫兹(Hz)表示,目前主流的CPU时钟频率都在2GHz以上
- Hz是指秒分之一,是指每秒钟周期性变动重复次数的计量,并不是描述计算机领域所专有的单位,但并不妨碍描述CPU的速度
- 对于CPU的频率实际上是指每秒钟高低电平变换的次数,2GHz=2*1000^3Hz=每秒20亿次
六、计算机的字符与编码集
1、字符编码集的历史
ASCII码
- 使用7个bits就可以完全表示
- 包含95个可打印字符
- 包含33个不可打印字符(包括控制字符)
33+95=128=2^7,7个bits就可以表示ASCII码,由于很多应用或者国家中的符号都无法表示,第一次对ASCII码进行扩充,由7bits变成8bits,原来的128个字符扩充为256个字符,变为可拓展的ASCII码
Extended ASCII码
- 常见的数学运算符
- 带音标的欧洲字符
- 其他常用符,表格符等
随着计算机的进一步发展,越来越多国家加入计算机使用行列当中,对计算机的字符要求越来越高
字符编码集的国际化
- 欧洲,中亚,东亚,拉丁美洲国家语言的多样性
- 语言体系不一样,不以有限字符组合的语言
- 中国,韩国,日本等的语言最为复杂
2、中文编码集
GB2312
- 1980年发明,我国最早最完备的编码集
- 全称为《信息交换用汉字编码字符集——基本集》
- 一共收录了7445个字符
- 其中包括6763个汉字和682个其他符号
GB2312不符合国际标准,中国科学家在1995年推出了第二套比较完备的编码集GBK
GBK
- 全称为《汉字内码扩展规范》
- 向下兼容GB2312,向上支持国际ISO标准
- 收录了21003个汉字,支持全部中日韩汉字
尽管GBK比较完备,但只是本地化的编码,跨国使用出现不兼容问题
Unicode
- 兼容全球的字符集
- 统一码,万国码,单一码
- 定义了世界通用的符号集,规定了符号的二进制代码,使用UTF-*实现相关的编码
- 常用的UTF-8是以字节为单位对Unicode进行编码
七、计算机的总线
连接计算机不同设备的数据线,为了解决不同设备之间的通信问题
1、总线是什么
USB通用串行总线
- 提供了计算机对外连接的接口
- 不同的设备可以通过USB接口进行连接
- 可以作为连接的标准,促使外围设备的统一
PCI 总线
ISA总线
Thunderbolt总线
2、总线的分类
片内总线
高集成度芯片内部的信息传输线
,大大简化芯片内部的电路结构
- 主要是在芯片内部的总线
- 连接芯片内部的寄存器与寄存器
- 寄存器与控制器,运算器之间
系统总线
连接计算机外围各组件之间的信息传输线
,包括CPU、主存、硬盘、IO设备、USB插槽、PCI插槽、显卡、声卡等设备
大致分为三类:
- 数据总线(位数一般和cpu位数想同,双向传输各个部件的数据信息;数据总线的卫视(总线宽度)是数据总线的重要参数)
- 地址总线(数据寻址,地址总线位数 =n 寻址范围0~2^n;指定源数据或目的数据在内存中的地址;位数与存储单元的位数有关)
- 控制总线(发出各种控制信号;控制信号一般由控制总线从一个组件发给另一个组件;可以监视不同组件之间的状态)
2、总线的仲裁
为什么需要总线的仲裁?
假设主存需要跟硬盘和IO设备交换数据,这时硬盘和IO设备已经就绪,没有仲裁会引起设备冲突。总线的仲裁是为了解决总线使用权的冲突问题。
总线仲的裁方法
-
链式查询
好处:电路复杂度低,仲裁方式简单
坏处:优先级低的设备难以获得总线的使用权,对电路故障敏感 -
计时器定时查询
仲裁控制器对设备编号并使用计数器累计计数
控制器接收到仲裁信号以后,会往所有设备发射出当前计数值
计数值与设备编号一致的话则获得总线使用权 -
独立请求
每个设备均有总线独立连接仲裁器
设备可以单独向仲裁器发送请求和接受请求
当同时收到多个请求信号的时候,仲裁器有权按优先级分配使用权
好处:响应速度快,优先顺序可以动态改变
坏处:设备连线多,总线控制相对较为复杂
八、I/O设备
1、常见输入输出设备
常见输入设备
- 字符输入设备
薄膜键盘
机械键盘(段落感,声音,压力,键程)
电容键盘 - 图像输入设备
鼠标
数位板
扫描仪(将图形信息转换为数字信号) - 图像输出设备
显示器
打印机
投影仪
2、输入输出接口的通用设计
设计输入输出接口的需求
支持读取数据
允许向设备发送数据
接口需要判断设备是否被占用
判断设备是否已经连接
判断设备是否正常启动
接口
- 数据线
I/O设备与主机之间进行数据交换的信息传送线
数据线可以分为单向传输数据线和双向传输数据线 - 状态线
I/O设备状态向主机报告的信号线
通过状态线主机可以查询I/O设备是否已经正常连接并就绪
可以查询设备是否被进程占用 - 命令线
CPU向设备发送命令的信号线
发送读写信号
发送启动停止信号 - 设备选择线
主机选择I/O设备进行操作的信号线
对连在总线上的设备进行选择
3、CPU与I/O设备的通讯方法
CPU速度与I/O设备不一致
程序中断
当外围设备准备就绪的时候就会向CPU发送中断信号,CPU内部有专门的电路响应中断信号,当CPU收到中断信号时会暂停当前工作转为处理外围I/O设备的工作等外围设备的事件,处理完成后CPU才会重新加载之前的工作。
提供低速设备通知的一种异步的方式
(低速设备发出一个中断,让CPU来响应中断)
有了程序中断,CPU可以高速运转的同时可以兼顾低速设备的响应
DMA(直接存储器访问)
硬盘,外置显卡都有DMA设备
- DMA直接连接主存与I/O设备
- 在需要进行通讯的时候,DMA不需要CPU的参与
- 可以大大提高CPU效率,IO设备就绪的时候再也不需要打断CPU的工作
九、计算机存储器
1、存储器的分类
按照存储介质分为半导体存储器(内存,U盘,固态硬盘)、磁存储器(磁带,磁盘)
按照存取方式分为随机存储器RAM(可以随机读取,与存取的位置无关)、串行存储器(与位置有关,按顺序查找)、只读存储器ROM(只读不写)
2、存储器的层次结构
存储器要考虑的三个因素:读写速度、存储容量、价格
使用位价客观描述存储器的性价比
容量+价格=>位价:每比特位价格
依据位价和读写速度将存储器分为缓存
(CPU里的寄存器和高速缓存),主存
(计算机内存),辅存
(计算机外部存储U盘等)三个层次
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
缓存-主存层次
原理:局部性原理
实现:在CPU与主存之间增加一层速度快(容量小)的Cache(高速缓存)
目的:解决主存速度不足的问题
局部性原理
CPU访问存储器时,无论是存取指令还是存取数据,所访问存储单元都趋于聚集在一个较小的连续区域中。
主存-辅存层次
原理:局部性原理
实现:在主存之外增加辅助存储器
目的:解决主存容量不够的问题
3、主存储器-内存
为什么主存因为断电会丢失数据?
RAM通过电容来存储数据,必须每隔一段时间时间刷新一次,如果断电,隔一段时间后将会丢失所有数据
主存储器与CPU如何交互?
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
操作系统位数与主存的关系
32位:232 =4x220 =4GB (地址总线32位,寻址范围4GB大小)
64位:264 =234 x230 =234 GB (地址总线64位,寻址范围234 GB大小)
4、辅助存储器-磁盘
磁盘的物理结构
- 表面是可磁化的硬磁特性材料
- 通过磁头的径向运动读取磁道信息
磁盘的调度算法
- 先来先服务算法
对于多个读写磁盘的请求都会将它排成一个队,谁先来读写谁 - 最短寻道时间优先算法
调度的顺序与磁头当前的位置有关
会优先访问距离磁头最近的磁道
每次读取找到当前磁道最近的磁道读取 - 扫描算法(电梯算法)
磁头每次只往一个方向运动
到达一个方向需要服务的尽头再反方向运动 - 循环扫描算法
在扫描算法的基础上
只往一个方向读取,由内而外或者由外而内
5、计算机的高速缓存
高速缓存位于缓存-主存层次,在CPU与主存中间
目的是为了解决CPU与主存速度不匹配的问题
主存内部存储结构
字
:存放在一个存储单元当中二进制代码的组合,可以表示一个数据,一个指令,一个字符串,是内存当中存储单元的最小单位
字块
:连续的字,一组字;存储在连续的存储单元中而被看作是一个单元的一组字
主存关于字,字块的简单运算
一个字有32位,一个字块共B个字,主存共M个字块,B x M=主存总字数,B x M x 32=主存总容量(bits)
字的寻址,字的地址包括两个部分
字块的部分用来指示当前的需要寻找的字属于哪个字块(字属于哪个字块)
字的部分用来寻找字块里面哪一个字是地址所指定的字(地址指定的字是字块中的哪个字)
前m位指定字块的地址 2m = M(主存共M个字块)
后b位指定字在字块中的地址 2b = B(一个字块B个字)
主存存储数据的方法计算例子
假设主存用户容量为4G,字块大小为4M,字长为32位,则对于字地址中的块地址m和块内地址b的位数,至少应该是多少?
4G=4096M
字块数:4096/4 = 1024
字块地址m:log21024 = 10 (在地址里至少需要10位来表示1024个字块)
块内字数:4M/32bit = 1048576 (每一个字块里有这么多字)
块内地址b:log21048576 = 20 (至少需要20位块内地址来表示块内所有的字)
m>=10,b>=20
高速缓存内部存储结构与主存非常类似
缓存的运算与主存运算类似
主存容量 >(远大于)缓存容量
缓存里存储的数据其实是主存里数据的一个备份,缓存每一个数据来自主存
- 存储的逻辑结构类似
- 缓存的容量较小
- 缓存的速度更快
高速缓存的工作原理
CPU需要的数据在缓存里,CPU可以高速的拿到数据
需要数据不再缓存里,CPU需要去主存里拿
CPU需要尽可能的从高速缓存中取数据,用量化的指标命中率
来量化CPU从高速缓存取数据成功的几率
命中率是衡量缓存的重要性指标
理论上CPU每次都能从高速缓存取数据的时候,命中率为1
高速缓存容量不及主存,命中率永远不可能为1
命中率如何计算?
假设访问主存次数:Nm
访问高速缓存次数:Nc
命中率: h = Nc/(Nc+Nm) (缓存次数占总次数比)
访问效率:e
假设访问主存时间:tm
访问缓存时间:tc
访问Cache-主存系统平均时间:ta = htc+(1-h)tm
访问效率:e = tc/ta(缓存时间/平均时间)
高速缓存的替换策略
良好的策略使得缓存里的数据都为CPU所用
高速缓存的替换时机
:当CPU所需要的数据不再Cache内时,需要从主存里载入所需要的数据
- 随机算法
每一次发生替换时随机选取高速缓存中的一个位置 - 先进先出算法(FIFO)
把Cache看作是一个先进先出的队列
优先替换掉最先进入队列里的字块 - 最不经常使用算法(LFU)
优先淘汰最不经常使用的字块
需要额外的空间去记录字块的使用频率 - 最近最少使用算法(LRU)
优先淘汰一段时间内没有使用的字块
有多种实现方法,一般使用双向链表
把当前访问节点置于链表前面(保证链表头部节点是最近使用的)
淘汰的时候淘汰链表尾部的节点
图片来源:慕课网实战课程《编程必备基础 计算机组成原理+操作系统+计算机网络》
十、计算机的指令系统
1、机器指令的形式
机器指令主要由两个部分组成:操作码、地址码
机器指令本质上还是对数据进行操作
操作码:
- 操作码指明指令所要完成的操作
- 操作码的位数反映了机器的操作种类(假设位数8位,最多可以有28 = 256种操作)
地址码:
- 地址码直接给出操作数或者操作数的地址(指定数据或者数据地址)
- 分三地址指令(地址码字段有三个地址)、二地址指令和一地址指令
三地址指令: 操作码(OP)|addr1|addr2|addr3
(addr1)OP(addr2)=》(addr3) 地址1OP地址2 结果放在地址3
二地址指令:操作码(OP)|addr1|addr2
(addr1)OP(addr2)=》(addr1)或(addr2) 地址1OP地址2 结果放在地址1或地址2
一地址指令:操作码(OP)|addr1
(addr1)OP=》(addr1)自己对自己的操作
(addr1)OP(ACC)=》(addr1)一个操作数做默认行为 自增
零地址指令:
- 在机器指令中无地址码
- 通常为空操作、停机操作、中断返回操作等
2、机器指令的操作类型
数据传输类型
发生在寄存器之间、寄存器与存储单元、存储单元之间的传送
包括数据读写、交换地址数据、清零置一等操作
算术逻辑类型
操作数之间的加减乘除运算
操作数之间的与或非等逻辑位运算
移位操作
数据左移(相当于乘2),数据右移(除以2)
完成数据在算术逻辑单元的必要操作
控制指令
等待指令、停机指令、空操作指令、中断指令等
3、寻址方式
指令寻址(数据寻址、跳跃寻址)
地址 | 指令 |
---|---|
101 | MOV R0,R1 |
102 | LAD R1,6 |
103 | ADD R1,R2 |
104 | AND R1,R3 |
105 | JMP 102 |
执行顺序:101—(顺序寻址)—102—(顺序寻址)—103—(顺序寻址)—104—(顺序寻址)—105—(跳跃寻址)—102
数据寻址(立即寻址、直接寻址、间接寻址)
- 立即寻址
指令直接获得操作数
运行指令时无需访问存储器 - 直接寻址
机器指令里直接给出操作数在主存里的地址,所给出的地址指向主存,指向的位置是指令的操作数
寻找操作数简单、不需要计算数据地址 - 间接寻址
指令地址码给出的是操作数地址的地址(首先指向主存的一个位置,这个位置存放操作数的地址,主存中操作数的地址指向另一片区域,这片区域存储的是真正需要的操作数)
需要访问一次或多次主存里获取操作数
寻址方式 | 优点 | 缺点 |
---|---|---|
立即寻址 | 速度快 | 地址码位数限制操作数表示范围 |
直接寻址 | 寻找操作数简单 | 地址码位数限制操作数寻址范围 |
间接寻址 | 操作数寻址范围大 | 速度较慢 |
十一、计算机的控制器
控制器是协调和控制计算机运行的
控制器的组成
- 程序计数器
主要用来提供给其他控制单元当前需要执行的指令的地址的
用来存储下一条指令的地址
CPU工作时,会循环不断从程序计数器里拿出指令
当指令被拿出时,程序计数器会指向下一条指令 - 时序发生器
属于电气工程领域,用于发送时序脉冲
CPU依据不同的时序脉冲有节奏的进行工作 - 指令译码器
控制器主要部件之一
翻译操作码对应的操作以及控制传输地址码对应的数据 - 各种寄存器
指令寄存器(控制器主要部件之一,从主存或Cache存取计算机指令)
主存地址寄存器(保存当前CPU正要访问的内存单元的地址,使用地址总线与主存进行相关通信)
主存数据寄存器(保存当前CPU正要读或写的主存数据)
通用寄存器(暂时存放或传送数据和指令,可以用来保存ALU算术逻辑单元运算的中间结果,容量比一般专用寄存器要大) - 总线