存储系统

724 阅读37分钟

Ⅰ存储系统基本概念

❶ 存储器的层次结构

image-20220907104647287

  1. 辅存中的数据需要先调入主存才能被CPU访问,Cache与主存则可以直接被CPU访问

    注:有的教材把安装在电脑内部的磁盘称为辅存,把U盘/光盘等称为外存。也有的教材把磁盘/U盘/光盘等统称为辅存或外存

  2. 主存-辅存数据交换:

    • 实现:硬件+操作系统
    • 意义:实现了虚拟存储系统,解决了主存容量不够的问题
  3. Cache-主存数据交换:

    • 实现:硬件自动完成,程序员不需要管
    • 意义:解决了主存与CPU速度不匹配的问题

❷ 存储器的性能指标

1️⃣ 存储容量

2️⃣ 单位成本

每位价格 = 总成本/总容量

3️⃣ 存储速度

数据传输率 = 数据宽度(存储字长)/存储周期

  1. 数据传输率:即主存带宽(Bm),表示每秒从主存进出信息的最大单位,单位为字/秒、字节/秒(B/s)、位/秒(b/s)

  2. 数据宽度:数据宽度即存储字长,也即寄存器的位数。

  3. 存储周期:存储周期Tm又称为读写周期或者访问周期,指存储器进行一次完整的读写操作所需要的全部时间。

    存储周期Tm与存取时间Ta的关系如下图所示:

    image-20220907111258845

Ⅱ 存储器的分类

❶ 按存储介质

1)半导体介质

(主存、Cache):以半导体器件存储信息

2)磁表面存储器

所谓“磁表面存储”,是指以磁性材料存储信息,具体来说是把某些磁性材料薄薄地涂在金属铝或塑料表面上作为载磁体来存储信息。最常用的有磁盘、磁带等。

image-20220908194503300

  1. 原理:具体的物理细节肯定不会考,只需要知道这种磁表面存储器,我们读取或者写入数据的时候,每次只能读和写1比特。

  2. 磁表面存储器的优点:

    • 存储容量大,位价格低
    • 记录介质可以重复使用
    • 记录信息可以长期保存而不丢失,甚至可以脱机存档:
    • 非破坏性读出,读出时不需要再生。
  3. 磁表面存储器的缺点:

    • 存取速度慢
    • 机械结构复杂
    • 对工作环境要求较高。

3)光存储器

(光盘、DVD):以光介质存储信息

❷ 按存取方式

1)RAM 随机存取存储器

RAM 随机存取存储器(Random Access Memory):读写任何一个存储单元所需的时间都相同,与存储单元所在的物理位置无关

1️⃣ DRAM与SRAM介绍

DRAM存储元件使用的是栅极电容,SRAM的存储元件是双稳态触发器。两者读写原理为:

  1. 栅极电容的数据线只有一根,0对应电容无存储电荷,表现为数据线不产生电流;1对应电容有存储电荷,表现为数据线产生电流;

  2. 双稳态触发器的数据线有两根,0对应A低B高,表现为BL数据线为低电平,BLX数据线无电平;1对应A高B低,表现为BLX数据线为低电平,BL数据线无电平。

image-20220908092239303

2️⃣ DRAM与SRAM的对比

DRAM与SRAM的对比图如下,两者不同点在于:

image-20220908093754346

  1. 读出方式:

    基于栅极电容的DRAM是破坏性读出,电容放电信息被破坏,读出后应有重写操作,也称“再生”;

    基于双稳态触发器的SRAM是非破坏性读出,读出数据,触发器状态依然保持稳定,无需重写。

  2. 读写速度:

    基于栅极电容的DRAM读写速度更慢,因为需要恢复数据;

    基于双稳态触发器的SRAM读写速度更快,因为不需要恢复数据。

  3. 成本与集成度、功耗

    基于栅极电容的DRAM制造成本更低、集成度更高、功耗更低

    基于双稳态触发器的SRAM制造成本更高、集成度低、功耗大

  4. 是否需要刷新

    基于栅极电容的DRAM需要刷新

    基于双稳态触发器的SRAM不需要刷新

  5. 送行列地址:

    SRAM使用地址线复用技术,同时送;

    DRAM分两次送行列地址。

3️⃣ DRAM的刷新机制

