计组学习笔记之存储系统
1 主存简单模型
1.1 主存逻辑模型
-
地址寄存器:接收外部部件传输到主存中的具体地址
-
存储体:存储具体的二进制位
-
数据寄存器:暂存输入/输出的数据信号
-
时序控制逻辑单元:协调地址寄存器、存储体和数据寄存器三者的相互配合
1.2 主存的物理模型
-
控制电路:控制译码器、地址寄存器、数据线等元器件之间的协调工作
- 片选线:整个控制电路芯片的开关,有两种模式:高/低电频有效
- 读控制线:决定本次操作是否是读取操作
- 写控制线:决定本次操作是否是写入操作
-
地址线:一般对应于存储单元的个数,n 根地址线对应 个存储单元
-
数据线:一般对应于数据线的根数,n 根数据线对应 n 位存储字长
-
总容量 = 存储单元个数 * 存储字长(例:8K * 8 位:即 ,13 根地址线,8 根数据线,则总容量为 8KB)
-
2 寻址
假设主存的总容量为 1KB,则:
-
按字节寻址:每个单元 1B,共有 1K 个单元,那么地址线根数为 根
-
按字寻址:每个单元 4B,共有 256 个单元,那么地址线根数为 根
-
按半字寻址:每个单元 2B,共有 512 个单元,那么地址线根数为 根
-
按双字寻址:每个单元 8B,共有 128 个单元,那么地址线根数为 根
-
多字节存放
-
大端模式:数据的最高有效字节存放在内存的低地址
-
小端模式:数据的最高有效字节存放在内存的高地址
-
3 存储器
3.1 基本结构
- 存储矩阵:由大量相同的位存储单元阵列构成
- 译码驱动:将来自地址总线的地址信号翻译成对应存储单元的选通信号,该信号在读写电路的配合下完成对被选中单元的读/写操作
- 读写电路:包括读出放大器和写入电路,用来完成读/写操作
- 读/写控制线:决定芯片进行读/写操作
- 片选线:确定哪个存储芯片被选中。可用于容量扩充
- 地址线:是单向输入的,其位数与存储字的个数有关
- 数据线:是双向的,其位数与读出或写入的数据位数有关,数据线数和地址线数共同反映存储芯片容量的大小
3.2 半导体随机存取存储器(RAM)
特点 / 类型 | SRAM(静态) | DRAM(动态) |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读写 | 非 | 是 |
需要刷新 | 不要 | 需要 |
送行列地址 | 同事送 | 分两次送 |
运行速度 | 快 | 慢 |
集成度 | 低 | 高 |
发热量 | 大 | 小 |
存储成本 | 高 | 低 |
作用 | Cache | 主存 |
-
存储信息(都只存储 0、1 两种信息)
- SRAM:有两种稳定的状态,触发器可以稳定的保持某种状态
- DRAM:电容存放时,需要不停的进行充放电
- 共同点:都属于易失性存储器,断电就会丢失信息
-
破坏性读出
- SRAM:读时查看触发器状态;写时改变触发器状态
- DRAM:读时连接电容,检测电流状态;写时要给电容充放电
-
是否要刷新
- SRAM:能稳定地保持两种状态,不需要刷新,只需改变触发器状态即可
- DRAM:电容上的电荷只能保持 2ms 左右,因此每隔 2ms 就要重复刷新依次
-
送行列地址
- SRAM:先分列,再分行,每行地址可能长度不一,需要将整个地址同时放到地址线上
- DRAM:先送进去行地址,再送进去列地址,然后根据行列地址来确定具体位置,需要分两次来送,因此地址线可以实现服用,线数可以少一半
-
运行速度
- SRAM:稳定的状态,不需要重复刷新和充放电,因此速度较快
- DRAM:需要不断的充放电,重复刷新,因此速度较慢
-
集成度、发热量、存储成本
- SRAM:由 6 个逻辑元件构成,因此运行时发热量大,制造成本也较高
- DRAM:由 1 或 3 个逻辑元件构成,因此运行时发热量第,制造成本也较低
3.3 DRAM 的刷新
假设:DRAM 内部结构排列成 128 * 128 的形式,存取周期(读写周期)为 ,则 内共有 个周期,则:
-
刷新周期:一般为 2ms
-
刷新数量:以行为单位,每次刷新一行存储单元
-
为什么要用行列地址:可以减少选通线的数量
-
刷新方式:有硬件支持,读出一行的信息后重新写入,占用一个存取周期
-
刷新时间
-
分散刷新:每次读写结束都刷新一行,导致系统的读写周期增加
-
集中刷新:一个刷新周期中,集中安排时间进行刷新,此时无法访问存储器,称为访存“死区”
-
异步刷新:一个刷新周期中,值安排一次刷新,则每个刷新周期会有一段时间的“死时间”
-
3.4 SRAM 的读写周期
-
存取周期构成:存取时间 + 恢复时间
-
读周期
-
写周期
3.5 半导体只读存储器(ROM)
- 掩膜式只读存储器(MROM):存储内容由半导体制造厂家按照用户的要求直接在芯片生产过程中写入,无法修改
- 一次可编程制度存储器(PROM):存储内容由用户使用专门的设备(编程器)一次性写入,无法修改
- 可擦除可编程只读存储器(EPROM):修改次数有限,写入时间很长
- 紫外线擦除(UVEPROM)
- 电擦除(EEPROM)
- 闪速存储器(Flash Memory):如 U 盘等,写入速度较快
- 固态硬盘(Soild State Drives):控制单元 + FLASH 芯片
3.6 存储器的分类
-
按照作用分类
- 主存储器(主存、内存),使用 DRAM 和 ROM
- 高速缓冲存储器(Cache),使用 SRAM
- 辅助存储器(外存、辅存)
-
按照信息可保存性分类
- 断电后信息是否消失
- 易失性:RAM
- 非易失性
- 读出是否破坏信息
- 破坏性读出:DRAM
- 非破坏性读出
- 断电后信息是否消失
-
按照存储介质分类
- 磁芯存储器
- 磁表面存储器(磁盘、磁带)
- 半导体存储器
- 光存储器(光盘)
-
按照存取方式分类
- 随机存取
- DRAM、SRAM
- ROM
- 串行访问
- 顺序存储:磁带
- 直接存取:磁盘
- 随机存取
3.7 存储器的性能指标
- 存储容量:存储字数 * 字长(如 1M×8位)
- 单位成本:每位价格 = 总成本 / 总容量
- 存储速度:数据传输率 = 数据的宽度 / 存储周期
- 存取时间():存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间
- 存取周期():存取周期又称为读写周期或访问周期。它是指存储器进行次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔
- 主存带宽():主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒()或位/秒()
3.8 存储器的层次化结构
4 主存与 CPU 的连接
4.1 主存容量扩展
-
位扩展:将新的存储器芯片,地址线、数据线、读写控制线并行的与 CPU 的地址线、数据线、读写控制线分别相连
-
字扩展
-
线选法
- 原理:将新的存储器芯片,地址线、数据线、读写控制线并行的与 CPU 的地址线、数据线、读写控制线分别相连,然后再从 CPU 的空闲地址线中分别连出 n 条地址线到 n 个存储器芯片中,来分别控制扩展的存储器芯片
- n 条地址线,只能对应 n 个选片信号
-
译码片选法
- 原理:将新的存储器芯片,地址线、数据线、读写控制线并行的与 CPU 的地址线、数据线、读写控制线分别相连,然后从 CPU 的空闲地址线中连出一条地址线到两个存储器芯片中,其中一条加上一个非门逻辑电路
- n 条地址线,可以对应 个选片信号
-
使用译码器实现字扩展
-
原理:当输入端输入的二进制数对应的时信号输出端的下标为 的芯片时,芯片 才会工作,其他状态下均不工作
-
高电平有效:对应的下标为 1 时,才会工作
-
低电平有效:对应的下标为 0 时,才会工作
-
连接方法:CPU 低位的地址线直接连接到各个芯片,数据线、读写控制线也依次和 CPU 的数据线、读写控制线相连接,然后使用 CPU 空闲的 n 根地址线与译码器的输入端连接,就可以同时控制 中芯片信号
-
-
线选法 | 译码片选法 |
---|---|
n 条线对应 n 个选片信号 | n 条线对应 个选片信号 |
电路简单 | 电路复杂 |
地址空间不连续 | 地址空间可连续,可以增加逻辑设计 |
-
字位同时扩展
-
原理:将多个芯片作为一个小组,将多个小组的数据线分别依次连接到 CPU 的数据线上,先完成位的扩展;然后使用译码器连接 CPU 空闲地址线,实现不同芯片的选片,实现字的扩展
-
4.2 主存扩展例题
【例】设 有 16 根地址线,8 根数据线,并用 作为访存控制信号(低电平有效),用 作为读 / 写控制信号(高电平为读,低电平为写)。现有下列存储芯片:, ,, ,, 及 译码器和各种门电路。画出 与存储器的连接图,要求:
1)主存地址分配: 为系统程序区, 为用户程序区
2)合理选用上述存储芯片,说明各选几片?
3)详细画出存储芯片的片选逻辑图
-
确认地址线、数据线、选择存储芯片(系统程序区用 ROM,用户程序区用 RAM)
-
设计图
5 双端口 RAM
两个端口对同一主存操作有以下 4 种情况
- 两个端口不同时对同一地址单元存取数据
- 两个端口同时对同一地址单元读出数据
- 两个端口同时对同一地址单元写入数据(会发生写入错误)
- 两个端口同时对同一地址单元,一个写入数据,另一个读出数据(会发生读出错误)
针对以上可能出错的地方,可以用加“忙”线来解决
- 置“忙”信号为 0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问
6 多模块存储器
-
单体多字存储器
-
每个存储单元存储 m 个字,总线宽度也为 m 个字,一次并行读出 m 个字
-
缺点:指令和数据在主存内必须是连续存放的
-
-
多体并行存储器
-
每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器
-
它们既能并行工作,又能交又工作
-
-
高位交叉编址 VS 低位交叉编址
-
内存访问一般都是连续的内存,因此可以看出,低位交叉编址耗时较短,类似于“流水线”过程
-
7 高速缓冲存储器
7.1 局部性原理
- 空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的
- 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息
工作原理:
7.2 性能分析
- 命中率(H): 欲访问的信息已在 中的比率
- 设一个程序执行期间, 的总命中次数为 ,访问主存的次数为 ,则命中率为:
- 缺失率(M): 欲访问的信息不在 中的比率,
- 设 为命中时的 访问时间, 为未命中时的访问时间,则主系统的平均访问时间
【例】假设 的速度是主存的 5 倍,且 的命中率为 ,则采用 后存储器性能提高多少(设 命中则中断访问主存)?
-
若 和主存同时被访问
-
若先访问 再访问主存
7.3 Cache 地址映射
-
全相联映射:主存字块标记 + 字块内地址
-
直接映射:主存字块标记 + Cache 字块地址 + 字块内地止
-
组相连映射:按号分组,组内随意放,主存字块标记 + 组地址 + 字块内地址
-
三种映射方式逻辑图
7.4 Cache 替换算法
- 随机算法( ):随机地确定替换的 块。它的实现比较简单,但没有依据程序访问的局部性原理,故可能命中率较低
- 先进先出算法():选择最早调入的行进行替换。它比较容易实现,但也没有依据程序访问的局部性原理,可能会把一些需要经常使用的程序块(如循环程序)也作为最早进入 的块替换掉
- 近期最少使用算法():依据程序访问的局部性原理选择近期内长久未访问过的存储行作为替换的行,平均命中率要比 要高,是堆栈类算法
- 算法对每行设置一个计数器, 每命中一次,命中行计数器清零,而其他各行计数器均加 1,需要替换时比较各特定行的计数值,将计数值最大的行换出
- 最不经常使用算法():将一段时间内被访问次数最少的存储行换出。每行也设置一个计数器,新行建立后从 0 开始计数,每访问一次,被访问的行计数器加 1,需要替换时比较各特定行的计数值,将计数值最小的行换出
7.7 写策略
-
命中时的写策略
- 写回法 :当 对 写命中时,只修改 的内容,而不立即写入主存,只有当此块被换出时才写回主存
- 全写法(直写法):当 对 写命中时,必须把数据同时写入 和主存,一般使用写缓冲
-
未命中时的写策略
- 写分配法:把主存中的块调入 Cache ,在 Cache 中修改,搭配写回法使用
- 非写分配法:值写入主存,不调入 Cache,搭配全写法使用
-
小结
-
写回法 + 写分配法:可以减少访存次数,需要使用一个脏位来控制一致性的实现
-
全写法 + 非写分配法:有一个写缓冲,很好地保持了一致性,但是可能会溢出
-
多级 Cache
-
7.8 替换算法例题
【例】设主存地址的空间大小为 1KB,按字节编址,Cache 由 8 个块组成,每个 Cache 块的大小为 16B,CPU 依次访问以下地址:0001001110、1001110010、0001001111、0011000010、0101001000、1011110010、1111010000、0011001001(十进制分别为 78、626、79、194、328、754、976、201),求:
-
假设地址映射方式为全相连映射,采用 FIFO、LRU、LFU 替换算法时,分别求 Cache 的命中次数
-
假设地址映射方式为直接映射,求 Cache 的命中次数
-
假设地址映射方式为二路组相连映射,采用 FIFO、LRU、LFU 替换算法时,分别求 Cache 的命中次数
-
假设配置同上,采用写回法和直写法时,Cache 的总容量分别为多少
8 虚拟存储器
8.1 定义
- 定义:虚拟存储器是一个逻辑模型
- 功能:用户给出一个地址,叫做虚地址或者逻辑地址,虚拟存储器要给改地址相对应的数据
- 实现:由辅助硬件将虚地址映射到主存当中的某个单元中,主存单元地址称为实地址或者物理地址
8.2 分类
-
页式虚拟存储器
- 虚拟空间与主存空间都被划分为同样大小的页,主存的页称为实页,虚存的页称为虚页
-
段式虛拟存储器
-
中的段是按程序的逻辑结构划分的,各个段的长度因程序而异
-
虚拟地址分为两部分:段号和段内地址
-
段表:每一行记录了与某个段对应的段号、装入位、段起点和段长等信息
-
由于段的长度可变,所以段表中要给出各段的起始地址与段的长度
-
-
段页式虚拟存储器
- 把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,
程序对主存的调入、调出仍以页为基本传送单位每个程序对应一个段表,每段对应一个页表 - 虚拟地址:段号 + 段内页号 + 页内地址
- 把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,
8.3 快表 TLB
-
页表、段表存放在主存中,收到虚拟地址后要先访问主存,査询页表、段表,进行虚实地址转换
-
放在主存中的页表称为慢表( )
-
提高变换速度 用高速缓冲存储器存放常用的页表项快表( )
-
访问过程
9 总结
-
思维导图总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!