存储系统

[TOC]

一 存储器概述

1.1 存储器的分类

1. 按照存储介质分类

(1) 磁存储器

(2) 半导体存储器

(3) 光存储器

2. 按照存取方式分类

(1) 随机存储器(RAM)

可以按照地址随机读写数据存储单元

(2) 顺序存储器(SAM)

存储单元中的内容只能按照顺序进行访问,访问的时间和地址有关

3. 按照信息的可改写性分类

既可以读也可以写的被称为是读写存储器,否则被称为是只读或者是只写寄存器。

4. 按照信息的可保存性分类

存储器可以被分为易丢失和不易丢失,易丢失指的是当断电后保存的信息会丢失

5. 按照功能和读写的速度进行分类

  • 寄存器存储器
  • 高速缓冲存储器
  • 主存储器
  • 外存储器

1.2 存储器的技术指标

  1. 存储容量, 存储器可以存储的二进制信息总量称为是存储容量
  2. 存储速度

1.3 存储器层次结构

按照我们之前存储方式设置的存储顺序进行排列

1.4 主存的基本结构

地址译码器接收到来自CPU的n位地址信号,通过译码器翻译为对应的地址,选择对应的单元,输出m组数据

1.5 主存中数据的存放

1. 存储字长和数据字长

存储字长指的是主存中一个存储单元所能存储的二进制位数

数据字长指的是计算机一次能处理的二进制的位数

2. 地址访问模式

按照访问的单元大小可以被分为是字节地址, 半字地址,字地址

字节地址逻辑右移可以得到半字地址, 右移两位可以得到字地址。

3. 大端和小端方式

大端存储:指的是存储器的低字节单元存放的是数据中的最高字节

小端存储:指的是存储的低字节单元存放的是数据中的最低字节

4. 数据的对齐

对于数据的存储方式可以选择直接存放进去,也可以选择进行对齐的存放。

二. 半导体存储器

存储单元是存储器中最小的存储单元。

2.1 静态MOS存储器

  1. 静态MOS存储单元

  2. 存储单元拓展

  3. 静态MOS存储器的结构

    使用x, y两边进行译码,每一边都有 2n/22^{n/2}

三 主存的组织和CPU的连接

1. 存储器和CPU的连接

2. 存储器的拓展

  1. 位拓展,就是从不同的存储器中输出不同的数据位,将所有的数据位组成一个整体的数据位!

  2. 字拓展,也被称为是容量拓展和地址总线拓展,将数据位数相同的几个RAM并联在一起,使用一个3-8译码器进行数据的选择。

四 并行主存系统

  1. 高位交叉方式下的数据组织,相邻地址的数据在同一个存储体中,不同存储体中的地址不相邻
  2. 低位交叉方式中的数据组织,相邻地址处于不同的存储体中,每个存储体均需要地址寄存器

五 高速缓冲存储器

1. cache 工作原理

SRAM相对于DRAM的储存速度更快,但是容量有限, 通常在cpu和主存之间加上一个小容量的快速SRAM,称为cache

2. 程序局部性

指的是程序在执行中呈现出的局部性规律。在一段时间内,只执行程序的一部分,如同我们的jupyter notebook一样,所执行的指令和数据也只局限在某个区域中。

3. cache的基本概念

首先在cache中查找数据,如果查找不到数据,那么从主存中进行读取,加入到我们的cache中。将命中所需要的时间称为是tct_c, 将从主存中进行加载的时间设置为tmt_m, 假设命中的次数为NcN_c, 从主存中加载的次数为 NmN_m

h=NcNc+Nmh = \frac{N_c}{N_c + N_m}

总体的加载时间为

ta=htc+(1h)tmt_a = ht_c + (1-h)t_m

e=tctae = \frac{t_c}{t_a} 称为访问的效率

r=tmtcr = \frac{t_m}{t_c}

e=tcta=tchtc+(1h)tm=1h+(1h)re = \frac{t_c}{t_a} = \frac{t_c}{ht_c + (1-h)t_m} = \frac{1}{h + (1-h)r}

r的值一般为5-10,h 越大程序的访问效率越高

4. cache的读写

tag用来判断当前的数据是否在cache中,index表示在cache中的哪个位置
cache被分为四个部分

  • tag 从主存中剥离出来
  • data 表示从主存中交换的数据
  • vaild表示数据是否有效
  • dirty表示主存中
  • 的数据是否是最新的n

例子:

某计算机的字长为32位,已知主存的容量为4MB,按字节编码,cache使用直接相联映射,cache数据体容量为4KB,cache块·长度为8个字。

一个cache块的长度为8*32 = 32B, 所以w = 5, 4x1024/32 = 32x4 = 128 ,所以一共有128行,r = 7, 访问4MB的空间需要22位地址线,所以此时tag =22 - 5 - 7 = 10

4.1 读操作

首先在cache中进行查找,如果查找不到则在主存中进行查找,将数据的副本读入到我们的cache中,在载入的过程中还需要进行数据的替换等操作。

4.2 写操作

1
2
3
4
5
写入 --> 不在cache中 --> 写入主存 -->分配cache --> 可能进行数据的替换
| |-->不分配cache
|-->在cache中 --> 写回
|--> 不写回 --> 速度更快

4.3 cache的关键技术

  1. 数据查找
  2. 地址映射
  3. 替换策略
  4. 写入策略

5 相联存储器

相联存储器被称为是RAM,实现的是key和value的映射

6. 地址映射

1.全相联映射

在全相联映射下,主存中的每一个数据块都可以被放入cache中的任意数据块中,主存地址被分为tag offset 两个部分,通过tag来查找是存储在cache中的哪一行,通过offset来查找是在哪个字节位。

2. 直接相联映射

每个固定的主存地址只能映射到cache中的某一行

行号 = (主存块号)%(cache行数)

3. 组相联映射

组相联映射将我们的cache分为固定大小的组,每个组中有k行,称为k-路组相联,

cache组号 = (主存区号)mod (cache组号)

7 替换算法

  1. 先进先出算法
  2. 最不经常使用算法
  3. 近期最少使用算法
  4. 随机替换算法

六 虚拟存储器

1 虚拟存储器的工作原理

避免将程序中的内存空间全部存入到主存中去,程序员使用提供的虚拟地址进行编程, 使得当主存中的空间用完之后计算机还能正常运作

2 虚拟存储器的地址映射与变换

虚拟存储器下面有三种空间

  1. 虚拟地址空间
  2. 主存的地址空间
  3. 辅存地址空间

虚拟页式存储器的功能就是将虚拟地址上的空间映射到主存中去

3. 页式虚拟存储器

3.1 虚拟地址的划分

页式虚拟存储器中,虚拟地址被分为虚拟页号(VPN)(virtual page number) 和虚拟页偏移 (VPO)(virtual page offset) ,虚拟页号又被称为是虚页号,物理页号被称为是实页号或者是页框号

3.2 页表

物理地址由PPN和PPO构成,虚拟地址到物理地址上的映射就是将VPN映射为PPN

例子

当主存的容量为16MB时,按字节寻址,虚拟存储器的容量为4GB,采用页式虚拟存储器,页面的大小为4KB

此时的页面偏移的位数为 2 + 10 = 12 ,16MB = 4 + 20 = 24 物理页号字段为 24 - 12 = 12

4GB = 2 + 30 = 32 虚拟页号为 32 - 12 = 20 ,页表项的数目是 2202^{20}

假设此时有虚拟地址 00015420,那么分离出来的20 位虚拟页号字段 为 00015, 当其对应的有效位为1时,PPO直接等同于VPO

3.3 虚拟存储器访问流程

页面命中时

  1. 处理器生成一个虚拟地址,将其传送给MMU
  2. MMU利用页表基址寄存器PTBR和虚页号生成页表项地址PTEA,访问位于主存/cache中的地址,请求和虚拟页号对应的页表项PTE
  3. cache/主存返回页表项PTE,以构成访问信息的物理地址(PA)
  4. 若返回的PTE中的有效位为1,那么此时MMU利用返回的PTE构造物理地址,并利用构造出的物理地址PA访问cache或者是主存
  5. 返回请求的数据

页面未命中时,返回的PTE中的有效位为0

那么此时需要去得到一个虚拟的地址,然后从主存或者cache中重新加载数据,然后重复上面的2-5步,当主存页满的时候,需要按照替换算法进行替换

3.4 结合cache的虚拟存储器访问流程

将cache和主存分拆开,由于主存每次都会缓存主存中常用的数据,所以页表的数据也会作为常用的热数据调度到cache中

在不发生缺页的情况下,可以直接从cache中访问数据,很快,当页表缺失,数据也缺失的时候,则需要从速度很慢的磁盘中缓存数据

3.5 利用TLB加速虚拟存储器地址转化

TLB的位置离cpu更近,访问的速度更快。