电容内的电荷只能维持2ms,即使不断电,2ms后信息也会消失。故2ms内必须刷新一次(给电容充电)

  1. 多久刷新一次:刷新周期一般为2ms

  2. 每次刷新多少个存储单元:以行为单位,每次刷新一行存储单元

  3. 如何刷新:有硬件支持,读出一行信息后重新写入(充电),就类似于一次读写操作,占用1个读写周期

  4. 在什么时刻刷新:

    image-20220908101321572

    • 分散刷新:每一次进行读写之后,都会选择一行进行刷新。

      也就是说,我们一次读或者写本来只需要0.5微秒的时间,但是在每一次的读写之后,我们都会刷新一行,那这样的话就会导致存取周期的时间翻倍。

    • 集中刷新:刷新周期快到的时候,集中的安排一段时间,把所有行存储单元全部进行刷新

      假如有128行存储单元需要刷新,且2ms可以分为4000个读写周期(见下图),如果采用这种策略的话,我们会用前边的3872个周期进行正常的读写,然后最后会留出128个读写周期来分别刷新这128行存储单元。

      但是会有最后的这段时间,这整段时间是专门用于刷新的。在这段时间内,CPU无法对存储器进行读或者写,所以集中刷新的这段时间,我们把它称为死时间,或者叫死区。所以这种集中刷新的方式也不太科学

    • 异步刷新:把每一行的刷新分散到不同的时间段,在刷新的这段时间内,CPU同样不能对存储器进行读或者写,那这种刷新策略我们把它称为异步刷新。

      我们可以把每一行的刷新分散到不同的时间段,那2ms之内总共需要128次刷新。也就是说,每隔15.6微秒,我们必须保证刷新其中的某一行。所以也就是说,每15.6微秒当中,会有0.5微秒的时间是死时间。我们把刷新时间进行了一个分散。

      在实际应用当中,我们可以利用CPU不需要访问存储器的这段时间进行刷新,比如说如果CPU取得了一条指令,对这个指令进行译码的那个阶段,我们就可以进行刷新操作。

  5. 刷新操作由存储器独立完成,不需要CPU的控制

2)SAM 顺序存取存储器

比如磁带

SAM 顺序存取存储器(Sequential Access Memory):读写一个存储单元的时间取决于存储单元所在的物理位置

3)DAM 直接存取存储器

比如磁盘

DAM 直接存取存储器(Direct Access Memory):既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。

4)CAM 按内容访问的存储器

比如TLB

CAM 按内容访问的存储器(Content Addressed Memory):即相联存储器,可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器

❸ 按读取方式

1)破坏性读出

破坏性读出:信息读出后,原存储信息被破坏(如DRAM芯片,读出数据后要进行重写)

2)非破坏性读出

非破坏性读出:信息读出后,原存储信息不被破坏(如SRAM芯片、磁盘、光盘)

❹ 按信息的可更改性

1)读写存储器

读写存储器(Read/Write Memory):即可读也可写的存储器(如:磁盘、内存、Cache)

2)ROM 可读存储器

可读存储器(Read Only Memory):最初的定义是只能读不能写的存储器(如:实体专辑CD-ROM,BIOS),但是现在实际上现在很多ROM也可以多次读写,需要先把信息擦除,再往里面写(如:SSD)

1️⃣ ROM种类
  1. MROM(Mask Read-Only Memory)一一掩模式只读存储器

    • 厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)
    • 可靠性高、灵活性差、生产周期长、只适合批量定制
  2. PROM(Programmable Read-Only Memory)一一可编程只读存储器

    • 虽然是只读存储器,但是用户可用专门的PROM写入器写入信息。
    • 写一次之后就不可更改
  3. EPROM(Erasable Programmable Read-Only Memory)一一可擦除可编程只读存储器

    • 允许用户写入信息,之后用某种方法擦除数据,可进行多次重写

    • 根据擦除方式与擦除精度,可分为:

      UVEPROM(ultraviolet rays)一一用紫外线照射8~20分钟,擦除所有信息 EEPROM(也常记为E^2^PROM,第一个E是Electrically)一一可用“电擦除”的方式,擦除特定的字

  4. Flash Memory一闪速存储器(注:U盘、SB卡就是闪存)

    • 在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写

    • 每个存储元只需要单个MOS管,位密度比RAM高

      具体来说,对于两块体积相同的芯片,闪存芯片比RAM芯片的能集成的存储元个数更多,位密度更大,相同芯片面积下的存储体积也更大

    • 注意:由于闪存需要先擦除在写入,因此闪存的“写”速度要化“读”速度更慢

  5. SSD (Solid State Drives)一固态硬盘

    • 由控制单元+存储单元(Flash芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但 存储介质都类似,可进行多次快速擦除重写。

    • SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘

      拓展:手机辅存也使用FLASH芯片,单项式相比SSD使用的芯片,集成度高、功耗低、价格贵。如下图,RAM指主存,ROM指辅存

      image-20220908103558300

2️⃣ 计算机中重要的ROM芯片

接下来我们再来看一下计算机内部一个很重要的ROM芯片——BIOS

image-20220908103729050

  1. BIOS芯片的作用

    通过之前的学习,我们知道计算机的主存是用来存放一系列的指令和数据的,CPU要做的事情就是从主存里边取一条一条的指令,并且执行这些指令。

    然而RAM是一种易失性的芯片,也就是关机断电之后,主存RAM里的数据会全部丢失。当我们再一次开机的时候,主存里边完全没有数据,没有指令,那CPU就需要从主板上面的一块ROM芯片上来读取开机所需要执行的那些指令,那这块ROM芯片就是BIOS芯片,其中存储了自举装入程序,用于引导开机。

    ROM芯片是非易失性的,也就是说即便我们的计算机没有被供电,ROM里边存储的这个自举装入程序相关的指令数据同样不会丢失。

  2. BIOS芯片的位置

    虽然BIOS芯片通常是被集成在主板上,但是逻辑上我们应该把它看作是主存的一部分。也就是说在这门课里边,当我们提到主存的时候,除了指我们熟悉的内存条RAM之外,我们还应该加上这个BIOS芯片,二者结合才是一个完整的主存。

    image-20220908104623126

  3. BIOS芯片的地址编码

    通常CPU会给RAM和BIOS-ROM进行一个统一的编址。

    什么叫统一编制呢?就是说如果这块BIOS-ROM芯片它的容量是1KB,那么CPU会把0到1023这1024个地址分配给ROM芯片的,然后RAM芯片的地址其实是从1024开始往后编号的。

    image-20220908105024332

❺ 信息的可保存性

1)易失性存储器

