【计算机组成原理期末总预习-自顶向下方法】第7章 存储系统

发布时间 2023-06-09 19:18:16作者: _vv123

一、存储器概述和存储器芯片

  1. 分类:

    • 随机存取存储器(RAM):每个单元读写时间一样,且与各单元所在位置无关。如:内存。
    • 顺序存取存储器:数据按顺序从存储载体的始端读出或写入,因而存取时间的长短与信息所在位置有关。例如:磁带。
    • 直接存取存储器:直接定位到读写数据块,在读写数据块时按顺序进行。如磁盘。
    • 相联存储器:按内容检索到存储位置进行读写。例如:快表。
    • 只读存储器(ROM)/读写存储器
    • 非易失(不挥发)性存储器:信息可一直保留, 不需电源维持。(如 :ROM、磁表面存储器、光存储器等)
    • 易失(挥发)性存储器: 电源关闭时信息自动丢失。(如:RAM、Cache等)
    • 静态/动态存储器。
  2. 层次结构存储系统

    • 寄存器:封装在CPU内,用于存放当前正在执行的指令和使用的数据,用触发器实现,速度快,容量小(几~几十个)

    • 高速缓存:位于CPU内部或附近,用来存放当前要执行的局部程序段和数据。用SRAM实现,速度可与CPU匹配,容量较小(几MB)

    • 内存(主存):位于CPU之外,用来存放已被启动的程序及所用的数据。用DRAM实现,速度较快,容量较大(几GB)

    • 外存:位于主机之外,用来存放暂不运行的程序、数据或存档文件。用磁表面或光存储器实现,容量大而速度慢。现在用闪存实现的电子盘也开始大量应用。

    • 内存与外存的关系。

      image-20230608210537761
  3. 半导体存储器

    image-20230608212620197
    • SRAM原理

      image-20230608212904285
    • DRAM原理

      image-20230608212940484
    • DRAM的刷新

      • 原因:动态存储器依靠栅极电容上的电荷来存储信息,无电源供电,通常只能维持几十个毫秒左右(常为64ms),为使电容上保存的信息不丢失,需定期向电容补充电荷。

      • 刷新方法:因DRAM在读操作时都需再生,故刷新即为读操作。刷新按行进行,所有芯片中的同一行同时刷新。

      • 刷新周期:从上次对整个存储器刷新结束到下次对整个存储器全部刷新一遍为止的时间间隔,也就是对某个特定行进行刷新的时间间隔。
        刷新周期取电容上数据有效保存时间的上限,一般为10ms~100ms,目前多数情况下是64ms。

      • 集中/分散/异步刷新:

        image-20230609152126615
    • SDRAM技术

      • 每步操作都在系统时钟控制下进行,有确定的等待时间(读命令开始到数据线有效的时间)CL,例如 CL=2 clks。
      • 芯片内有行缓冲,可实现突发(berst)传输,只需送入首地址,读后面的数据不需要地址传输和预充电时间,直接从行缓冲中取,每个时钟可以传一个数。
      • DDR及以后的芯片内具有从存储阵列预取多位到I/O缓冲器,利用总线时钟上升沿与下降沿各传送一次数据,即一个时钟传两次数据。
      • DDR2、DDR3、DDR4芯片内具有从存储阵列预取4位、8位和16位到I/O缓冲器,可以使总线频率是核心频率的2倍、4倍和8倍,大大提高了数据传输速度。

