计组第四章 存储器
第四章 存储器
4.1 概述
4.1.1. 分类
(1) 按存储介质分类
(2) 按存储方式分类
(3) 按在计算机中的作用分类
4.1.2. 存储器的层次结构
寄存器的价格最贵
- 单一的存储器都无法满足用户的要求,用户的要求很多,因此采用层次结构,形成一种存储体系
- 存储体系:用软件 硬件 或者软硬件结合的方式,连接成一个整体,从程序员的角度来看,是一个存储整体,不需要考虑存储器的层次结构,最终只能看到整个存储体系的特点
计算机有两个主要的存储乘次
-
缓存——主存 解决速度的问题
缓存主存采用硬件的方式连接,因为这个层次我们要解决速度问题,要求其速度非常快,硬件最快
缓存—主存采用的是主存储器的地址,是实地址,物理地址
因为内容还是从主存中查找
主存按照地址查找,缓存是按照内容查找的
-
主存——缓存 解决容量的问题
主存辅存采用软硬件结合的方式,解决的是容量的问题,速度不是最快的
一般将 主存—辅存 层次看做一个虚拟存储器(对于程序员来说,这是一个整体,不需要考虑内部的连接)
这时就需要考虑地址问题了,因为实际上二者的物理空间是分开的
因此定义了新的地址——虚地址,使用的是逻辑地址
4.2 主存储器(重点)
4.2.1. 概述
(1) 主存的具体结构
- MAR的地址得经过译码器的转换,因为MAR里面是二进制代码,译码器转换
- MDR与存储体之间通过读写电路传输数据或者指令
- 但是读还是写要通过中间的 读写控制电路来控制
(2) 主存和CPU的联系
CPU和主存之间有三种信号:
- 数据信号:通过MDR与主存连接,双向的
- 地址信号:CPU想主存传递,通过MAR,是单向的
- 控制信号:这里是读写信号,CPU中的CU来进行控制的,传递给主存,当然以后还有其他控制信号
(3) 主存中存储单元地址的分配
我们假设存储器中的存储字长为32位,在计算机中,地址是按照字节来设置的,不会为每个子设置一个地址,而会为每个字节设置地址,因此子的地址是间断的
比如32位字长,一个字有4个字节,那么一个字地址就有四个字节地址,子地址的间隔就为4
12345678H 这个数据如何在主存储器中进行存储,有两种方式
大端、大尾方式 | 小端、小尾方式 |
---|---|
大端就是顺序,小端就是倒序,两种方式的数据传输的时候要进行转化
x86系列采用小尾方式
MB中的B是 byte的意思,表8位,MW的W是word的意思,就是字长数
(4) 主存的技术指标
-
存储容量:主存 存放二进制代码的总位数
-
存储速度
-
存取时间:存储器的访问时间(发出请求到任务完成的时间)
- 读出时间
- 响应时间
-
存取周期:连续两次独立的存储器操作((读或写)所需的 最小间隔时间)
- 读周期
- 写周期
一般来说,周期 > 时间 why?
-
-
存储器的带宽:位/秒,单位时间内写的数据的位数
4.2.2. 半导体存储芯片简介
(1) 半导体存储芯片的基本结构
① 示意图
-
内部有存储矩阵,译码驱动,读写电路
-
外部的线有地址线,数据线,片选线,读写控制线(一条或者两条)
-
片选线,半导体有两种表示方法
C:芯片,S:select,E:enable(使能信号)
-
读写控制线:
- 一根线
- 两根线
-
② 根据数据线计算芯片容量
如何计算容量
地址线 | 数据线 | 芯片容量 |
---|---|---|
10 | 4 | 1K×4位 |
14 | 1 | 16K×1位 |
13 | 8 | 8K×8位 |
210 = 1K
③ 片选线实现存储芯片级联
这个多想想
用 16K × 1位 的存储芯片组成 64K × 8位 的存储器
-
首先位级联
原来是1位,即片选信号一次选择1位
现在是8位,那么可以让8个芯片并联使用一个片选信号,这样一下可以选中八位
将这个看做一个芯片,一个存储单元有8位,8位数据线,地址是0~16K-1
-
然后字级联
原来是16K的地址,现在要64K,就可以让4个16K串联,就实现了64K
1~16K-1的地址分给第一列,16K-32K-1的地址分给第二列,以此类推
16K,64K指的是容量,在尽心字的地址选择的时候考虑,8位是一个字长
要分清楚什么时候考虑什么
当地址为 65 535 (64K - 1) 时,最后 8 片的片选有效,在最后8片的相同位置都读取一位
事实上,片选信号就是用来实现级联的,因为芯片的地址线是固定的,如果要扩展的话,那就得多出地址线,而片选信号就能成为这多出来的线
片选信号和原来的地址线共同组成了新的逻辑地址
像65535这个地址,其所在的区间就是片选信号,然后一部分内容就是地址线的内容
(2) 半导体存储芯片的译码驱动方式
给定地址之后,如何找到给定的存储单元
① 线选法
线性的矩阵
首先分析芯片
- 4位地址线——24 = 16个字,8根数据线——每个字有8位
- 地址线经过译码器之后形成16根子线,每根字线同时选中8位存储单元
- 这样地址线过来,经过译码器译码,字线有效,选中位,位将数据通过位线传到读写控制电路
以读写0000地址为例子
缺点:
- 图中的容量是不存在的
- 实际上,假设有1M的容量,1M = 220,那么地址线就有20根,译码器转过来的就有220根字线
- 字线太多了,集成度很难做高
② 重合法
芯片分析
- 地址线分开,译码后分别形成X坐标和Y坐标
- X和Y都选中的存储单元才会输出信号
- 一个Y只选中一列:这个芯片的意思是一个字只有1位
举例:
- A5-A0选择了第一行,然后A9-A5打开了第一列的开关
- 因此第一行,第一列的存储单元的内容会被选中
- 当然,第一行的所有的存储单元都会输出,但是只有第一列的开关打开了
比较:
- 假设还是1M的字,20根地址线,假设分成了10 + 10,那么横着的是 210 = 1K条线,纵着1K条线,合计2K条线,比线选发的1M条线少了很多
- 因此使用这个比较多
4.2.3. 随机存取存储器 ( RAM )
对于SRAM和DRAM我们主要研究以下的问题
- 保存0和1的原理是什么?
- 基本单元电路的构成是什么?
- 对单元电路如何读出和写入?
- 典型芯片的结构是很么样子的?
- 静/动 态RAM芯片的如何进行读出和写入操作?
- 动态RAM为什么要刷新,刷新方法
(1) 静态RAM(SRAM)
① 基本存储单元电路
静态RAM采用双稳态触发器保存01,稳定性强
a. 结构
-
T1—T4的是4个触发器,就用来存储01
-
A是原端,A'是非端
-
T5 T6两个晶体管的打开由行地址选择控制
-
T7 T8两个晶体管的打开由列地址线的选择
T1 ~ T6是晶体管,这种也成为6管的静态RAM
b. 选择
-
行地址线控制T5 T6的选择,并且可以横向扩展
-
行地址线控制T7 T8的选择,并且可以纵向扩展
采用的是重合法的译码驱动方式
-
当行地址线都选择了这个存储单元的时候,这个存储单元被选中
c. 读写
-
当数据线选择之后,开关都打开了
-
如果要写:DIN进入,通过放大器和取反分别给A和A'的写
-
如果要读:A从DOUT出去了,但是A'也会输出,但是会被下面的截止
读操作 写操作
② 静态RAM芯片举例
a. Intel2114外特性
1K × 4位 = 4K存储单元,可以设计成 64 × 64 矩阵,注意,4位数据线,表示存储字长是4,意味着要同时选中4位存储单元
b. Intel 2114 RAM 矩阵 (64 × 64)
理论分析:
-
64 × 64 矩阵,这个是存储单元的矩阵,每个单元只保存1位,但是4位数据线
-
可以改成64 × (16 × 4)
横向6根地址线,译码后有64行
纵向4根抵制吸纳,译码后有16个,每个同时选中4个存储单元
实际结构如下
芯片结构分析
- 就和上面的理论一致,不过将纵向的分成了四组(因为有4位)
- 然后列地址译码能同时选中每一组的相同的列
操作图如下
读操作 | 写操作 |
---|---|
只分析读操作
- 行地址选中了第一行
- 列地址选中了每一组的第一列
- 然后4个存储单元都将数据通过右边的那根线传到了读写电路
写操作是两边都会写,与基本存储单元的读写一致
(2) 动态RAM(DRAM)
动态RAM采用电容来保存01
① 动态RAM基本单元电路
a. 结构
三管 | 单管 |
---|---|
-
三管:
-
Cg会存储信息
-
读选择线会打开T2,然后Cg输出
-
写选择线会打开T3,输入
-
基本单元仅仅包括读数据线,T4那边不包括了,因此是三管
三管的读写选择线是分开的,有两条
-
-
单管:
- 字线就是选择的
b. 读写
先看看晶体管的逻辑吧
- 如果1为高电平,那么2 3连通
- 如果1位低电平,2 3 不连通
三管
三管读操作
-
如果要读信号,先通过预充电信号,使得T4晶体管导通
-
VDD通过T4晶体管给读数据线充电,读数据线高电平,为1
-
如果是读信号,那么T2被导通,读数据线通过T2到达T1
-
如果Cg为1,那么T1导通,则读数据线与地相接,放电,读数据线低电平
如果Cg为0,那么T1不导通,则读数据线不会与地相接,读数据线保持高电平
Cg充电,表示数据为0;Cg不充电,表示数据为1
即读出与原存信息相反
三管写操作
-
写选择线为高电平,则T3导通
-
此时写数据线为1,那么Cg充电;如果写数据线为0,那么Cg放电
写入与输入信息相同
单管动态RAM
单管读数据:
- 字线高电平,T导通
- CS高电平,则数据线有电流,为1;反之无电流,为0
单管写信号:
- 写入时Cs充电为1,放电为0
② 动态RAM芯片举例
a. 三管动态RAM1103(1K × 1位)
芯片分析
- 每个单元电路都连接一条读选择线和写选择线
- 这个芯片是1K × 1位的芯片
- 刷新放大器:电容过一段时间可能漏电,因此要用刷新放大器进行重写
读操作 | 写操作 |
---|---|
b. 单管动态 RAM 4116 (16K × 1位)
结构
- 这个是16K,应该有14根地址线
- 但是4116只有7根地址线,因为它是分两次取址的
- 第一次取行地址,第二次取列地址
- 然后通过I/O缓存器尽心输入输出
- 芯片有自己的控制器,产生行时钟,列时钟,写时钟
这里的行与列颠倒过来了
读放大器
- 这是一个跷跷板电路
- 一端为1,另一端为0
读写
- 读原理
-
加入行选择先选择第63行
-
则63行的所有晶体管导通,所有的电容的电平都传到了横的数据线
-
列选择线选中第0列,那么第0列的晶体管导通
-
则交叉处的电容与I/O缓冲相连
-
假设电容充电,读放大器左侧为1,通过读放大器输出的就是0,即输出为0
反之,输出为1
输出的信息与电容是相反的
-
写原理
-
选择的原理一致
-
IO缓冲与电容相连,中间是读放大器
-
写信号为1,则电容不充电;写信号为0,电容充电
写入的信息与电容是相反的
读出与写入时候一致的,写入的是1,读出的是1,只是内部存储的电容是0
③ 动态RAM刷新
- 动态RAM是用电容的,容易漏电,保存的1会变成0,因此要进行刷新
- 刷新与行地址有关,每次会刷新一行所有的内容,而不会刷新一列的内容或者某一个存储单元的刷新
以下是刷新方式
以128 × 128 矩阵为例
我们假设
- 存取周期为0.5μs
- 刷新时间间隔为2ms,也就是动态RAM芯片的所有电容都要在2ms内刷新,
a. 集中刷新
将刷新时间集中到某一时间段
- 刷新时间间隔为2ms,不是指2ms全用来刷新了
- 一行的刷新时间等于存取周期
- 是指在这个周期内,前一部分全用来读写或者维持,后面腾出一部分时间,这一段时间不允许使用,称为死区,这一段时间全用来刷新,128行全部在这一段时间内刷新
死区为:0.5 μs ×128 = 64 μs
死时间率为 128/4000 ×100% = 3.2%
b. 分散刷新
- 也就是读写时间和刷新时间合道一块算一个周期
- 没有死区,因为读写周期是1μs,所有的时间都是读写周期
- 128μs就会刷新完全部的,但是2ms每行刷新15.6次左右,没必要刷新这么多
c. 分散刷新与集中刷新相结合(异步刷新)
分散刷新中2ms每行刷新15.6s,异步刷新就每15.6次刷新一次
对于 128 ×128 的存储芯片(存取周期为 0.5 μs ),若每隔 15.6 s 刷新一行
相对于一个15.6μs的时间段是集中刷新,相对于整个2ms是分散刷新
- 一行每隔 2 ms 刷新一次,2ms刷新完所有的行
- 注意,不一定要在最后才刷新,刷新时间可以放在15.6行的任意时间
- “死区” 为 0.5 μs
- 将刷新安排在CPU不访问存储器,比如指令译码阶段,不会出现 “死区”
(3) SRAM 与 DRAM 的比较
特点 | DRAM | SRAM |
---|---|---|
存储原理 | 电容 | 触发器 |
集成度 | 高(DRAM里面有1或3个晶体管以及电容) | 低(SRAM复杂,每个单元包含6个晶体管) |
芯片引脚 | 少(DRAM的行地址和列地址可以分别进行传送,地址线条数减少为一半) | 多(速度比较快,一般使用SRAM是要发挥速度优势,因此不会将地址分两次传送) |
芯片封装体积 | 小(芯片引脚少) | 大(芯片引脚多) |
功耗 | 小(只要对电容充放电) | 大(T1—T6在通电过程中,三个一直在导通,也就是一直在漏电) |
价格 | 低(结构简单) | 高 |
速度 | 慢(读写要对电容进行充放电) | 快 |
刷新 | 有 | 无 |
适用 | 主存(计算机内存条上放的就是DRAM) | 缓存(做Cache,价格贵,无法大规模使用) |
4.2.4. 只读存储器(ROM)
一般用于保存系统程序或系统配置程序
(1) 发展历程
ROM的发展历程可以很好的体现人类探索不断进步的过程
改进 | 特点 | 缺点 |
---|---|---|
早期 | 在厂家就写好了内容 | 用户无法配置自己的机器 |
改进1 | 用户可以自己写 | 只能写一次,一次性进行破坏性编程,一次写完就不能写了 |
改进2 | 可以多次写,要能对信息进行擦除 | 擦除设备单独买,不好擦除 |
改进3 | 电可擦写 | 需要特定设备 |
改进4 | 电可擦写 | 直接连接到计算机上 |
① 掩模 ROM ( MROM )
就是厂家写好内容,用户无法修改的
行列选择线交叉处有 MOS 管为“1”,行列选择线交叉处无 MOS 管为“0”
② PROM (一次性编程)
编程后有错误只能重新购买编写
③ EPROM (多次性编程 )
- 如果要重新编程的话,可以驱动浮动栅
- 浮动栅的驱动用紫外线照烧
- 芯片上面的石英窗口就是透过紫外线的
- 但是信息的擦除比较麻烦
④ EEPROM (多次性电可擦写编程 )
电可擦写,局部擦写,全部擦写
⑤ Flash Memory (闪速型存储器)
比 EEPROM快,具备RAM功能
4.2.5. 存储器与 CPU 的连接(重点)
- CPU需要的指令和数据都在主存储器中,因此必须有正确的连接
- 而且CPU的地址线是要比存储器多的,如何设置存储器也是问题
(1) 存储器容量的扩展
① 位扩展(增加存储字长)
用 ?个1K × 4位 存储芯片组成 1K × 8位 的存储器,以及用CPU的多少根线
- 用2个1K × 4位
- 地址线1K = 10条,数据线8位 = 8条
- 为两个芯片连接相同的片选信号,使其同时被选中
- 为两个芯片连接相同的地址线,使其相同地址的字被选中,两个芯片的字构成最终芯片的一个字
- 每个芯片的数据线都与CPU的四条数据线相连,总共连接CPU的8条数据线
- 控制信号也是相同的,因为读还是写是相同的
- 使用时,将两个芯片当做一个芯片,取一个字就是从两个芯片同时取一个字合起来
② 字扩展(增加存储字的数量)
用 ?个 1K × 8位 存储芯片组成 2K × 8位 的存储器
- 2片1K × 8位
- 11根地址线,8根数据线
地址线要一致,因为地址线是选择片内字的
数据线都连接CPU的8位数据线
片选信号不一样,因为两个芯片不是同时使用
片选信号也是CPU的地址信号产生的,比如A11作为片选信号 0xxxxx选择第一个芯片,1xxxxx选择第二个芯片
读写控制信号
也不一样,因为是分开操作的。一样,虽然分开操作,但是只操作被片选信号选中的,而且CPU也就只有一个读写信号
③ 字、位同时扩展
用?片 1K × 4位 存储芯片组成 4K × 8位 的存储器
- 用8片,很好计算
- CPU的12根地址线,8根数据线
- 8片中两两位级联,得到4片 1K×8位 的芯片,然后将4片进行字级联,得到最终的存储器
A11和A10产生片选信号
地址分配
组号 | 地址区间(A11A10 A9A8A7A6A5A4A3A2A1A0) |
---|---|
第一组 | 00 0000000000 ~ 00 1111111111 |
第二组 | 01 0000000000 ~ 01 1111111111 |
第三组 | 10 0000000000 ~ 10 1111111111 |
第四组 | 11 0000000000 ~ 11 1111111111 |
(2) 存储器与 CPU 的连接
注意点
连接 | 说明 |
---|---|
地址线的连接 | 就是CPU的地址线连接芯片的地址线 |
数据线的连接 | 同上 |
读/写命令线的连接 | CPU只有一个控制信号,但是注意连接ROM,ROM只可读 |
片选线的连接 | 这个是重点,如何生成片选信号,每次访问落在哪个地址区间以及哪几个芯片上 注意: 1. CPU访问的是存储器而不是IO,因此对存储器的访问信号要在片选信号中体现 2. CPU的地址线都要用到,有的作为芯片的内部地址信号,有的作为片选信号,保证CPU的访问地址都能有效落到芯片中,防止访问的时候在芯片中找不到 |
合理选择存储芯片 | 1. ROM和RAM要合理选择(保存系统程序和配置信息选择ROM,系统程序区域或者用户可读可写的区域用RAM) 2. 芯片的容量参数是不一样的,芯片数量尽可能少,片选逻辑尽可能简单 |
其他 | 时序、负载 |
例题
例题1
-
写出对应的二进制地址码
地址(写的时候建议每4位分开写) 区域 0110 0000 0000 0000 ~ 0110 0111 1111 1111 系统程序区 0110 1000 0000 0000 ~ 0110 1011 1111 1111 用户程序区 -
根据地址码得到芯片的容量
系统程序区有11位是 000 - 111,那么是2K
用户程序区有10位是 000 - 111,那么是1K
建议这样竖着写
CPU就是8位数据线,就是8位
确定芯片的数量及类型
区域 大小 芯片种类 芯片选择 系统程序区 2K×8位 ROM 1片 2K×8位 ROM 用户程序区 1K×8位 RAN 2片 1K×4位 RAM(位级联) -
分配地址线
-
确定片选信号
题中使用的是 38译码器,因此有3根输入,而A12A11不一样,用A13A12A11这三个正好做CBA,然后Y4选择ROM,Y5选择RAM
其余的A15A14也必须使用,可以作为使能端
MREQ一定不能忘,一定要使用,这个用来区别是对存储器操作还是IO操作(只有MREQ是低电平的时候是访问存储器)
答案如下
分析:
- 片选信号:
- A13A12A11作为CBA生成片选信号,A15A14虽然一样,但也要使用,作为使能端
- MREQ,这是区分CPU使用的是存储器还是IO的标志,低电平使用存储器,因此也要使用,作为译码器的使能端
- A10两个功能:
- 对于ROM,其是地址线,因此要连载ROM的地址线上
- 对于RAM,其没有意义,但是RAM对应的地址中,A10为0,因此要将其作为片选信号
- Y5与A10两个一起使用,作为RAM的片选信号,只有两个都为低电平时,RAM被选中
- 两个RAM的芯片是位扩展,片选信号要一致
- A9-A0,RAM和ROM都需要的地址线,每个芯片都需要连,中间的可以省略
- D7—D08根数据线
- 对于ROM,是8位的,有8根数据线,因此可以直接连上
- 对于RAM,是两个4位的,每个各有4根数据线,要将8根数据线分两段连在两个芯片上
- 读写控制信号:
- 对于ROM,只能读,不能写,因此其控制信号接地,就是那个PD信号
- RAM就直接接上WR
例题2
还是上面的例题
假设同前,要求最小 4K为系统程序区,相邻 8K为用户程序区。
注意CPU还是16根地址线,做题步骤同上
-
写出对应的二进制地址码
最小 4K为系统程序区:
- 最小:开始是从16个0开始的
- 4K:12个0到12个1,因为4K是12位,所以这么变化
RAM的同理
- CPU有16根地址线,先写出A15—A0在上面
- 然后写出系统程序区的地址
- 首地址是全0,然后4K是12位0变成1
- 用户程序区的地址
- 相邻:其首地址是 系统程序区 末地址+1,得到了
- 理应是8K的地址,但是没有8K的芯片,因此只能选择4K × 8位的芯片
- 然后写出地址,还是12个0变成1
- 再拿一个4K × 8位
- 首地址是上一个的末地址+1
- 末地址就是12个0变成1
- 芯片为啥都选成 8位,因为CPU的数据线是8位
-
确定芯片的数量及类型
图上已经确定了
- 1片4K×8位 ROM 作为 系统程序区
- 2片4K×8位 RAM 作为 用户程序区,这两片不是位级联,片选信号不一样
-
分配地址线
-
确定片选信号
A14A13A12是CBA,0连ROM, 1 2分别连两个RAM
-
确定片选逻辑
译码器的高电平,可以写个Vcc,也可以MREQ取反
步骤总结:
- 写出对应的二进制地址码
- 确定芯片的数量及类型
- 分配地址线
- 确定片选信号确定片选逻辑
4.2.6. 存储器的校验
-
为什么要对存储器的信息进行校验?
以电脑的内存为例,使用的是静态RAM,存储单元是4晶体管的触发器,所处的电磁环境比较复杂,或者在空间环境下收到带电粒子的打击,就可能造成电容的充放电或者触发器的翻转
如果不对信息进行校验的话,会导致程序错误
笔记本,手机等都采用了校验技术
(1) 合法代码集合
- 什么是合法代码是有准确的集合的
- 意思就是在这个集合里面的代码是合法的,不在这个里面的就是错误的
- 对于错误的代码
- 要检测出这是错误的代码
- 还要能根据合法代码集合进行纠错(也就是知道是哪几位出错了,进行取反纠错)
我们看看下面的例子
合法代码集合 | 错误代码 | 分析 | 结论 |
---|---|---|---|
100,110 | 无论什么代码,即使是错误的也是在集合中,无法检测出错误 | 检0位错、纠0位错 | |
100(实际上错了1位) | 可以确定这是出错了,并且1位错的可能性更大,但是无法纠错,因为000, 101, 110错1位都可能得到100 | 检1位错,纠0位错 | |
100(实际上原来是000,错了1位) | 可以检测出这是1位错,应该改成000 | ||
110(实际上原来是000,错了2位) | 认为是111 | 检1位错,纠1位错 | |
1000(原0000,错1位) | 可以检测出是0000,可以修改 | ||
1100(可以检测出来,但是无法纠错) | 无法检测了 | 检2位错,纠1位错 | |
11000(原00000,错2位) | 可知是00000 | ||
11100(原00000) | 会被认为是11111并纠错 | 检2位错,纠2位错 |
检错时,一般认为都只出一两位错
检m位错,纠n位错
检m位错,纠n位错:
这个几位错是只实际上有几位出错了
比如在{00000,11111}合法集合下,得到了11000,而实际上,这个是00000错误得到的,这个就叫做2位错
检2位错,纠2位错的意思是:可以检测出错误是两位错,可以纠正两位错的错误
(检m位错,不仅要检测出错误,还要能检测出是2位错,并且是正确的,但是检测不出来是哪几位出错,因此检测不代表就能纠错)
00000->11000这个两位错可以检测出来是两位错,并且纠正为00000,两位错可以纠正
00000->11100,这个是3位错,这个错误检测不出来是3位错,会认为是两位错,纠正为11111,即三位错无法纠正
00000->11110,这个是4位错,检测结果为1位错,检不出来
编码的检测能力和纠错能力和什么有关呢
分析
集合 | 一组变成另外一组需要改变几位代码 | 检错位数 | 纠错位数 |
---|---|---|---|
1 | 0 | 0 | |
2 | 1 | 0 | |
3 | 1 | 1 | |
4 | 2 | 1 | |
5 | 2 | 2 |
与 任意两组合法代码之间 二进制位 的 最少差异数 有关
(2) 编码的最小距离
任意两组合法代码之间 二进制位数 的 最少差异
① 最小距离与检错纠错能力的关系
最小距离与检错纠错能力的关系:
- L(length) —— 编码的最小距离
- D(detect) —— 检测错误的位数
- C(correct) —— 纠正错误的位数
如果要有1位纠错能力,至少编码长度得为3, 3-1 = 1 + 1
汉明码是具有一位纠错能力的编码
(3) 汉明码
① 检错原理
-
汉明码采用奇偶校验
在原来的代码基础上,添加一位校验位,校验位与代码的1加起来判断奇偶
-
汉明码采用分组校验
就是将源代码分组,然后每组设置一个校验位,一个校验位只检测改组的错误
上面的分组方式是划分分组,组与组之间没有重叠
-
汉明码采用非划分分组方式
② 划分方式
分成3组,每组有1位校验位, 共包括4位数据位
-
上面的为例,每个圈圈为一个组,一个组有4位数
-
这样的划分有个特点,就是每组独有的位数是2的幂次,1 2 4 8等
-
组之间重合了,有些位属于一个组,比如1 2 4,有些位属于多个组
-
每组各有一个独有的位,1 2 4,重合的部分是独有位的和
-
设含有1 2 4 的组为第一组,第二组,第三组,其校验位为 P1P2P3,0表示无错,则检错结果如下
P3P2P1 错误位 分析 0 0 0 无错 0 0 1 1 因为只有P1为1,说明1组独有的错了 0 1 0 2 只有P2为1 1 0 1 5 3 1组都错了,即重合位错了 1 1 0 6 1 1 1 7 三组都有错 -
巧妙的地方就是P3P2P1转为10进制就是出错的位数
校验位只对一组进行校验但是一个位可以属于多个组
③ 校验位的位置
-
因为校验位只对一组进行校验,因此只能是独有位作为校验位,独有位是2的幂次
-
即1 2 4 8 16位等作为校验位
④ 如何分组
就是某一位如何考虑分到第几组呢?比如说第5位,如何判断分到第二组和第三组呢?
组号 | 位的二进制特征 | 举例 | 校验位 |
---|---|---|---|
1 | XXXX1(二进制末尾是1的位) | 1(001) 3(011) 5(101) 7(111) | 1(001) |
2 | XXX1X | 2 3 6(110) 7(111) | 2(010) |
3 | XX1XX | 4 5 6 7 | 4(100) |
4 | X1XXX | ||
5 | 1XXXX |
- 对于5,二进制是101,第一位和第三位是1,那么就是1组合三组的
- 校验位是每组特有的,所以其他位是0,比如第一组,就是001,只有第一位是1,其余为0,即不是其他组的
⑤ 检测位的数目
检测位 就是分成几组
假设有n位信息位,k位检测位
-
可以表达的校验结果数目是2k
-
实际上可能出错的地方是 n(n位信息位中有错误) + k(k位检测位中有错) + 1(没有错),因此实际结果为
⑥ 检测位承担的小组
这个有技巧划分的
就是第几个检测位就直接话几行,中间隔着几位
例题类型一:求校验位
解决的问题
- 有几位检验位
- 检验位放在哪几位
- 求校验位是什么
例1
0101是信息位,n = 4,校验位是另外算的
-
计算校验位的个数
-
进行排序
-
计算校验位的值
C1同组的有1 3 5 7,其中5 7已经是1,偶数个1了,C1为0,
注意,Ci也是要加进组中的1的个数的,不要任务其是计算在外的
-
结果 0101 的汉明码为 0100101
例2
问:按配偶原则(偶校验)配置 0011 的汉明码
用异或的方式
例3:按配奇原则配置 0011 的汉明码
自己做
就是在得到Ci的时候取反,也可以使用同或
答案:配置的汉明码为 0101011
⑦ 汉明码的纠错过程
Ci仅仅是校验位,但是生成的是检测位是Pi
-
形成新的检测位 Pi,其位数与增添的检测位有关
-
如增添 3 位 (k = 3),新的检测位为 P4P2P1(直接出来 22, 21, 20)
-
以 k = 3 为例,Pi 的取值为
-
对于按 “偶校验” 配置的汉明码不出错时 P1= 0,P2 = 0,P4 = 0
例题类型二:汉明码校验
例1:已知接收到的汉明码为 0100111,(按配偶原则配置)试问要求传送的信息是什么?
例2:写出按偶校验配置的汉明码0101101 的纠错过程
第四位是校验位的位置,可以不去纠错
⑧ 最小汉明距离
最小汉明举例是3,因为汉明码的纠错位是1,那么根据L-1=D+C,可得,最小汉明距离是3
⑨ 奇偶校验的纠错区别
- 在配置的时候采用同或,或者异或结果取反得到Ci
- 但是纠错的时候方法一致,如果是P4P2P1= 100,那就是第四位出错了(应该是这样)
4.2.7. 提高访存速度的措施
提升存储器的带宽
(1) 概念:存储墙
存储墙
前面所说,85年到10年,采用了risk技术?CPU的速度每年提升52%,但是内存的速度是10年访问延迟才能减少一半,所以内存速度就为了瓶颈,这就叫做存储墙
常用的方法是
- 采用高速器件
- 采用层次结构 Cache –主存
- 调整主存结构
第3个是这节课的内容
(2) 调整主存结构的方式
我们假设
- 存储字长 = 指令字长,即一次取出或写入一条指令
- CPU的字长(数据线数)为16,存储器的字长为16
① 单体多字系统
顾名思义,一个存储体,一次多个机器字
工作原理:
- 设置存储体的长度为64位,大于CPU的16位
- 设置了一个数据寄存器,由4个单字长寄存器组成,还有一个单字长寄存区
- CPU每次访问存储体,都可以取出4个机器字(每一个都是一个长度为16的指令或者数据),放到数据寄存器中
- 下次再用的时候从数据寄存器中取出
优点:
- 增加存储器的带宽
缺点:
-
如果CPU要向存储器中写入16位的信息,要先写到单字长寄存器当中,再写到数据寄存器中,那么其余的48位也会被写入,这个可能是错误的
如果要解决这个问题,那么存储器要另添加硬件来解决,存储器结构复杂
-
如果要取出的数据不是连续的,那么也会一次性取出4个机器字,而这4个中只有1个是有效的,其他三个都是没用的
② 多体并行系统
- 这个的特点就是并行
- 多个存储器可以同时工作
a. 高位交叉(各个体并行工作)
分析
- 在编制的时候就将地址划分
- 比如现在有4个存储体,那么就前两位作为存储体的体号,后面的四位作为存储体内部查找的地址
缺点:
-
程序一般是连续存储的,假如一个程序全都存在了M0,那么在运行这个程序的时候,只有M0被访问,非常繁忙,其他三个存储器空闲
并行的优势没有发挥出来
这种方式与存储器容量的扩展一致,但也仅仅适用于此,不适用于存储器带宽的提升
b. 低位交叉(各个体轮流编址)
可以看到,编址的时候就是轮流的编址了
一个存储体在取数的过程中,CPU可以下达命令给另外一个存储体工作
这就是总线章讲过的,分离式通讯
特点:在不改变存取周期的前提下,增加存储器的带宽
- 可以看到,启动了存储体0后,存储体0在取数的过程中,又可以启动存储体1
- 一个单体访存周期可以访问四个存储体,而不是1个
设四体低位交叉存储器,存取周期为T,总线传输周期为τ,为实现流水线方式存取,应满足 T = 4τ。
连续读取 4 个字所需的时间为 T+(4 -1)τ
高位交叉用于存储器容量的扩展,低位交叉用于存储体带宽的增加和访问速度的提高
③ 高性能存储芯片
a. SDRAM (同步 DRAM)
- 一般DRAM都是采用异步方式的
- 同步方式要求CPU和存储体,在给定时间点必须完成操作
- CPU不需要等待,但是需要存储器速度很快
b. RDRAM
由 Rambus 开发,主要解决 存储器带宽 问题(自己查查),也是一个DRAM)
c. 带 Cache 的 DRAM
在 DRAM 的芯片内 集成 了一个由 SRAM 组成的 Cache ,有利于 猝发式读取
4.3 高速缓冲存储器(Cache)
4.3.1. 概述
(1) 为什么用Cache
-
CPU与存储器的速度差别很大
-
Cache是为了 避免 CPU “空等” 现象
-
程序访问的局部性原理
- 时间的局部性:当前执行的指令在不久的将来还会使用到
- 空间的局部性:当前正在使用的指令和数据在将来,相邻的指令和数据也会使用到
因此Cache和主存数据交换的单位是 “块”
这个块包含了正在使用的指令和数据,还包括相邻的指令和数据
块的大小要通过实验获得
(2) Cache的工作原理
① 主存和缓存的编址
-
主存和Cache都分成分成相同大小的块(就是上面所说的块),主存有M块,Cache有C块,C << M
-
CPU给出的地址可以分成两个部分
- 一部分是块内偏移地址,其位数决定了块的大小,比如一个块包含16个字节,那么块内偏移地址就是4位
- 另一部分就是块号
实际应用中,Cache地址应用并不大
-
块在内存和Cache传送是整体传送,块内的数据不会变化,因此内存与Cache的块内地址部分是完全相同的
-
Cache的标记 标记了主存快和Cache块的对应关系,就是对应的主存块的块号
② 命中与未命中
缓存共有 C 块,主存共有 M 块,M >> C,因此主存中不是所有块都在Cache中的
-
命中:主存块 调入 缓存,主存块与缓存块 建立 了对应关系
就是CPU在访存的时候,要的内容已经在Cache中了
-
未命中:主存块 未调入 缓存,主存块与缓存块 未建立 对应关系
-
用 标记记录 与某缓存块建立了对应关系的 主存块号
评价 主存-cache ,Cache的命中率是一个重要指标
③ Cache 的命中率
-
命中率:CPU 欲访问的信息在 Cache 中的 比率
-
命中率 与 Cache 的 容量 与 块长 有关,一般每块可取 4 ~ 8 个字
块太大的话,Cache的容量就比较小,一个块中的信息不一定全都要的
-
块长取一个存取周期内从主存调出的信息长度
块的大小和交叉关系(就是上面提到的提高存储体的访存效率的多体并行系统中的交叉)有直接关系,以下举例
存储体 交叉方式 块长 CRAY_1 16体交叉 块长取 16 个存储字 IBM 370/168 4体交叉 块长取 4 个存储字(64位×4 = 256位)
④ Cache –主存系统的效率
效率 e 与 命中率 有关
设
- Cache 命中率 为 h
- 访问 Cache 的时间为 tc
- 访问 主存 的时间为 tm
则
- 最大值,命中率为1,e = 1
- 最小值,命中率为0,e = tc/tm
这个公式有个前提,就是Cache是同时访问的
如果先访问Cache,再访问主存,那么公式结果为
- 最大值:h = 1, 结果是 e = 1
- 最小值:h = 0,结果是 e = tc/(tm + tc)
(3) Cache 的基本结构及使用流程
将主存和CPU给画出来了,红色部分就是Cache的部分
大致说一下流程
-
CPU通过地址总线发出地址
-
地址分为两部分,块号和块内地址
由于主存和Cache块内的部分完全一致,因此块内地址可以直接作为Cache地址的块内地址
而块号要交给
主存Cache地址映射变换机构
-
机构的变换功能将主存块号转换为Cache块号,同时检测出是否命中
如果命中,将主存块号对应的Cache块号送给Cache地址,从Cache存储体中找出数据,通过数据总线传给CPU
-
如果未命中,也就是要取的数据不在Cache中,看是否可装进,也就是Cache中是否还有空间能够装入块
-
如果有空间,访问主存装入Cache
-
如果没有,启用
Cache替换机构
,根据替换算法,将要替换的块写入主存或者消去,并且访问主存替换Cache
主存Cache地址映射变换机构:
地址映射:主存中的块号与Cache块号的映射
变换:把主存的块号转换成响应的Cache的地址
主存和Cache之间有信息通路:
- 通过这个通路实现主存和Cache之间的信息交换
有些计算机发生了无命中,先将主存中的数据通过数据总线 传给CPU,同时传给Cache
(4) Cache的读写操作
① 读操作
Cache满并不是说Cache真的满了,而是指允许内存放的块是否真的满了
② 写操作
写操作中要解决Cache和主存的一致性问题
Cache中的数据和主存中的数据一致,如果一个数据只在Cache中写了而不在主存中写,就会造成数据不一致
a. 写直达法
- 写操作时数据既写入Cache又写入主存
- 写操作时间就是访问主存的时间
- Cache块退出时,不需要对主存执行写操作,更新策略比较容易实现
优点:
- 时刻保持Cache和主存的信息一致
缺点:
-
可能导致对一块内存重复的写
比如计算累加求和,会对一个区域反复的写,导致内存和Cache的交换频繁
b. 写回法
- 写操作时只把数据写入 Cache 而不写入主存
- 写操作时间就是访问 Cache 的时间
- 当 Cache 数据被替换出去时才写回主存
缺点:
-
增加了 Cache 的复杂性
-
保证不了Cache和主存的复杂性
-
多处理器,每个处理器都有一个Cache,内存的块在各个处理器Cache之间都有一个副本,这几个Cache的一致性有问题
这个也是一个并行体系结构的研究领域
(5) Cache的改进
-
增加Cache的级数
- 片载(片内)Cache,就是在处理器内部加两级Cache
- 片外 Cache,即处理器外部也有一个Cache
现在的多处理器结构,内部有两个Cache,外部一个大容量的公用的Cache,至少有三级Cache
-
统一缓存和分立缓存
在冯诺依曼结构中,指令和数据在存储器中地位一致,一起存储的
但是有的时候需要分开,与指令执行的控制方式有关,比如是否流水
分为指令 Cache 和 数据 Cache
下面是几个例子
处理器 指令Cache 数据Cache Pentium 8K 指令 Cache 8K 数据 Cache PowerPC620 32K 指令 Cache 32K 数据 Cache
4.3.2. Cache-主存的地址映射
前面说过,Cache满并不是说Cache真的满了,而是指允许内存放的块是否真的满了
就是因为这个,Cache和主存的地址映射是有规则的
实际上Cache的存储体是一致的,实现映射改变的是 主存Cache地址映射变换机构
(1) 直接映射
主存中的块只能装到预先指定Cache块中
分析:
-
主存根据Cache存储体的总大小划分成若干个区
每个区的大小和Cache存储体的大小相等,区中的字块数和Cache的字块数一致
每个区的字块编号都可以从0开始,编号到2c - 1,任何一个区的第m块只能放到Cache存储体的第m块
-
CPU给出的 主存地址 可以分成三份
- 主存字块标记:也就是主存的区号,这个也用Cache存储体的标记来表示
- Cache字块地址:就是Cache的块号,同时主存区内块的编号,两个是一致的
- 字块内地址:就是块内的地址
-
访问Cache的时候
主存块标记与Cache的标记位比较,Cache字块地址去查询Cache那块中是否有数据
从而得到是否命中
每个缓存块 i 可以和 若干 个 主存块 对应,每个主存块 j 只能和 一 个 缓存块 对应
优点:
- 可以通过Cache字块地址直接找到Cache对应的字块,不需要映射
- 结构简单
缺点:
-
Cache的利用率低,冲突率高
举一个例子,执行Cache中字块0的指令,Cache的其余字块全部为空,要跳转到主存储体第二个区的第0块,这个时候尽管Cache有很多空,但也只能让字块0让出来
(2) 全相联映射
主存 中的 任一块 可以映射到 缓存 中的 任一块
优点:
- Cache的利用率高了(主存中任何一个块可以放到Cache的任何一个地址)
缺点:
- Cache的标记位和块号要组合起来,主存地址的主存字块标记要与标记位和块号同时比较,比较速度慢
- 比较位数增多,比较器的位数也增多
(3) 组相联映射
这是前两种映射的折中
-
先把Cache分成块,然后将这些块进行分组,一组中有若干个(2, 4, 8, 16)块(这个成为路数,即组中的块数),图中一个组有两块,总共有2c-r个组
主存储器也分区,每个区的大小和组数是相同的
Cache有多少个组,主存储器一个区就有多少个块,标号就是0~2c-r-1,与组号相同
-
主存中的块,其在区里面的编号就是其在Cache中的组号,这个块可以在这个组的任意一块
-
CPU在查找的过程中,只需要知道 这个块在主存中某个区的编号,不需要知道是哪个区,然后这个编号就是组号
比较的时候,就是比较组中的标记以及块号,不需要和Cache中的每个块进行比较
图中的组地址就是 主存中块在区的编号
某一主存块 j 按模 Q(Cache组数) 映射到 缓存 的第 i 组中的 任一块
- 直接映射:一个块只能放到给定的组中
- 全相联映射:这个块可以放到这个组的任意一块
组相连映射中,将所有的块分到一组,就变成了直接映射;将一个块分到一组,就成为了全相联映射
优点:
- 结构比直接映射复杂,但是可以接受
- 速度比全相联映射块
- Cache利用率也比较高
所以这是常用的方法
(4) 比较
特点
连接方式 | 特点 | 优势 |
---|---|---|
直接 | 某一 主存块 只能固定 映射到 某一 缓存块 | 不灵活,利用率低,速度快 |
全相联 | 某一 主存块 能 映射到 任一 缓存块 | 成本高,速度慢,利用率高 |
组相联 | 某一 主存块 只能 映射到 某一 缓存 组 中的 任一块 | 折中 |
三个方法都有用到,但是用途不一致
用途 | 需求 | 选择 |
---|---|---|
靠近CPU的Cache | 高速 | 直接相连 或者 路数比较少(一个组含有块数比较少)的组相连 |
中间的Cache | 需求折中 | 组相连 |
离CPU越远的Cache | 速度要求小,利用率要求高 | 全映射相连 |
4.3.3. 替换算法
应用替换算法的是Cache替换机构
当Cache中没有位置可以装内存块,必须有一个块替换出来
-
先进先出 ( FIFO )算法,最先放入的块出来
问题:有些东西可能需要一直常用
-
近期最少使用( LRU)算法
替换出的块是近期使用少的
4.4 辅助存储器(不重要)
4.4.1. 概述
-
特点:不直接与CPU交换信息
必须传输到主存才能传输到CPU中
磁表面存储器-技术指标
最常用的就是磁表面存储器,其技术指标如下
-
记录密度
-
道密度Dt:磁盘中磁道的密度
-
位密度Db:单位长度的磁道保存的二进制信息
每个磁道都是同心圆,越往外,位密度越低
-
-
存储容量 C = n × k × s
n:盘面个数,k:磁道个数,s:每个磁道的信息量
-
平均寻址时间
硬盘或者软盘的时间:寻道时间 + 等待时间
- 寻道时间:读写头(磁头)在磁盘表面移动找到指定的磁道的时间
- 等待时间:读写头停止,磁盘旋转,等待指定的扇区旋转到磁头下面的时间
-
数据传输(速)率:Dr = Db × V
-
Db:位密度
-
V:磁盘旋转速度
传输率指的就是磁头指到扇区上,扇区旋转到磁头离开的那个过程中,数据传输的速率
-
-
误码率:出错信息位数与读出信息的总位数之比
4.4.2. 磁记录原理和记录方式
记录方式(略)
这部分没讲,老师让自己看
磁记录读写原理
写:使用了电生磁效应
原理:写线圈通上不同方向的电流,会在下面生成不同方向的磁场,最终磁化磁层,磁化的方向不同,保存的数据也不同
读:使用了 磁生电 的原理
- 就是磁芯会运动,然后切割磁感线,产生不同方向的电流,表示不同的信息
4.4.3. 硬磁盘存储器
(1) 分类
-
根据磁头是否固定:
-
固定磁头:磁盘旋转不平移,每个磁道有一个磁头,磁头不需要移动,只需等待扇区旋转到磁头底下
特点:速度快,但是结构复杂
-
移动磁头:磁头可以径向移动,磁盘旋转
-
-
硬盘盘片是否可换
- 可换盘
- 固定盘:现在多用,因为盘片从硬盘驱动器取出后,站上灰尘,盘片会报废
(2) 结构
- 磁盘控制器是主机和驱动器之间的接口
- 磁盘驱动器控制 磁盘的旋转,磁头的移动,数据的读写
① 磁盘驱动器
这里只讲解定位驱动
- 多个
磁盘
组成磁盘组
,有共同的主轴
主轴
底部由传动机构
,传动机构
带动主轴
,带动磁盘
组旋转磁盘
旋转的时候,磁头
悬浮在磁盘表面磁头
可以沿着磁盘
径向移动,这个移动由小车
的移动推动小车
由音圈电机
控制磁盘控制器
送来目标磁道的信号,表示磁头
要移动到哪个磁道
- 根据
磁道
的信息,由音圈电机
控制磁头移动 - 这个移动很精确,音圈电机还会测量小车移动的速度,送回到控制端
- 形成一个有反馈的闭环自动控制系统
数据控制完成数据的转换和读写控制,图中未写出
② 磁盘控制器
- 接收主机发来的命令,转换成磁盘驱动器的控制命令
- 实现 主机和驱动器之间的数据格式转换
- 控制磁盘驱动器读写
主机与磁盘驱动器之间的 接口
-
对主机 通过总线
辅存就是外部存储器,不在主机体系内,我们所说的C盘,D盘就是硬盘
-
对磁盘(设备)
③ 盘片(材质)
由硬质铝合金
材料制成
4.4.4. 软磁盘存储器
软盘现在已经淘汰了,因为软磁盘比较容易损坏,市场上也看不到软盘了
(1) 软盘 vs 硬盘
指标 | 硬盘 | 软盘 |
---|---|---|
速度 | 高 | 低 |
磁头 | 固定/活动 | 活动 |
浮动(磁盘和磁头之间有高速空气流隔开) | 接触盘片 | |
盘片 | 固定盘、盘组大部分不可换 | 可换盘片 |
价格 | 高 | 低 |
环境 | 苛刻(盘片上落一粒灰尘都可能让磁头损坏) |
(2) 软盘片(图)
聚脂薄膜就是一种塑料
4.4.5. 光盘存储器
(1) 概述
-
采用光存储技术,利用激光写入和读出
-
现有两代存储技术
代数 介质 可否擦写 第一代光存储技术 采用非磁性介质 不可擦写 第二代光存储技术 采用磁性介质 可擦写
(2) 光盘的存储原理
- 只读型和只写一次型:热作用(激光对盘的表面进行烧灼)(物理或化学变化)
- 可擦写光盘:热磁效应