断电后,存储信息消失的存储器(主存、Cache)

开机过程比较慢就是因为断电后主存里运行的程序等数据全部没了,需要从辅存里重新调到主存里,所以很慢。

2)非易失性存储器

断电后,存储信息依然保存的存储器(磁盘、光盘)

Ⅰ分层存储器介绍

❶ 外部存储器

计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器。

1)机械硬盘(磁盘)

磁盘也可以称为硬盘

磁盘存储器属于磁表面存储器,磁表面存储器还有磁带存储器和磁鼓存储器。

1️⃣ 磁盘结构

image-20220908200415897

2️⃣ 性能指标
  1. 磁盘的容量

    image-20220908200839768

  2. 记录密度

    image-20220908200856468

  3. 平均存取时间

    image-20220908200811157

  4. 数据传输率

    image-20220908201029158

3️⃣ 磁盘地址

image-20220908201144006

4️⃣ 工作过程
  • 硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步是取控制字,第二步是执行控制字。
  • 硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
5️⃣ 磁盘阵列RAID

RAID(Redundant Array of Inexpensive Disks,廉价冗余磁盘阵列),是将多个独立的物理磁盘组成一个独 立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。

RAID分级如下所示,其中RAID1~RAID5的几种方案,即便有磁盘损坏,也可以随时拔出受损的磁盘插入好的磁盘,而数据不会损坏。

  1. RAID0:无冗余和无校验的磁盘阵列

    底层逻辑是低位多体并行存储器,可以完成数据的交叉存取,不仅提高了存储容量,而且提高了磁盘数据存取速度,但是没有容错能力

    image-20220908202917885

  2. RAID1:镜像磁盘阵列

    很粗暴,存两份数据,既可以完成交叉存取,又保证了数据的安全性,但这意味着容量减少一半

    image-20220908203009825

  3. RAID2:位交叉奇偶校验的磁盘阵列

    逻辑上连续的几个bit物理上分散存储在各个盘中,4bit信息位+3bit海明校验位,可以纠正一位错。相比RAID1的容量利用率为1/2,RAID2的容量利用率为4/7

    image-20220908203338248

  4. RAID3:位交叉奇偶校验的磁盘阵列

  5. RAID4:块交叉奇偶校验的磁盘阵列

  6. RAID5:无独立校验的奇偶校验磁盘阵列

2)固态硬盘SSD

1️⃣ SSD结构

image-20220908204323326

image-20220908204742630

  1. 闪存翻译层:负责翻译逻辑块号,找到对应页

    如果在读写过程中,某一逻辑块号对应的物理地址发生了更改,闪存翻译层会更新映射关系

  2. 存储介质:多个闪存芯片,每个芯片包含多个块,每个块包含多个页

    对比学习:芯片对应盘面,块对应磁道,页对应扇区