二、存储器容量的扩展及其与CPU的连接

  1. 存储器容量的拓展

    • 字扩展

      • 例:用16K×8位芯片扩成64K×8位存储器需几个芯片?地址范围各为什么?
      • 字方向扩展4倍,需4个芯片。
      • 每个芯片16K=214,故有14位地址。64KB=216,故总的地址共需16位。
      • 地址范围分别为:0000-3FFFH, 4000-7FFFH, 8000-BFFFH, C000- FFFFH
      • 地址高两位由外部译码器译码生成4个输出,分别连到4个芯片的片选信号端。
      • 地址的低14位连到各芯片作为片内地址。
      • 地址线、读/写控制线等对应相接,片选信号连译码输出。
    • 位扩展

      • 例:用4K×1位芯片构成4K×8位存储器需几个芯片?地址范围各是多少?
      • 位方向扩展8倍,字方向无需扩展。
      • 需要8个芯片,地址范围都一样:000-FFFH, 地址共12位,全部作为片内地址。
      • 芯片的地址线及读/写控制线对应相接,而数据线单独引出
    • 字位同时扩展

      • 例:16K×4位芯片构成64K×8位存储器需几个芯片,地址范围各是多少?
      • 字方向4倍、位方向2倍,8个芯片。
      • 各芯片地址范围:0000-3FFFH, 4000-7FFFH, 8000-BFFFH, C000- FFFFH

      系统存储容量的计算,芯片数的计算;这几种扩展方式下的芯片(组)与片选信号的地址线分配;各芯片(组)的地址范围的计算、划分。片选信号用地址信号表示的逻辑表达式。

三、高速缓冲存储器(cache)

Cache对程序员(编译器)是透明的。

  1. 三种映射

    • 直接映射

      • 主存中数据以块为单位,Cache中以行为单位,1块=1行。

      • 把主存的每一块映射到一个固定的Cache行(槽),也称模映射(Module Mapping)

      • 映射关系为:Cache行号=主存块号 mod Cache行数
        例如,设Cache有16行,则主存第100号数据应映射到Cache的第4行中。

      • 块和行都从0开始编号

      • 将主存按Cache的数据容量大小划分为多个群,群的编号从0开始。

      • 每个群的各个数据块就映射到固定的Cache行。

      • 主存块号就划分为主存群号和Cache行号两个部分、

      • 优点:实现简单,命中检测时间短,无需考虑淘汰(替换)问题

      • 缺点:不够灵活,Cache存储空间得不到充分利用,命中率低

      image-20230609161737640

      image-20230609161953977image-20230609163123216

    • 全相联映射

      image-20230609163331935

      image-20230609170835013

    • 组相联映射

      • 将Cache所有行分为\(2^k\)个组,每个主存块只能映射到Cache的一个固定组,但可选该组中的任一行。即:组间是模映射,组内是全映射。

      • 映射关系为: Cache组号=主存块号 mod Cache组数

      • 例如:假定Cache的划分为:8KB=8组x2行/组x512B/行

        ​ 主存第100块: 100 mod 8=4,映射到Cache的第4组的任意行中

      • 每组的行数称为路, 该例的映射称为2路组相联映射。

        image-20230609171154391

      • 特点:结合了直接映射和全相联映射的优点。

      • 当Cache组数为1时,就是全相联映射;当每组只有一行时,就是直接映射。

  2. 替换算法

    • 在组相联或全相联映射下,若发生Cache未命中,需从主存调入一主存块到cache,可能需要替换。

    • 过程:从主存取出一个新块。若有满足映射关系的Cache空行,将数据块写入。若满足映射关系的Cache行都已装有效数据,则必须从Cache行中替换出一个主存块。

    • 先进先出FIFO:命中率并不随组的增大而提高,FIFO不是一种栈算法。

    • 最近最少用LRU:

      • 最近用到的块在栈顶,栈底块被淘汰。

      • 是一种栈算法,它的命中率随组的增大而提高。

      • 具体实现:

        image-20230609172222163

    • 最不经常用LFU:替换掉cache中引用次数最少的行。

    • 随机替换算法(Random):常用,实验证明其性能只稍逊基于使用情况的算法。

  3. 写策略

    • Cache与主存的一致性:Cache中的内容是主存块的副本,当对Cache中的内容进行更新时,就存在Cache和主存如何保持一致的问题。当多个设备都被允许访问主存、多个CPU都带有各自的Cache而共享主存时也会出现一致性问题。

    • 两种情况

      • 写命中(Write Hit):要写的单元已经在Cache中
      • 写未命中(Write Miss):要写的单元不在Cache中
    • 两种操作方式

      • 全写(Write Through):

        • 若写命中,同时写Cache和主存单元。
        • 若写未命中,有两种处理方式:
          • 写分配(Write Allocate): 先将主存块中相应单元更新,然后将主存块装入Cache。充分利用了空间局部性,但增加了从主存读数据块Cache的开销。
          • 非写分配(Not Write Allocate): 直接写主存单元,不把主存块装入到Cache。缺点未利用空间局部性。
        • 这种方法会大大增加写操作的开销。CPI = 1 + T * Rate。可采用写缓冲法,Cache与主存间加缓存。
      • 回写(Write Back):

      • 若写命中,只写Cache不写主存。每行设一个修改位(“dirty bit-脏位”),当它被替换时才写回主存。

      • 若写不命中,通常采用写分配法。

      • 可大大降低主存带宽需求,但不及时更新Cache和主存内容,为保证一致性,控制可能很复杂。

