前言
一、计算机组成原理-背景
1、计算机的发展简史
2、计算机的分类
摩尔定理难以实现,开始多核发展;
提出去"IOE" ,使得阿里替数据库换成了:分布式的mysql 集群,
- 解决数据库扩展问题;
- 用普通的服务器,代替大型机;
3、计算机的体系结构
运算器与控制器的冲突:冯诺依曼瓶颈
这里的存储器是围绕CPU 的高速存储器。
4、计算机的层次与编程语言
程序解释、解析:高级语言被解释器解释成机器语言来执行,像python 需要Python解释器去执行.py文件;其不生成新的低级程序,由解析器对高级语言解析然后执行。
程序翻译:生成新的低级程序。(由编译器直接生成)C /C++编译成汇编再到机器码。
java的编译结果是被jvm“解释执行”的,算是翻译+解释。因为“编译”其本质就是“把一个相对高级的语言转换为另一个相对低级的语言。
所以嵌入式用c语言,因为高级语言还需要解释成为低级语言。且c语言效率高,可以访问硬件,移植性好。
也就分为了:翻译型编程语言、解释型编程语言;
5、计算机的计算单位
容量 :bit btye MB TM PB EB;
速度 Mbps HZ ;
6、计算机的字符与编码集
ASCII 码 ->7位 128个
Extended ASCII 码 ->8位 256个
字符编码集国际化:
GB2312: 7000+个字符;不符合国际标准;
GBK:兼容GB2312;支持国际ISO 标准;21003个汉字,支持全部中日韩汉字。
Unicode:(统一码、万国码、单一码)定义了世界通用符号集,UTF -* 实现了编码;
UTF-8以字节为单位对Unicode进行编码。
- UTF-8是这样做的:
- 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
- n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
https://www.zhihu.com/question/23374078
二、计算机组成原理-组成
1、计算机总线设计
1.1、分类
USB
PCI
ISA
Thunderbolt
都是为了解决不同设备间通信问题。
分类:片内总线、系统总线;
系统总线:分为数据、地址、控制总线;
- 数据总线:位数与CPU 位数相同;
- 地址总线:位数与存储单元有关;
- 控制总线:监视不同组件间状态;
1.2、总线仲裁
为了仲裁不同设备使用总线的优先顺序的设备。
为了解决总线使用权的冲突问题。
方法:链式查询、计时器定时查询、独立请求;
- 链式查询 :电路复杂度低、仲裁方式简单;优先级低的设备难以获得总线使用权、对电路故障敏感。
- 计时器定时查询 :通过定时给每个设备发送,每个设备能在这个时间段占用总线。
- 独立请求 :响应速度快、优先级可变;设备连接多、总线控制复杂。
2、计算机输入输出
字符输入设备、图像输入设备、图像输出设备
2.1、通用接口设计
读取数据、发送数据、连接、启动等
数据线、状态线、命令线、设备选择线、
2.2、CPU与IO通信方法
程序中断、DMA;
程序中断:
- 外围IO就绪后,向CPU发出中断信号;
- CPU有专门电路相应中断信号;
- 暂停处理->恢复现场
提供了一种低俗设备通知CPU的一种异步方式,使得CPU在高速运转同时兼顾低俗设备响应;但是频繁打断CPU,降低了效率;
DMA:
- DMA 直接连接主存于IO设备
- DMA工作时不需要CPU参与
3、计算机存储器
3.1、分类与局部性原理
按照存取方式分类:RAM、ROM
按照层次结构分为:缓存、主存、辅存;
cpu和主存之间增加一层cache(速度快、容量小)以匹配贮存速度不足的问题;
引出:局部性原理;
因为局部性原理:缓存、主存层次才得以生效。
局部性原理:cpu访问存储器时,无论存取指令还是数据,
所访问的存储单元都趋于聚集在一个较小的连续区域中。
主存之外增加辅存,以解决主存容量不足的问题;
同样因为局部性原理:主存、辅存层次才得以生效。
就像将游戏中8G的数据读到内存中来处理。
3.2、主存与辅存
主存:
32位系统:数据、地址总线是32位,最大内存2^32 = 4GB
64位系统:数据、地址总线是64位,最大内存2^64 = 2^34 GB
辅存:
先来先服务算法(按顺序)、最短寻道时间优先(按磁头距离)、扫描算法(电梯算法:往一个方向直到头再反向)、循环扫描算法(只往一个方向,到尾,就回到头继续)
3.3、高速缓存 与 cache 命中率
字:存储在一个存储单元中的二进制代码组合。(32位、64位、半字)
字块:存储在连续存储单元中,被看作是一个单元的一组字。
CPU需要的数据不在缓存中,就需要去主存拿,就很慢。
cpu从缓存取数据的成功率:命中率;
高速缓存替换策略:
缓存中没有CPU需要的数据,要从主存中取数据。
- 随机算法
- 先进先出算法 FIFO ;先进缓存的先被替换
- 最不经常使用算法 LFU ;淘汰最不常使用的字块;额外空间记录字块使用频率;
- 最近最少使用算法 LRU ; 优先淘汰一段时间内没使用的字块;一般使用双链表实现;把当前访问的节点放在表头(淘汰链表尾部);
4、计算机指令系统
4.1、机器指令形式
操作码+ 地址码
还存在无地址指令;
地址码分为:三、二、一 地址指令,即里面有几个地址;
4.2、机器指令的操作类型
数据操作类型:
-
分为:寄存器之间、寄存器与存储单元之间、存储单元之间;
-
有:数据读写、交换地址数据、清零置一等;
算数逻辑操作类型:
- 操作数间加减乘除
- 与或非
- 移位
控制指令类型:
- 等待、停机、空操作、中断指令等
4.3、机器指令的寻址方式
指令寻址:
- 顺序寻址:
- 跳跃寻址:JMP 指令
数据寻址:
- 立即寻址:指令内包含操作数;速度快;但是位数限制了其大小;
- 直接寻址:指令内给出主存地址;寻找操作数简单;但是地址码限制了寻址范围;
- 间接寻址:指令内地址码给的是操作数地址的地址;操作数寻址范围大;但是速度慢,两次寻址;
5、计算机控制器与运算器
6、计算机指令执行与流水线设计
指令执行过程 :
取指->译码->执行指令
CPU流水线设计 :三级流水线:效率快约三倍
取指->译码->执行->取指->译码->执行
null->取指->译码->执行->取指->译码->执行
null->null->取指->译码->执行->取指->译码->执行
三种流水线冲突:
- 结构相关:当指令在重叠执行的过程中,硬件资源满足不了指令重叠执行的要求,发生资源冲突时将产生结构相关。解决方法:添加硬件资源,例如解决访存冲突就使用指令cache和数据cache分开的哈弗结构。:
- 数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起数据相关。解决方法:数据重定向技术,或者称为旁路技术(forwarding)。
- 控制相关:当流水线遇到分支指令和其他会改变PC值的指令时,会发生控制相关。解决方法:分支预测技术,投机执行,延迟分支。
流水线冲刷:
- 分支预测不正确的时候,需要把后面的流水冲刷掉,以执行正确分支的代码。
三、计算机组成原理-计算
1、进制运算基础:
包括整数与小数;
有符号数、无符号数:
原码表示有符号数:负数与整数只差一个最高位;
二进制补码、反码:
为了解决二进制零的歧义、减法的复杂,引入补码。
正数原码、反码、补码一致;
负数反码:除了符号位,取反;
负数补码:除了符号位,取反加一;
小数也遵循这样的运算。
n+1位数:符号位用掉一个:
2、定点数、浮点数:
定点数:乘以比例因子以满足定点数保存格式;一般是左右移;
浮点数:
- 计算机处理的数不是存小数、纯整数;
- 数据范围很大,定点数难以表达;
浮点数表示格式:
浮点数表示范围:
浮点数规格化:
- 要求位数使用纯小数;
- 位数最高位必须是1;
定点数与浮点数的对比:
- 位数相同是,浮点数表示范围更大
- 浮点数尾数为规格化数时,浮点数精度更高
- 浮点数运算包含解码和尾数,运算更加复杂
浮点数于表示范围、精度、溢出处理、编程等方面优于定点数;
定点数在运算规则、运算速度、硬件成本方面更优;
3、定点数加法
定点数溢出判断:
双符号位判断:0->00 ,1->11;双符号位产生的进位丢弃,结果的双符号位不同则表示溢出。
4、定点数减法
负数补码再求补码,就是求回正数的补码,就是转回整数的原码;
6、浮点数加减法
对阶->尾数求和->尾数规格化->舍入->溢出判断
对阶: 以大阶为准,尾数右移。
**尾数规格化:**正常称作左规,需要舍入的称为右规
一般情况都进行左移
双符号位不一致的情况下需要右移(定点运算的溢出状态,对于浮点数来说不是溢出)
右移的话则需要进行舍入操作
溢出判断:
定点运算双符号位不一致为溢出
浮点运算尾数双符号位不一致不算溢出;因为尾数双符号位可以右移;
浮点运算主要通过阶码的双符号位判断是否溢出;如果规格化后,解码双符号位不一致则溢出
7、浮点数乘除法
阶数运算->尾数求和->尾数规格化->舍入->溢出判断
相乘:阶码相加,尾数求积
相除:阶码相减,尾数求商