2️⃣ 工作方式
  1. 以页(page)为单位读/写,擦干净的块,其中的每页都可以写一次,读无限次

  2. 以块(bock)为单位"擦除"。也就是说,一旦想要擦除某个页,一整行页都必须被擦除。

    要写的页如果有数据,则不能写入,需要先擦除,但是涉及到一个为:擦除是以块为单位的,为了保证页所属的块中其他数据不受影响,需要将块内其他页全部复制到一个新的(擦除过的)块中,再写入新的页 ps. 这也是读快、写慢的原因。

  3. 支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址

3️⃣ 与机械硬盘对比
  1. SSD读写速度快,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟

  2. SSD安静无噪音、耐摔抗震、能耗低、造价更贵

  3. SSD的一个"块"被擦除次数过多(重复写同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉

    基于这一条,产生了磨损均衡的理念:将“擦除”平均分布在各个块上,以提升使用寿命

    • 动态磨损均衡:写入数据时,优先选择累计擦除次数少的新闪存块
    • 静态磨损均衡:SSD监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主的储存任务(比如一部电影的存储),让较新的闪存块承担更多的写任务(比如word文档的存储)。

❷ 主存储器

主存储器由DRAM实现,靠处理器的那一层(Cache)则由SRAM实现,它们都属于易失性存储器,只要电源被切断,原来保存的信息便会丢失。

1)主存的结构

下面一起分析一下存储器的基本结构、基本概念以及一些设计逻辑。

从这个整体的框图出发,我们可以看到存储器分为两大块,一块是主机里面的主存储器,一块是外设当中的辅助存储器。

  • 主存储器简称主存,又叫内存

  • 辅助存储器简称赋存,又叫外存。

    辅助存储器也可以看作是一种IO设备,它既能输入又能输出。

我们这一节的内容主要是针对主存的。一方面理解一下基本的主存的原理,另一方面了解一下主存的一些主要结构。

image-20220614141601092

1️⃣ 主存的结构与流程

主存由存储体地址寄存器MAR(Memory Address Register)、数据寄存器MDR(Memory Data Register)组成

image-20220614141801926

  1. 数据的存储:存储在存储体中
  2. 数据的读取:使用地址寄存器与数据寄存器
    • 地址寄存器承接外部送过来的一个地址,并通过这个地址定位到存储体当中的某一个存储单元。
    • 这个存储单元被定位了之后,就会自动的把该存储单元内部的数据输出到数据寄存器当中暂存一下,然后外部的单元再从数据寄存器中取走读取的数据。
    • 整个流程由一个时序控制逻辑来控制。

image-20220614142838498

大家经常看到这个结构,不要疑惑,虽然MDR/MAR逻辑上是属于主存的,但最终实现的时候是做到CPU这块芯片里面的,即便如此本质上还是主存的功能部件。

2️⃣ 存取实例 - 取数指令

接下来我们基于这些结构来简单分析一下主机的运行规律。这里以取数指令为例。

image-20220914091030398

取出指令

  1. 将控制器中PC(程序计数器)中下一条指令的位置存储到MAR中
  2. 主存根据MAR中的地址到存储体中去找到指令数据
  3. 将找到的指令数据存储到MDR中
  4. 将MDR中的内容放到IR(指令寄存器)中

分析指令

  1. 取IR(指令寄存器)中当前指令的操作码部分到CU(控制单元)中,CU自动解析该操作码,就知道接下来怎么控制各个部件工作。

执行指令

(假设分析指令后发现这是一条取数指令)

  1. 将IR(指令寄存器)中当前指令的地址码存储到MAR中
  2. 主存根据MAR中的地址到存储体中去找到数据
  3. 将找到的数据存储到MDR中
  4. 将MDR中的数据存储到ACC(累加寄存器)中

image-20220611200819147

注:

MDR中的数据若是指令数据,则会存储到IR中。若是非指令数据,则会存储到ACC中。

那么如何区分指令数据与非指令数据呢?

答案是根据指令周期的不同阶段——在取指令阶段取出来的数据一定是指令,放到IR中;在执行指令阶段取出来的一定是数据,放到相应寄存器(如ACC)中。

image-20220908105601199

2)主存的存取原理

1️⃣ 主存基本元件 - 存储元

存储体的基本单元是存储元,能够存储一个二进制位,即1bit。

image-20220614144906153

  1. 控制部分

    • 读取数据:控制部分是一个开关器件MOS管,在这个开关器件的控制端提供一个代表连通的信号(假设为1),那么整条电路就会导通,整条线上的各个部分的信号统一起来,于是存储部分的数据就传输到了右边的数据寄存器,这样就完成了一个读的过程。

    • 写入数据:写的过程也是类似的,先准备好要写进去的这个信息,这个时候由于整个电路还是断开的,所以这个信息并没有传到左边。如果要写入的话,我们要给这个开关元件发出一个连通信号,开关元件就会自动的把整个电路连起来,右端数据寄存器中的的信息就会自动的传递到左端的存储部分

  2. 存储部分

    使用一个简单的栅极电容元件,下方接地为0V,负责存储信息。

    • 当电容存储有电荷,MOS管接通,电容放电,数据线上产生电流,代表1
    • 当电容上没有电荷,MOS管接通,数据线上无电流,代表0