四、虚拟存储器

  1. 分页

    • 基本思想

      • 内存被分成固定长度且比较小的存储块(页框、实页、物理页)
      • 每个进程也被划分成固定长的程序块(页、虚页、逻辑页)
      • 程序块可装到内存中可用的存储块中
      • 无需用连续页框来存放一个进程
      • 操作系统为每个进程生成一个页表(page table)
      • 通过页表实现逻辑地址向物理地址转换(Address Mapping )
    • 逻辑地址(LA): 程序中指令所用地址(进程所在地址空间),也称为虚拟地址(VA)

    • 物理地址(PA):存放指令或数据的实际内存地址,也称为实地址、主存地址。

    • 虚拟存储系统

      image-20230609181937997

      image-20230609181946636

    • 设计与原因:

      为什么页的大小比cache映射中的主存块要大得多?

      页框与虚拟页之间采用全相联映射,为什么不采用其他映射方式?

      答:缺页的开销比Cache缺失开销大得多。因此,页命中率比cache命中率更重要,采用“大页面”和“全相联”可提高页命中率。

      当发生程序或数据访问缺页时,由操作系统在主存和磁盘之间进行信息交换。为什么不直接用硬件来处理?

      答:缺页时需要访问磁盘(约几百万个时钟周期),慢,没必要用硬件实现。

      在处理页框与虚拟页的一致性问题时采用回写(write back)方式,为什么不采用全写方式?

      答:避免频繁的慢速磁盘访问操作。

      逻辑地址转换为物理地址是由硬件(CPU中的存储管理部件)完成,其中虚页号到页框号的转换是通过查表(页表或快表)实现。

      答:加快指令执行。

  2. 页表的基本结构

    image-20230609184512305

    image-20230609185629398

    • 如何区分未分配页、已分配的缓存页和已分配的未缓存页。

      • 未分配:装入位为0,存放位置为null
      • 已分配未缓存:装入位为0,存放位置为null
      • 已分配已缓存:装入位为1
    • 逻辑地址转换为物理地址的过程,异常处理

      image-20230609185807578

      image-20230609185941745

  3. 快表—TLB

    • 减少访存次数,把经常要查的页表项放到Cache中,这种在Cache中的页表项组成的页表称为TLB(Translation Lookaside Buffer) ,中文一般称为快表,或页表缓冲。

    • 快表与页表之间一般采用组相联或全相联映射。

      • TLB组相联时,虚页号被分成tag+index,index用于定位组,tag用于与组内的页表项中的tag比较。
      • TLB全相联时,没有index,虚页号需与每个tag比较。

      image-20230609190403418

  4. CPU访存的全过程

    image-20230609190558583

    image-20230609190724183

  5. 分段式与段页式

    image-20230609191016762 image-20230609191037897 image-20230609191104846