计算机组成原理学习笔记(1):概述
计算机组成原理学习笔记(2):发展
计算机组成原理学习笔记(3):总线
计算机组成原理学习笔记(4):存储器
计算机组成原理学习笔记(5):I/O
计算机组成原理学习笔记(6):数字
计算机组成原理学习笔记(7):指令系统
计算机组成原理学习笔记(8):CPU的结构和功能
计算机组成原理学习笔记(9):控制单元的功能
计算机组成原理学习笔记(10):控制单元的设计
CPU——Central Processing Unit,中央处理机(器)
PC——Program Counter,程序计数器,存放当前欲执行指令的地址,并可自动计数形成下一条指令地址的计数器
IR——Instruction Register,指令寄存器,存放当前正在执行的指令的寄存器
CU——Control Unit,控制单元(部件),控制器中产生微操作命令序列的部件,为控制器的核心部件
ALU——Arithmetic Logic Unit,算术逻辑运算单元,运算器中完成算术逻辑运算的逻辑部件
ACC——Accumulator,累加器,运算器中运算前存放操作数、运算后存放运算结果的寄存器
MQ——Multiplier-Quotient Register,乘商寄存器,乘法运算时存放乘数、除法时存放商的寄存器
X——此字母没有专指的缩写含义,可以用作任一部件名,在此表示操作数寄存器,即运算器中工作寄存器之一,用来存放操作数
MAR——Memory Address Register,存储器地址寄存器,内存中用来存放欲访问存储单元地址的寄存器
MDR——Memory Data Register,存储器数据缓冲寄存器,主存中用来存放从某单元读出、或写入某存储单元数据的寄存器
I/O——Input/Output equipment,输入/输出设备,为输入设备和输出设备的总称,用于计算机内部和外界信息的转换与传送
MIPS——Million Instruction Per Second,每秒执行百万条指令数,为计算机运算速度指标的一种计量单位
按存储介质分类(半导体、磁力、光)
- 半导体存储器:TTL、MOS(易失)
- 磁表面存储器:磁头、载磁体(非易失)
- 磁芯存储器:硬磁材料、环状元件(非易失)
- 光盘存储器:激光、磁光材料(非易失)
按存取方式分类
存取时间与物理地址无关(随机访问)
随机存储器在程序的执行过程中可读可写
只读存储器在程序的执行过程中只读
存取时间与物理地址有关(串行访问)
- 顺序存取存储器磁带
- 直接存取存储器磁盘
按在计算机中的作用分类
(由于用户要求高速度大容量低价格,使用软硬件达到好的存储体系)
从某一级程序员来看达到这种要求
解决问题:
程序是在主存上,辅存存储文档等
在应用程序员使用时有辅存的容量主存的速度,程序员不用对这些主存分配进行控制(主存内的程序执行完,把程序退出,取出辅存的程序放入主存执行)
缓存主存构成的存储体系使用主存储器的地址(实地址,目的地址),程序执行时也是主存的地址
主存辅存构成的存储体系构成虚拟存储器使用虚拟地址(是既不是主存地址也不是辅存地址的逻辑地址),在使用的时候有特殊的模块完成映射
读写控制电路控制读出存取的方向
存储单元分为字地址和字节地址
下图对应的字地址就是0,4,8第一行字节地址是0,1,2,3(一个字包含四个字节)
两种存储方式
大端方式(大尾方式)
高位字节存放在低地址
小端方式(小尾方式)
(w = word)
存储容量:主存存放二进制代码的总位数
存储速度:
地址线(单向):CPU或者I/O指向存储器
数据线(双向):完成数据双向传输
片选信号: CS芯片选择 CE芯片使能 上面的横线表示低电平有效
评价译码器出来之后会出现字线条数过多的情况
改善线选法的字线设计问题( Y ∗ Y_* Y∗有效的时候对应列上的存储单元才会开启)
Intel2114外特性
Intel2114读操作
Intel2114写操作
基本单元电路
(三管)
读出与原存信息相反(输出端需要加个非门)
写入与输入信息相同
T 4 T_4 T4预充电信号有效后打开对读数据线进行充电,使得读信号线为1,当读选择线高电平, T 2 T_2 T2导通,此时如果 C g C_g Cg为1则 T 1 T_1 T1不导通,读数据线上的数据一直是1,反之如果 C g C_g Cg为0则 T 1 T_1 T1导通,读数据线上的数据放电变为1
(单管)
读出时数据线有电流为“1”没电流为“0”
写入时 C s C_s Cs充电为“1”放电为“0”
动态RAM芯片举例:三管动态RAM芯片(Intel1103)
读写控制线也会参与译码译码后对应位置会产生单独的读选择线和写选择线(行列地址均为如此)
读操作
写操作
单管动态RAM4116(16K×1位)外特性
16k需要14根地址线进行译码但是他只有7个地址线所以分两次进行传送,第一次送入的数据保存在缓存器中
读放大器跷跷板电路,左右分别为0和1或者左右分别为1和0
读操作
读出的时候会有一次反向
写操作
写入的时候会有一次反向
动态RAM的刷新
刷新与行地址有关
刷新方式
读写周期包含了刷新周期,变成了原来的两倍,属于过度刷新,在此数据下每一个毫秒被刷新了15.6次
对于128×128的存储芯片(存取周期为0.5us)
DRAM(主存) | SRAM(缓存) | |
---|---|---|
存储原理 | 电容 | 触发器 |
集成度 | 高 | 低 |
芯片引脚 | 少(行列地址可以分时传送入寄存器所以引脚大致减少一半) | 多(价格比较高速度比较快,在传入寄存器和译码器的时候会拖慢速度丧失优势) |
功耗 | 小(只是对电容充放电) | 大(有三个管子一直在导通状态漏电) |
速度 | 慢(电容充放电需要时间) | 快(触发器响应时间比较短) |
刷新 | 需要 | 不需要 |
①掩膜ROM(MROM)不可编程
行列选择线交叉处有MOS管为“1”
行列选择线交叉处无MOS管为“0”
②可编程ROM(PROM)一次性编程
③可擦写可编程ROM(EPROM)多次编程
编程过程D加电压形成浮动栅
擦洗过程紫外线擦洗
④电可擦写可编程ROM(EEPROM)多次编程
电可擦写
局部擦写
全部擦写
⑤Flash Memory(闪速型存储器)
比较
EPROM价格便宜集成度高
EEPROM电可擦洗重写
比EEPROM快具备RAM功能
位扩展
两个芯片同时做读操作和写操作(当一个芯片用)
地址线、片选线、读写控制线并联
数据线接入不同的位置
字扩展
两个芯片同时做读操作和写操作(当一个芯片用)
数据线、地址线线、读写控制线并联
片选线作为新的译码器输出的一条获取更多的位置编码
位字同时扩展
基本方法
地址线的链接:一般地址线的低位作为芯片内部的地址信号,高位作为片选信号送入芯片
数据线的连接:当CPU的数据线宽度比存储器的宽时,我们需要做位扩展,使存储器的输入输出数据位宽与CPU相同
读写命令线的连接:直接连接(ROM除外,只读不写)
片选线的连接:地址空间落在那一个或者那几个芯片上,片选线的信号可以体现出CPU访问的是I/O还是存储器,这一点需要在片选信号线上体现出来
合理选择存储芯片:ROM保存系统程序、配置信息;RAM用户程序
其他考虑因素时间负载
信息保存在电容或者触发器中,经受带电粒子打击可能会出现电容充放电或者触发器翻转
任意两组合法代码之间二进制位数的最少差异
编码的纠错、检错能力与编码的最小距离有关
为了能检测和纠正内存软错误,首先出现的是内存“奇偶校验”。内存中最小的单位是比特,也称为“位”,位只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数。对于偶校验,校验位就定义为1;对于奇校验,则相反。
奇偶校验有两种类型:奇校验和偶校验。奇偶校验位是一个表示给定位数的二进制数中1的个数是奇数或者偶数的二进制数,奇偶校验位是最简单的错误检测码。
奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数
1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。
偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数,
采用奇偶校验、分组校验
无校验奇偶校验分组奇偶校验如下
汉明码的讲解
备注:默认如果出错也是只有一位有问题
想要达到的效果
通过校验位来判断具体是那个位置出错
P 1 P_1 P1 P 2 P_2 P2 P 3 P_3 P3分别是校验出来这个校验位是否有错的含义,不代表这个校验位是什么值
分组细节
汉明码三要素
两个例子
检测过程
通过协议定义的信息(通过汉明码进行编码,采用奇校验还是偶校验,汉明码编码过程中增加的检测位位数)
根据汉明码编码过程中增加的检测位位数的每一个形成新的检测位 P x P_x Px
符合奇校验或者偶校验的信息就认为没有错误定义,新的校验位定义为0
纠错例子
备注校验过程一样,纠错过程奇校验和偶校验略有不同
存储墙:CPU速度提升的速率远远超过存储器的读取写入速度的提升,运行的程序存储的运行结果都需要存储器的访问,这个成为了瓶颈
采用高速器件
采用层次结构Cache-主存
调整主存结构
通过使存储器字位更多可以做到一次读取出多个对应于cpu的字位的数据(cpu为32位存储器128位读取一次存储器可以在cpu使用4次)
评价:增加存储器的带宽
问题一:写入小字长的数据时候可能会因为过宽的位宽影响到其他数据进行错误写入
问题二:要取得数据不是连续的存放在一起,需要单体多次的取用
高位交叉顺序编址
评价和问题:多个存储体进行工作时独立;会造成某一个存储体非常繁忙其他的非常空闲。适合容量扩展不适合存储器提升带宽。
低位交叉各个体轮流编址
评价和问题:多个存储体进行工作时独立;在实现过程中,每个存储体 M 0 − M 3 M_0-M_3 M0−M3都有独立的控制电路,可以锁存住指令和地址信息,在读取的时候这样cpu还可以去访问其他的存储体信息,适合容量扩展,也做到了存储器提升带宽。
SDRAM(同步DRAM)
在系统时钟的控制下进行读出和写入CPU无须等待(存储器的速度非常快,使用系统时钟进行读取写入跟cpu做到了同步)
RDRAM
由Rambus开发,主要解决存储器带宽问题
带 Cache的DRAM
在DRAM的芯片内集成了一个由SRAM组成的Cache,有利于猝发式读取(实现方式是,每次进入缓冲器的行地址进行比较,如果和上一次的行地址相同就可以直接进行列地址的输入进行数据读取,如果不同则需要重新更改一下行地址)
原理:
时间局部性:当前的空间的数据或者指令在不久的将来也会被使用到
空间局部性:当前的空间的数据或者指令相邻的位置数据或者指令也会被使用到
主存和缓存的编址
主存的容量远远大于Cache容量: M > > C M>>C M>>C
主存的块和Cache的块大小相等,CPU给出的内存地址分为两部分一部分对应块号一部分对应偏移地址也就是块内地址,块内的数据进行整体传送(数据按块进行传送)
标记的意义:标记主存内对应的块的编号,表示块是否被送入了Cache中,如果已经在里面就可以直接从Cache中得到数据
命中与未命中
主存中只有部分块缓存入Cache中
命中:主存块调入缓存,主存块与缓存块建立了对应关系,用标记记录与某缓存块建立了对应关系的主存块号
未命中:主存块未调入缓存,主存块与缓存块未建立对应关系
Cache的命中率
CPU欲访问的信息在Cache中的比率
命中率与Cache的容量与块长有关
一般每块可取4~8个字
块长取一个存取周期内从主存调出的信息长度
Cache-主存系统的效率
读操作:
备注Cache判断是否满,判断的是这个信息能被存储入的Cache存储空间是否满了
写操作:
主要解决:Cache和主存的一致性
写直达法(Write-through)
写操作时数据既写入Cache又写入主存写操作时间就是访问主存的时间,Cache块退出时,不需要对主存执行写操作,更新策略比较容易实现(评价:累加需要频繁的进行数据更新,这样每次更新后保存数据会使得内存和Cache频繁交互,很浪费)写回法(Write-back)
写操作时只把数据写入Cache而不写入主存当Cache数据被替换出去时才写回主存(评价:多个处理器会因为多个Cache对内存有多个数据备份,不能保证实时一致。写操作时间就是访问Cache的时间,Cache块退出时,被替换的块需写回主存,增加Cache的复杂性)
某一主存块只能固定映射到某一缓存块
CPU给出地址(区号=主存字块标记、块号=Cache字块地址、偏移地址=字块内地址)
Cache存储中的每个字块都可能是主存中任意分区的对应字块存储的信息,具体有那个区的信息传送进来记录在标记位上。
判断主存内的信息是否被加载进入Cache(是否命中) 比较器比较CPU给出的主存字块标记和Cache的标记位的信息,如果相同则为命中,如果不相同则没命中
评价:速度快,简单易设计,Cache利用率低,冲突率高(存储在不同分区的相同偏移量的数据不能一次读进去需要不断的推出等操作)
某一主存块能映射到任一缓存块
评价:成本高,利用率高,以为存储的时候的任意性,cache存储的数据可能对应主存储器中的任意数据,所以需要比较的地址位数很多,比较次数很多比较时间较慢
直接相连映射和全相连映射的组合
某一主存块只能映射到某一缓存组中的任一缓存块
主存储器分成若干区,每一 区内标号第 X X X块,放在Cache中第 X X X组的任何一个位置
如下图 Cashe分为 Q = 2 c − r Q=2^{c-r} Q=2c−r组每组有 2 2 2块,主存储器分为 2 m / Q 2^m/Q 2m/Q区,每个区有 2 c − r 2^{c-r} 2c−r个块,其中每一个块都对应 Q Q Q组中的一个。比较是否命中的时候给出主存地址,根据他在所属分区中属于第几块,然后去Cashe中的第几个组找有没有对应的标记,如果没有就是未命中。
评价:比较数量较少,包含直接相连也包含了全相连,电路设计也不是很复杂
靠近CPU的Cache:直接相连或者两路组相连
中间的Cache:两路组相连或者八路组相连
靠近内存的Cache:全相连(越靠后对速度要求越低对利用率要求越高)
先进先出(FIFO)算法
不能很好的体现出程序局部性原理
近期最少使用(LRU)算法
需要先将数据导入到主存中才可以与cpu交互
写操作
读操作