2️⃣ 最小存取单位 - 存储单元
  1. 存储单元

    存储单元

    • 把一定数量(8的倍数)的存储元连接起来,用一根开关总线控制所有的MOS管,就构成了存储单元
    • 许多的存储单元,则构成了一个存储体,也称为存储矩阵

    image-20220614142303560

  2. 存储字

    • 从一个存储单元读取出的一整套信息叫存储字
    • 存储字长为一行的存储元个数,必须为n*8bit(比特),也即n Byte(字节)。也就是说一个存储单元的位数必须是8的整数倍,且必须能以字节划分。
    • 每次读写数据必须以字为单位!,都是一根线上的蚂蚱,不可能说只读写其中的一个字节
  • 从存储单元中取出的存储字,会被直接送往数据寄存器中。

    image-20220614142751382

3️⃣ 存储模式 - 大小端模式

存储有两种模式,大端模式与小端模式。大端模式符合人类阅读习惯(从最高位读起),小端模式符合机器阅读习惯(比如做运算时就是从最低位读起)

  1. 以字符串为例:假设字符串为IF_A>B+THEN_READ(C)_,注意下划线的意思是空格。

    这里的预设是 每个存储单元存放4Byte = 32bit

    大端模式:存储单元内先存储高位字节、后存储低位字节的顺序

    image-20220903094336501

    小端模式:存储单元内先存储低位字节、后存储高位字节的顺序

    image-20220903094519375

  2. 以int为例:假设有一四字节int为19088743D = 01234567H

    image-20220905102732863

4️⃣ 存储模式 - 边界对齐/不对齐

如果当前字的剩余空间不足以存储下一个数据(比如剩下一个字节,但是要存储一个2字节的short数据),有两种处理模式:

  • 第一种是边界对齐模式,这种模式下,如果当前字的剩余空间不足以存储下一个数据,那么就放弃当前字的剩余空间,转存到下一个字。
  • 第二种是边界不对齐模式,这种模式下,如果当前字的剩余空间不足以存储下一个数据,那么就在当前字里存一点,下一个字里存一点。
  • 两种方式各有利弊,由于每次访问内存是以字为单位的,边界对齐模式浪费存储空间,但是访问数据只需要一次访存边界不对齐模式节省存储空间,但是访问数据有可能需要多次访存才能获取完整数据

image-20220905111950633

3)内存编址原理

1️⃣ 内存单位

内存单位:内存单位主要有三种——字、半字、字节。

  • 字与半字的大小与存储字长有关,假设存储字长为32位,则1个字=32bit, 半字=16bit
  • 字节大小与存储字长无关,恒等于8bit
2️⃣ 编址原理
  • 现代计算机通常是按字节编址,即每个字节对应1个地址,但也可按半字、字编址寻址。

    但由于计算机只认字节地址,即便给了半字、字地址,本质上也需要转化给字节地址再取数。

    image-20220907161811228

  • 由下图可看出字节地址、半字地址、字地址之间的关系:

    • 半字地址×2 = 字节地址,也即将字地址左移一位可得到字节地址
    • 字地址×2^2^= 字节地址,也即将字地址左移二位可得到字节地址

image-20220905105150525

4)内存寻址原理

1️⃣ 寻址原理
  1. 地址与存储单元映射

    如何根据地址来决定读或者写哪个存储单元/存储字呢?

    ① 存储单元->选通线电平

    image-20220907152234012

    观察一下,每一根数据线(绿色的线)实际上是连通了多行存储单元对应的位,如果多行存储单元的字选线同时被置1(即接通开关),MDR中读出来的数据就不知道是哪个存储单元的了,所以实际上我们在读某一行的时候,只有要读写的的存储单元对应的字选线置1,其他行的字选线必须置0

    eg. 10000000....就代表定位了第1个存储单元,此时第1个存储单元的字选线被接通,其他存储单元的字选线被置0,数据线就能顺利地读取第1个存储单元里的数据内容,存储到MDR之中,并通过数据总线与CPU连接。这就是读写的基本原理

    ② 选通线电平->地址

    但是类似于01000000这种用于定位存储单元的二进制编码还不能直接用作地址,它位数太长,且某一个时刻仅仅能只有一位能是1,信息密度很低。所以我们需要一个转化的工具叫做译码器,它的作用就是把一个n位二进制数对应到一个2^n^位的字选通线高低电平,也即把n位地址对应2^n^个存储单元

    eg. 我们的存储体中有8个存储单元,那么译码器需要将代表地址的3根线对应到8个存储单元的字选线。当CPU通过地址总线将地址送到MAR之中,MAR中的地址若为000,代表10000000,接通第一根字选线,MAR中的地址若为010,代表001000000,接通第三根字选线......

    image-20220907154419981

  2. 控制电路

    在实际的存储芯片上,每根控制线对应一个金属引脚

    除了下述的控制线对应的引脚,通常还会有供电引脚、接地引脚

    ① 稳定信号

    此外还需要一个重要的东西:控制电路。因为我们知道数据的传送其实本质上是电信号,但是在传送过程中的电信号是不稳定的。因此在MAR中的电信号稳定之前,这个地址信息是不能送到译码器之中的,控制电路的作用就是在MAR中的电信号稳定之后,再将数据送到译码器之中。其他部分的控制电路也是同理。

    image-20220907155204623

    image-20220907161038300

    ② 片选与读写控制

    控制电路的一些控制线,还可以用来控制一些其他的功能:

    1. 片选线:通常用CE\overline{\mathrm{CE}}(Chip Enable)或者CS\overline{\mathrm{CS}}(Chip Select)表示,头上画线,代表低电平有效,存储芯片被选中(相应的头上不划线,代表高电平有效)

      比如内存为8GB,可能一个存储芯片就是1GB,每一个存储芯片都有地址,为了明确是哪个存储芯片的地址,需要使用片选信号,使相应的存储芯片被选中(低电平),其余的存储芯片(高电平)

      image-20220907160427406

    2. 读写控制线:读写控制可以用两条控制线,也可以合并到一条

      • 两条控制线:WE\overline{\mathrm{WE}}(Write Enable),低电平表示写入;OE\overline{\mathrm{OE}}(Output Enable),低电平表示读出

      • 一条控制线:WE\overline{\mathrm{WE}}(Write Enable)或者WR\overline{\mathrm{WR}}(Write - Read),低电平表示写入,高电平表示读出。

2️⃣ 寻址优化
  1. 寻址优化 - 行列地址

    image-20220908100153190

    在上面的寻址模型中,当CPU给出了n位的地址之后,这个译码器会把这n位地址把它转换成其中某一条选通线的一个高电频信号,如果n太大,这将导致译码器的选通线数量极多,在工程上很难实现,如图左所示。

    eg.那我们可以算一下,如果说有20位的地址,译码器这个输出端选通线的数量就应该是2^20^次方,也就是一兆,大概有100万这样的一个数量级,给译码器的这边接100万根线,那这个在工程上的难度是比较高的。

    那如何解决这个问题呢?我们其实可以把这些存储单元从一维的排列变成二维的排列,也就是把它们变成一个存储单元构成的矩阵。那原本的n位地址会被我们拆分成行地址和列地址,并被分别送给行地址译码器和列地址译码器。那用这种策略的话,每一个译码器只需要处理n/2位的地址信息,如图右所示。

    eg. 那么如果用之前那个例子来看的话,原本这个译码器它需要处理20位的这个地址信息,20位的地址信息会对应2^20^个选通线,那现在我们把这20位的地址信息分别拆分,把它拆成两半,一半是行地址,一半是列地址。那这样的话,每个译码器的选通线就只需要2^10^这么多根,也就是1024根,那1024根选通线在工程上是很容易实现的

    来看一个读写地址的实例:如果说此时要访问的地址是00000000,地址总共有八位。

    image-20220908100404293

    按照存储器的简单模型策略策略,译码器的输入端输入全零,那么它的第0根选通线会被选通,也就是会选中0号存储单元。

    采用拆分为行列地址的这种策略,00000000地址会被分为前半部分和后半部分,前半部分0000作为行地址送给行地址译码器,导致行地址译码器的第0根选通线被选通;而后半部分0000作为列地址送给列地址译码器。导致列地址译码器的第0根选通线被选通;这样一来,就通过行与列选中了(0,0)这个存储单元。

    好,所以这就是为什么要把一维排列的这个存储单元,把它们变成二维排列。当然现在随着存储器的发展,存储容量越来越大,现在存储器甚至还会有三维的排列。但是原理都是类似。

  2. 地址线复用技术

    image-20220908102425802

5)主存容量与扩展

1️⃣ 主存容量大小

常见的描述方式为8×8的芯片,代表8K×8位 ,即 2^13^×8bit,也是基于下面的公式。

总容量=存储单元个数×存储单元字长总容量 = 存储单元个数×存储单元字长

image-20220614142704911

当然除了译码器,还有一个驱动器,驱动器是干嘛的?

刚刚我们说这个1的信号可以给开关元件供电,让它能够选通,现在由于存储单元中的存储元都由一根线控制,一口气需要供那么多个单元的电,微小的1的信号可能不太够,所以我们加了一个驱动器,主要是增强它供电的能力的,这个大家了解一下就好.

2️⃣ 位扩展

假设我们现在拥有的存储芯片,其字长比数据总线的宽度更小,如何拓展字长呢?

此时我们只有8K×1的存储芯片,每一次只能读或者写一位的数据,但数据总线的位数为8,没有得到充分的利用。那为了解决这个问题,我们可以:

  1. 把地址信息同时送给两块芯片,那么可以选中这两块芯片相同位置的存储单元。
  2. 把CPU发出的读写控制信号同时送给两块芯片,要么同时读,要么同时写,
  3. 给两块芯片的片选信号同时加一个高电频,这样的话这两块芯片就可以同时工作。

进行了这个改造之后,我们整个主存储器总共有两块存储芯片,总体来看,存储器的存储字长拓展为了2位,现在我们可以同时读或者同时写2位的信息。

image-20220908110145048

同理,可将8块芯片连在一起工作

image-20220908110206609

3️⃣ 字扩展
  1. 线选法

    image-20220908111252196

  2. 片选法

    image-20220908111854521

    1-2译码器对应两片芯片

    image-20220908111603663

    2-4译码器对应四片芯片

    image-20220908111728190

4️⃣ 字位扩展

image-20220908112004950

6)主存读取周期与改进

1️⃣ 主存存取周期

存取周期:存取周期Tm又称为读写周期或者访问周期,指存储器进行一次完整的读写操作所需要的全部时间。

  • 存储周期Tm与存取时间Ta的关系如下图所示:
存取周期Tm=存取时间Ta+恢复时间存取周期Tm = 存取时间Ta + 恢复时间

image-20220907111258845

  • 由于主存是DRAM芯片,恢复时间可能是存取时间的几倍(SRAM则恢复时间较短),比如存取时间为r,恢复时间为3r,存取周期T=4r,那么如何提高主存的存取效率呢?
    1. 针对多核CPU访问一根内存条,给出双端口RAM的解决方案。
    2. 针对一个CPU访问多根内存条的速度,可以使用多模块存储器的解决方案。
2️⃣ 双端口RAM

为了优化多核CPU访问一根内存条的速度,使用双端口RAM技术

image-20220908112217416

3️⃣ 多模块存储器

为了优化一个CPU访问多根内存条的速度,可以使用多模块存储器来进行并行访问

① 多体并行存储器

  1. 高位交叉编址与低位交叉编址

image-20220913132436856

  1. 效率最大化的低位交叉编址

    在访问连续地址的情况下,选择多少个内存条,能让存取效率最大化?

    为什么要探讨连续访问情况?

    一般来说,数据结构、程序等都是连续存储在内存中的,探讨连续访问具有现实意义。

    image-20220908112918048

② 单体多字存储器

多体并行存储器是字扩展,单体多字存储器是位扩展

image-20220908113140033

❸ 从辅存到主存 - 虚拟存储系统

1)页式存储

1️⃣ 什么是页式存储

一个程序如果要连续调入主存,未必有那么大的连续空间,怎么办?—— 拆分为页

页式存储系统:一个程序(进程)在逻辑上被分为若干个大小相等的“页面”,“页面”大小与“块”的大小相同。故而每个页面可以离散地放入不同的主存块中。

image-20220909111913891

2️⃣ 物理地址与逻辑地址

image-20220909113458839

3️⃣ 地址转换

image-20220909114714501

  1. 无TLB的地址转换

    image-20220909113914551

  2. 增加TLB的地址转换

    由于慢表存储在主存中,每次查表相当于一次访存,为了加快查表速度,增加TLB快表(这是一种CAM相联存储器,可以按内容寻访,所以查询速度很快很快)

    类比的来说,TLB是加速地址转换过程,Cache加速访问地址过程

    image-20220909114044348

2)虚拟存储系统

1️⃣ 为什么需要虚拟存储系统

答案很简单,解决主存容量不够的问题。

注意,与硬件决定将哪些块从内存调入Cache不同,操作系统决定将哪些页从辅存调入主存

因为计组侧重点是硬件,故虚拟存储系统到操作系统才有详细讲解。

image-20220909115033637

2️⃣ 页式虚拟存储系统

image-20220909115339400

image-20220909115221924

3️⃣ 段式虚拟存储系统

image-20220909115813031

由于每一段长度不一,主存不再分块,地址表中将逻辑地址(段号)对应到实际物理地址的段首址+段长,这样就能轻易定位物理地址的任意长度的块。

image-20220909120120328

4️⃣ 段页式虚拟存储

image-20220909120435838

❹ 从主存到CPU - 高速缓冲存储器

1)Cache概述

1️⃣ Cache的目标

image-20220908210923203

2️⃣ 局部性原理与局部定义块
  1. 局部性原理

    局部性原理分为空间局部性与时间局部性。

    image-20220908211053502

  2. 分块原理

    基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。如何界定“周围”?

    答案是**给存储空间分块,块即为周围。**主存与Cache之间以块为单位进行数据交换。

    image-20220908211720751

    块还有许多别的称谓,比如在操作系统中可以称为(在SSD中也称为页),此外也可以称为

3️⃣ Cache的性能分析

Cache的两种策略下,性能分析如下:

image-20220908211252151

给出一个具体例子:

image-20220908211327706

2)Cache的主存映射方式

如何知道Cache中的块与主存的数据块对应关系?—— Cache的主存映射方式

0️⃣ 三种映射方式的基础

三种映射方式如下图所示,虽然映射规则不同,但是其共同点是都需要标记与有效位

  1. 标记是为了标记这个Cache块对应的主存块号

  2. 有效位是为了标识这个Cache块的标记是初始默认值还是对应的主存块

    比如6与7的标记都为0,但是7的有效位为1,那么7号Cache块就对应0号主存块,而6号Cache块还不存在映射,标记位0只是一个初始状态。

image-20220908212657334

1️⃣ 全相联映射

image-20220908213238295

2️⃣ 直接映射

根据映射规律对标记数的优化

image-20220908213505973

直接映射的存取规律

image-20220908213642444

3️⃣ 组相联映射

根据映射规律对标记数的优化

image-20220908213901717

组相联映射的存取规律

image-20220908213949079

3)Cache的替换

Cache很小,主存很大。如果Cache满了怎么办?——替换算法

1️⃣ 随机算法(RAND)
  1. 随机算法(RAND,Random)一一若Cache已满,则随机选择一块替换。
  2. 随机算法实现简单,但是完全没考虑局部性原理,命中率低,实际效果很不稳定

image-20220909103130063

2️⃣ 先进先出算法(FIFO)
  1. 先进先出算法(FIFO,First In First Out)一一若Cache已满,则替换最先被调入Cache的块

  2. 先进先出算法实现简单,但依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的,可能会导致抖动现象

    抖动现象:频繁地换入换出现象(刚被替换的块很快又被调入)

    eg. 看看下表演示的123412【512345】,框起来的部分就是发生抖动现象的地方

image-20220909103225929

3️⃣ 近期最少使用算法(LRU)
  1. 近期最少使用算法(LRU,Least Recently Used)一一为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的Cache块
  2. LRU算法基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。

image-20220909104120275

4️⃣ 最不经常使用算法(LFU)
  1. 最不经常使用算法(LFU,Least Frequently Used)一一为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的。
  2. LFU算法并没有很好地遵循局部性原理。曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),,因此实际运行效果不如LRU

image-20220909104539010

4)Cache写策略

CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性?——Cache写策略

1️⃣ 写命中

当要写的块在Cache中正好有副本,可以采用如下两种策略——写回法与全写法

  1. 写回法(write-back):当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。此法减少了访存次数,但是存在数据不一致的隐患

    image-20220909105415143

  2. 全写法/写直通法(write-through):当CPU对Cache写命中时,必须把数据同时写入Cache和主存

    image-20220909105556217

    由于写入主存的速度很慢,所以一般使用写缓冲(write buffer)。写缓冲是SRAM实现的FIFO(先入先出)队列。其过程如下图所示:1 CPU同时写入Cache与写缓冲 2 写缓冲慢慢写回主存。

    需要注意的是:使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。但若写操作很频繁,可能会因为写缓冲饱和而发生阻塞

    image-20220909110058017

2️⃣ 写不命中

当要写的块在Cache中没有副本,也可以采用如下两种策略——写分配法与非写分配法

  1. 写分配法(write-allocate):当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。且通常搭配写回法使用,以完成Cache与主存的同步

    image-20220909110758267

  2. 非写分配法(not-write-allocate):当CPU对Cache2写不命中时只写入主存,不调入Cache。搭配全写法使用。

    要注意,读操作未命中一定会调入Cache,写操作未命中则未必一定调入Cache,要看用哪种方法写。

    eg. 用之前的写分配法,就需要调入,用非写分配法,就直接在内存里写。

    image-20220909110858192

5)多级Cache

image-20220909111248663