计算机组成原理-4-存储器

4. 存储器

加星号的目录为本章重点。


4.1 概述

本节问题:

  • 存储器可分哪些类型?
  • 现代存储器的层次结构,为什么要分层?

4.1.1 存储器分类

  存储器是计算机系统最重要的部件之一,执行程序时程序、指令都来自于存储器,执行结果也保存在存储器中。存储器分类的判定标准非常多,比如存储容量、存储介质、存储器位置、存储器作用等,下图给出了三种分类方法:

图4-1 存储器分类示意图

按存储介质分类:半导体、磁、光(下面看似四种,本质是三种)。

  1. 半导体存储器:较为常见,主要分为TTL(晶体管)、MOS(金属氧化物半导体)两种类型,TTL型存储器集成度低、功耗高、但速度快;MOS型存储器集成度高、功耗低。所以内存条上的内存颗粒、U盘一般都是MOS型存储器
  2. 磁表面存储器:需要有磁头、载磁体,比如磁盘(机械硬盘)、磁带。以磁盘来说,在塑料/合金的基片涂上一层磁层,再将这个磁盘分成若干个同心圆磁道,再按照固定角度切割成不同的扇区,每个扇区可以按照磁层小格子的0/1存储几百~几千个比特。
  3. 磁芯存储器:是早期计算机系统的内存,由硬磁材料、环状元件构成。本质上利用了磁化材料,使用两根电流线磁化某个硬磁材料,然后读出磁场方向表示0/1。
  4. 光盘存储器:本质上和机械硬盘差不多,只是采用激光、磁光材料。

参考视频:你以为被时代淘汰的磁带正在卷土重来【差评君】

按存取方式分类

  1. 随机访问:给出不同的物理地址,可以在相同时间内写入/读出。又分为随机存储器(可读/可写)、只读存储器。
  2. 串行访问:存取时间与物理地址有关,又分为顺序存取存储器(磁带)、直接存取存储器(磁盘)。磁带想听刚才的对话只能倒带;磁盘(机械硬盘)则是不同数据的寻址时间不一样,只能给出平均寻址时间。

参考视频:【CSAPP-深入理解计算机系统】6-2. 机械磁盘——4:12s介绍机械磁盘对扇区的访问时间

按在计算机中的作用分类:主存储器、高速缓冲存储器后面会详细介绍。

  1. 主存储器:RAM可读可写,可以存储用户程序;ROM只读,比如主板上存储BIOS的芯片。
  2. Flash Memory:是半导体存储器,比如U盘。通常会作为“主存储器”和“辅助存储器”之间的桥梁,弥补两者读写速度差距过大的问题,比如固态硬盘上的“缓存”芯片。
  3. 高速缓冲存储器(Cache):通常是静态RAM,比Flash Memory、主存都快,作为CPU和主存储器之间的缓冲。
  4. 辅助存储器:磁盘、磁带、光盘。

参考视频:【硬核科普】固态硬盘的缓存是干什么的?有缓存和无缓存有什么区别?

4.1.2 存储器的层次结构

  在使用存储器的时候,用户最关心三个指标:速度、容量、价格。实际上没有任何一种存储器能同时实现速度快、容量大、价格低,于是便需要多种不同层次的存储器形成一个“存储体系。“存储体系”指的是使用两种及以上存储器,采用软件、硬件、软硬件结合的方式连接成一个整体,使得从某一级程序员的角度看,这个整体具有速度快、容量大、价格低的特性。下图给出了计算机中存储器的层次结构,可以看到越往下,速度越慢、容量越大、价格越低:

图4-2 存储器速度、容量、价格的关系
  • 寄存器:这里指的是集成在CPU中的寄存器,IO端口中也有寄存器。分为对程序员透明的“体系结构寄存器”、对程序员不透明的“非体系结构寄存器”。
  • 缓存:早期CPU中没有缓存,随着技术发展部分缓存集成到CPU中提升读写速度,部分缓存在外提升存储容量。
  • 寄存器、主存、缓存构成主机中的存储器,剩下的辅存则是外接的IO设备。

进一步来说,存储器的层次结构主要体现在“缓存-主存层次”、“主存-辅存层次”这两个存储层次上。正常来说,在运行程序时只有两个主体——CPU、“主存”,CPU从主存读信息、并将运行结果写入到主存中。但是随着科技发展,对运行速度存储容量有了更高的要求,于是便有了“缓存”、“辅存”解决这两个问题,如下图所示:

图4-3 缓存-主存层次、主存-辅存层次
  • 缓存-主存层次:解决“CPU”和“主存”速度不匹配的问题。早期CPU和主存速度相当,但随着科技发展,CPU速度提升速率明显大于“主存”,两者的速度提升差距称为“剪刀差”。于是引入“缓存(cache)”,虽然功耗大、容量小,但是速度比主存快得多,将CPU常用数据放在“缓存”中(程序的局部性原理)。为了保证速度,直接采用纯硬件方法将“主存”、“缓存”连接在一起,对系统程序员、机器语言程序员无需关心两者的区别。注意“缓存”的地址是“实地址”,也就是实际的“物理地址”,CPU只知道“主存”地址,只不过“缓存”会将“主存地址”转换成自己的“块编号+块内偏移地址”。
  • 主存-辅存层次:解决“主存”容量有限的问题。使用软硬件结合的方法将“主存”、“辅存”构成一个整体,将文档、视频等大文件存储到“辅存”中。从应用程序员角度看,这个整体有“主存”的速度、“辅存”的容量,无需自己手动为数据划分存储位置。注意“辅存”的地址是“虚地址”,也就是“逻辑地址”。

4.2 *主存储器

4.2.1 概述

  下图给出了主存的基本组成,其中存储体、MAR、MDR在前面“1.3 计算机的工作步骤”已经介绍过,下面来分析更细化的结构。MAR地址寄存器中的地址要经过“译码器”进行译码,才能选定指定的存储单元;MDR数据寄存器则是由“控制电路”和“读写电路”进行控制,决定数据从存储体读出、向存储体写入。如下图所示:

图4-4 主存的基本组成

  下图给出了主存与CPU之间的联系,主要分成三类信号:数据总线、控制总线、地址总线。下图中只给出读/写两个控制信号,还有其他的控制信号后续会介绍。另外注意数据总线是双向传输、地址总线是单向传输

图4-5 主存与CPU的联系方式

  下图给出了主存中存储单元地址的分配。假设主存的存储字长是32位,现在要存储32位的16进制数 3 2 ′ h 12345678 32'\text{h}12345678 32h12345678,那么可以高位字节 8 ′ h 12 8'\text{h}12 8h12 为字地址、也可以低位字节 8 ′ h 78 8'\text{h}78 8h78 为字地址(x86机器)。注意下图中每个格子都表示一个字节:

图4-6 主存中存储单元地址的两种分配方式

假设地址总线24位,则可以存储 2 24 Byte = 16 MB 2^{24}\text{Byte} = 16\text{MB} 224Byte=16MB,此时若:

  • 字长为16位,则按字寻址,可存储 8 M word = 8 MW 8\text{M word}=8\text{MW} 8M word=8MW
  • 字长为32位,则按字寻址,可存储 4 M word = 4 MW 4\text{M word}=4\text{MW} 4M word=4MW

最后是主存的技术指标:

  1. 存储容量:可以存放的字节数或比特数。
  2. 存储速度:一般来说,存取时间<存取周期。
  • 存取时间:从收到地址到给出/写入数据的总时间,也称为存储器的访问时间。分为读出时间、写入时间。
  • 存取周期:连续两次独立的存储器操作(读或写)所需的最小间隔时间,和存储器刷新有关。分为读周期、写周期。
  1. 存储器的带宽(位/秒):装机常用指标。

4.2.2 半导体存储芯片简介

  下面将主存进一步抽象,给出“半导体存储芯片的基本结构”,也就是“译码驱动”接收地址、“存储矩阵”存储数据、“读写电路”读写数据。从外界来看,主要有以下四类与外界连接的接口信号:

图4-7 半导体存储芯片的基本结构
  • 地址线:单向输入。利用地址线可以计算存储单元的数量。
  • 片选线:一般表示为 CS ‾ \overline{\text{CS}} CS(chip select) 或者是 CE ‾ \overline{\text{CE}} CE(chip enable),上面的横线表示低电平有效。
  • 数据线:双向。可以得到单个存储单元的位宽。
  • 读/写控制线:一根线控制用 WE ‾ \overline{\text{WE}} WE(write enable),低电平写、高电平读。两根线控制则用 OE ‾ \overline{\text{OE}} OE(out enable) 允许读 + WE ‾ \overline{\text{WE}} WE(write enable) 允许写。

现在来进一步介绍片选信号。之所以有“片选”这个概念,是因为目前内存条厂商都会使用多个“内存颗粒”组成一个完成的内存条,如下左图所示有四个颗粒。那现在假设单个颗粒的容量是 16K×1bit,要想组成一个 64K×8bit 的内存条,就可以先将8片颗粒分成一组实现 16K×8bit,这8个颗粒共用一个片选信号线;再使用四组这样的颗粒,就可以组成 64K×8bit 的内存条,按地址查找数据:

图4-8 多个内存颗粒组成单个存储器

  下面我们来介绍主存如何根据给定的地址,找到相应的存储单元,也就是“半导体存储芯片的译码驱动方式”。如下图所示,这里主要介绍线选法、重合法:

图4-9 译码驱动方式——线选法、重合法
  • 线选法:将存储单元划分成一维矩阵,直接用地址译码器选出相应的地址,比如上左图就是4位地址线控制 2 4 2^4 24 个存储单元(8位),需要 2 4 2^4 24 根地址线。缺点是每个地址单元都对应一根地址线,很难大规模集成。
  • 重合法:将存储单元划分成二维矩阵,将输入的地址拆分成“行地址”、“列地址”,如上右图10根地址线控制 2 10 2^{10} 210 个存储单元(1位),只需要 2 5 + 2 5 = 64 2^5+2^5=64 25+25=64 根地址线,而不是 2 10 = 1024 2^{10}=1024 210=1024 根地址线。

注:实际上内存条大多是分时复用行地址、列地址,理论上实现了32位地址线控制 2 32 × 2 32 = 2 64 2^{32}\times 2^{32}=2^{64} 232×232=264 个存储单元。

4.2.3 随机存取存储器(RAM)

本小节问题:静态RAM(SRAM)

  • 保存0和1的原理是什么?——触发器
  • 基本单元电路的构成是什么?——六管SRAM
  • 对单元电路如何读出和写入?
  • 典型芯片的结构是很么样子的?
  • 静态RAM芯片的如何进行读出和写入操作?

本小节问题:动态RAM(DRAM)

  • 保存0和1的原理是什么?——电容
  • 基本单元电路的构成是什么?——三管DRAM、单管DRAM
  • 对单元电路如何读出和写入?
  • 典型芯片的结构是很么样子的?
  • 动态RAM芯片的如何进行读出和写入操作?
  • 动态RAM为什么要刷新,刷新方法?

  本小节介绍静态RAM、动态RAM,上面给出了本小节的问题。如下图所示,对于每种RAM,首先会先介绍存储单元的电路结构,明确如何存储0/1数据;然后介绍使用该存储单元电路的芯片的存储矩阵电路,明确如何按照地址读/写数据。

RAM
静态RAM
存储单元:六管静态RAM
芯片:Intel 2114
动态RAM
存储单元:三管动态RAM
芯片:Intel 1103
存储单元:单管动态RAM
芯片:Intel 4116
图4-10 RAM内容介绍

  本段介绍使用六管SRAM作为存储单元的静态RAM(SRAM)。SRAM使用触发器保存0/1数据,如下图T1~T4是双稳态触发器、T5/T6则控制是否对触发器进行读/写。T1~T6组成一个单独的“存储单元”(虚线框),许多个这样的“存储单元”组成一列,然后使用T7/T8控制整列信号的读写。于是在T5/T6行开关、T7/T8列开关的配合下,就可以选中某行某列的单个“存储单元”。下面给出其读操作、写操作过程:

图4-11 SRAM——六管SRAM(存储单元)、Intel 2114外特性、存储矩阵电路
  • 六管SRAM读操作:行选择打开T6、列选择打开T8,T1~T4数据输出到Dout。
  • 六管SRAM写操作:写选择打开写放大器、行选择打开T5/T6、列选择打开T7/T8,Din数据输入到T1~T4。

Intel 2114中的存储单元正是上述“六管SRAM”。上中间图是芯片外特性, WE ‾ \overline{\text{WE}} WE(write enable)、 CS ‾ \overline{\text{CS}} CS(chip select) 控制数据的写入/读出,A9~A0为10位的地址,I/O1~I/O4为4位的数据,于是芯片容量是 1 K × 4 bit 1\text{K}\times 4\text{bit} 1K×4bit。在芯片内部,采用“重合法”将其分成 64个行地址、16个列地址,由于单个存储单元输出4位,于是将16个列地址重复4次,就实现了单次对4位数据的读/写。

  本段介绍使用三管DRAM作为存储单元的动态RAM(DRAM)。DRAM使用电容保存0/1数据,如下左图使用T2/T3/T4三个晶体管作为开关、Cg作为存储电容,组成“三管DRAM”:

图4-12 DRAM——三管DRAM(存储单元)、Intel 1103存储矩阵电路
  • 三管DRAM读数据:首先需要拉高预充电信号T4导通,然后拉高读选择线导通T2,此时读数据线和Cg状态相反,所以需要在读数据线上加非门。
  • 三管DRAM写数据:拉高写选择线T3导通,此时写数据线和Cg状态相同

Intel 1103的存储单元正是“三管DRAM”。如上右图所示,可以看到其有 32个行读选择+32个行写选择、32个列选择,所以其存储容量为 2 10 = 1 K × 1 bit 2^{10}=1\text{K}\times 1\text{bit} 210=1K×1bit。给出相应的写选择/读选择、地址,就可以完成读写操作。注意上右图中的“三角”是“刷新放大器”,这是因为每次读取数据都会导致电容少量漏电,所以DRAM需要定期刷新,本小节最后还会介绍刷新策略。

  本段介绍使用单管DRAM作为存储单元的动态RAM(DRAM)。之所以放在三管DRAM之后,是因为其内部的存储矩阵电路有点新花样。如下左图,单管DRAM结构简单,使用T作为开关、Cs作为存储电容,组成“单管DRAM”:

图4-13 DRAM——单管DRAM(存储单元)、Intel 4116外特性、存储矩阵电路
  • 单管DRAM:字线就是读写控制线,读写数据总是和Cs状态相同

Intel 4116的存储单元正是“单管DRAM”,其容量为 16 K × 1 bit 16\text{K}\times 1\text{bit} 16K×1bit,理论上需要14根地址线,但是其实际上只有 7根地址线 A6~A0,采用分时复用的方式分别输入到行地址缓冲器、列地址缓冲器,达到14根地址线的效果。另外,芯片有一个小的控制器“时序与控制”负责产生时钟给内部使用,右侧的“I/O缓存器”则负责完成数据的输入输出的缓冲。下右图则给出了内部电路,最关键的是“读放大器”,相当于双向的非门,作用是增强电路的驱动能力。位于“读放大器”左侧的存储单元,写入时被反向,输出时再次被反向,数据相当于没变化;位于右侧的存储单元,则是正常的读写逻辑:

  最后讲一下DRAM的刷新策略。由于DRAM使用电容存储信息,每次读出数据、随着时间的流逝,电容会逐渐漏电,所以DRAM需要定期的刷新。注意,刷新时都是一次性刷新一行,而不是只对某个存储单元刷新,比如对于上图4-12的三管DRAM内部电路,刷新时将行读选择线、行写选择线同时打开,那么连接在读数据线和写数据线之间的“刷新放大器”就可以给电容刷新,就可以完成对一行存储单元的刷新。主要有以下三种刷新策略:

图4-14 集中刷新、分散刷新、异步刷新

假设存储矩阵为 128行×128列、存取周期为0.5us,要求2ms全部刷新一次。

  • 集中刷新:统一进行刷新。也就是在2ms周期的最后完成所有数据的刷新,这段时间DRAM无法读写数据,也称为“死区”。假设存取周期为 0.5us,“死时间率”为 128 / 4000 = 3.2 % 128/4000=3.2\% 128/4000=3.2%
  • 分散刷新:不断按行遍历,先看看是否需要读写数据,然后马上刷新该行。显然是过度刷新,且降低读写性能。
  • 异步刷新:集中刷新和分散刷新相结合。将2ms切割成128份,每份时间片(15.6us)的最后刷新一行。从单个时间片看是集中刷新,从整体看是分散刷新,刷新安排合理时不会影响正常读写,比如将刷新安排在指令译码阶段。
表4-1 动态RAM和静态RAM的比较
比较内容存储原理集成度芯片引脚功耗价格速度刷新用途
DRAM电容主存
SRAM触发器缓存

4.2.4 只读存储器(ROM)

  ROM一般用于保存无需修改的系统程序、系统配置信息。下图给出了ROM的发展历程,以及每个阶段的代表产品:

改进1
改进2
改进3
改进4
早期ROM无法修改
一次性可写
光擦电写,耗时长
电可擦写,需要特定设备
电可擦写,直连计算机
图4-15 ROM的发展历程
  1. 掩模ROM(MROM):厂家写定,无法修改。如下图所示,行列选择线交叉处有MOS管为“1”、无MOS管为“0”。

  2. PROM(一次性编程):用户可以写入,但只能一次性编程。熔丝断为“0”、熔丝未断为“1”。

  3. EPROM(多次性编程):用户可以反复电写入、紫外线照射(15min)擦洗。存储单元使用N型沟道浮动栅MOS电路,D端加正电压,形成浮动栅,S与D不导通为“0”;D端不加正电压,不形成浮动栅,S与D导通为“1”。

  4. EEPROM(多次性编程):电可擦写,可以局部擦写、全部擦写。

  5. Flash Memory(闪速型存储器):价格便宜、集成度高,使用起来类似于RAM,且掉电不易失。

参考视频:关于存储器ROM,你知道哪些?|| 存储器系列(1)

4.2.5 *存储器与CPU的连接

  CPU的执行指令、数据、运行结果都保存在主存中,所以实现CPU和主存之间的正确连接非常重要。通常CPU地址线比较多、寻址空间范围比较大,所以 “主存”一般由多个存储芯片组成,来扩展存储器容量。通常有以下三种扩展方式:

图4-16 位扩展、字扩展、同时扩展
  • 位扩展:扩展数据线,增加存储字长。如上左图,用2片1K×4位存储芯片组成1K×8位的存储器,同时工作
  • 字扩展:扩展地址线,增加存储字数量。如上中图,用2片1K×8位存储芯片组成2K×8位的存储器,不同时工作
  • 同时扩展:同时扩展数据线、地址线。如上右图,用8片1K×4位存储芯片组成4K×8位的存储器,先两个一组位扩展、再四组字扩展。

注:对地址/数据进行扩展时,CPU和存储芯片无需按序连线,只需要保证每个存储芯片取出的位数地址一致。

下面借助两个习题,帮助大家加深对于“扩展”的理解,以及如何将CPU和存储器正确连接:

存储器与CPU的连接的思路:

  1. 地址线的连接:字扩展,高位连接片选信号。
  2. 数据线的连接:位扩展,数据分开连接。
  3. 读/写命令线的连接。
  4. 片选线的连接。
  5. 合理选择存储芯片。
  6. 其他:时序、负载。讲课时不关注。

【例4.1】设CPU有16根地址线、8根数据线,并用 MREQ ‾ \overline{\text{MREQ}} MREQ 作为访存控制信号(低电平有效),用 WR ‾ \overline{\text{WR}} WR 作为读/写控制信号(高电平为读,低电平为写)。现有下列存储芯片:1K×4位RAM、4K×8位RAM、8K×8位RAM、2K×8位ROM、4K×8位ROM、8K×8位ROM及74138译码器和各种门电路,如下图所示。画出CPU与存储器的连接图,要求如下:

  1. 主存地址空间分配:16’h6000~16’h67FF为系统程序区。16’h6800~16’h6BFF为用户程序区。
  2. 合理选用上述存储芯片,说明各选几片。
  3. 详细画出存储芯片的片选逻辑图。

注:38译码器的非数据的三个输入就是使能信号。

  1. 写出对应的二进制地址码:系统程序区无需修改使用ROM,地址范围2K;用户程序区使用RAM,地址范围1K。
  1. 确定芯片的数量及类型:系统程序区直接使用1片2K×8位ROM,用户程序区使用2片1K×4位RAM(位扩展)

  2. 分配地址线:

  • 系统程序区直接使用,地址线11位,数据线8位。
  • 用户程序区的两个芯片“位扩展”,直接共用地址线(低10位)、分用数据线(高4位、低4位)。
  • 系统程序区和用户程序区“字扩展”,两者一共需要3K,也就是12位地址线,剩下的4位都是固定值。于是系统程序区使用 A11=0 控制片选,用户程序区使用 [A11,A10]=2’b10 控制片选。
  1. 确定片选信号:直观上,系统程序区的片选信号直连A11,用户程序区的片选信号则是 A11=1 & A10=0 即可。另外还要注意当 [A15,A14,A13,A12]≠4’b0110、或者 MREQ ‾ \overline{\text{MREQ}} MREQ 为高时,所有片选信号都应拉低。正确答案显然不止一种,下面是一种利用了38译码器的答案之一:

细节:地址线单向、数据线双向。

【例4.2】假设同前,要求最小4K为系统程序区,后续相邻8K为用户程序区。

  1. 写出对应的二进制地址码:系统程序区使用ROM,地址范围4K(12位);用户程序区使用RAM,地址范围8K(13位)。
  1. 确定芯片的数量及类型:系统程序区直接使用1片4K×8位ROM,用户程序区使用2片4K×8位RAM(字扩展)。之所以不使用1片8K×8位RAM,是因为使用两片的片选信号设置更简洁。
  2. 分配地址线、片选信号,如下图:

4.2.6 存储器的校验

本小节问题:

  • 1、为什么要对存储器的信息进行校验?
  • 2、为了能够校验出信息是否正确,如何进行编码?
  • 3、纠错或检错能力与什么因素有关?
  • 4、校验出信息出错后是如何进行纠错?
  • 5、除了我们教材上讲的校验码,你还知道哪些容错编码?原理是什么?——奇偶校验、冗余备份

本节主要介绍汉明码

注:汉明编码的最小距离是3。
代码实现可以查看:实验六-线性分组码的MATLAB实现

  如果内存的电磁环境比较复杂,或者是在空间环境下受带电粒子的打击,就可能会造成电容充放电或触发器翻转,导致信息出错,此时就需要进行数据校验,以避免程序错误甚至宕机。数据校验的基本思路就是,使用额外的数据空间保存校验值,虽然降低了有效数据占用率,但是可以增加数据的准确性。编码的纠错、检错能力与编码的最小距离有关,这个“最小距离”就是任意两组合法代码之间二进制位数的最少差异。编码的最小距离 L L L、检测错误的位数 D D D、纠正错误的位数 C C C 之间的关系为:
L − 1 = D + C ( D ≥ C ) L-1=D+C(D\ge C) L1=D+C(DC)

  汉明码是具有一位纠错能力的编码,采用分组的奇偶校验,下图给出其通俗的原理解释。假设数据分组长度为7(有效数据4个、校验位3个),将其按照圆圈所示分成3组([1,3,5,7]、[2,3,6,7]、[4,5,6,7]),将有效数据放在3、5、6、7四个位置,然后按照“偶校验”分别计算出3个校验位放在1、2、4(自成一组的位置)。接收端则按照下左图圆圈计算三个校验值[P3,P2,P1],即可进行一位纠错,比如000就是没有错;001就是只有第一组出错,也就是1;101就是只有第一组和第三组出错,也就是两者重合的5;111就是三组都出错,也就是7。也就是说,汉明码分组的关键在于将某一位相同的数字放在一起,如下右图所示。注意第 i i i 个“校验值”放在 2 i 2^i 2i 位置,是因为 2 i 2^i 2i 是第 i i i 个分组的唯一一个独有元素,不会影响其他校验值的计算。最后,若原始数据长度为 n n n检测位的个数 k k k 应满足:
2 k ≥ n + k + 1 2^k\ge n+k+1 2kn+k+1

图4-17 汉明码的分组示意图

下面通过两个例子理解汉明码的编码、译码、纠错过程。

【例4.4】求0101按“偶校验”配置的汉明码。
n = 4 n=4 n=4,根据 2 k ≥ n + k + 1 2^k\ge n+k+1 2kn+k+1 k = 3 k=3 k=3,于是分组([1,3,5,7]、[2,3,6,7]、[4,5,6,7]),如下图可得0101的汉明码为0100101。

【例4.5】已知接收到的汉明码为0100111,(按偶校验配置)试问要求传送的信息是什么?
直接计算三个校验位 P 1 = 1 ⊕ 3 ⊕ 5 ⊕ 7 = 0 \text{P}_1=1\oplus3\oplus5\oplus7=0 P1=1357=0 P 2 = 2 ⊕ 3 ⊕ 6 ⊕ 7 = 1 \text{P}_2=2\oplus3\oplus6\oplus7=1 P2=2367=1 P 4 = 4 ⊕ 5 ⊕ 6 ⊕ 7 = 1 \text{P}_4=4\oplus5\oplus6\oplus7=1 P4=4567=1,于是[P4,P2,P1]=3’b110=6,也就是第6位出错。纠正为0100101,原信息应该是0101。

注:如果出错的正好是校验位,那么也可以不纠正,因为接收端只关心原信息。

4.2.7 提高访存速度的措施

  自1985到现在以来,由于采用了RISC技术,CPU的访问速度提升明显超过存储器(“剪刀差”),尽管存储器的容量在不断扩大,但依旧跟不上CPU的访问速度,进而制约了整个计算机系统的性能,称为“存储墙”。于是就需要提高访存速度

  1. 采用高性能存储芯片:
  • SDRAM(同步DRAM):前面介绍的都是异步DRAM,CPU不知道异步RAM何时给数据,所以只能空等。而SDRAM在CPU时钟的控制下进行读写,CPU知道几个周期后会有数据,所以可以先去做其他事情。现在主流的内存条DDR3、DDR4、DDR5都是SDRAM。
  • RDRAM:由RAMBUS公司开发,主要解决存储器带宽问题,因为必须成对使用且成本高昂所以被市场淘汰。
  • 带Cache的DRAM:在DRAM的芯片内集成了一个由SRAM组成的Cache,每次读取数据时,都会将本行所有数据存储到cache中,有利于猝发式读取。
  1. 采用层次结构Cache-主存(4.1.2节-存储器的层次结构):cache是SRAM,速度快、集成度低、功耗高、价格贵。可以将CPU常用信息存储在小容量chache中,放在主存与CPU之间作为缓冲。下一节介绍其地址映射原理。
  2. 调整主存结构:主要有两种结构,“单体多字系统”、“多体并行系统”。介绍如下。

单体多字存储器”是以整体的方式一次性从主存中取出多个机器字,比如下图中存储器的存储单元字长是CPU字长的4倍。缺点是,为保证能够写入单个字,需要为存储器增加额外的写入控制电路;另外若所需指令/数据不连续,此结构失去意义。总结就是,需要改变存储周期,才能增加存储器的带宽。如下图:

图4-18 单体多字存储器

多体存储器”的思想就是希望能使用多个存储体组成一个整体,存储体之间并行工作,就可以增加存储器带宽。直观的思想是借助前面“4.2.5节-存储器与CPU的连接”中的“字扩展”方式,也就是“多体存储器”的“高位交叉”编址方式(下左图)。但由于程序都是连续存放在存储单元中,“高位交叉”显然无法使存储器并行工作,于是便采用“低位交叉”的编址方式(如下中图),就可以使多个存储体采用流水线的形式并行工作(如下右图)。总结就是,“高位交叉”只增加存储器容量,“低位交叉”不改变存取周期,同时增加存储器容量和顺序读写带宽。如下图:

图4-19 多体存储器:高位交叉-顺序编址、低位交叉-轮流编址、四位低位交叉的流水线工作方式

上右图周期计算:假设单存储体存取周期为 T T T,总线传输周期为 τ \tau τ,且满足 T = 4 τ T=4\tau T=4τ。此时便采用“四体多存储器”,连续读取4个字所需的时间为 T + ( 4 − 1 ) τ T+(4-1)\tau T+(41)τ

4.2.8 习题讲解

【习题4.6】某机字长为32位,其存储容量是64KB,按字编址其寻址范围是多少?若主存以字节编址,试画出主存字地址和字节地址的分配情况。

注:若无特别说明,机器字长=存储字长=指令字长

按字编址的寻址范围: 64 KB / 32 bit = 2 16 Byte / 4 Byte = 16 K word 64\text{KB} / 32\text{bit} = 2^{16}\text{Byte} / 4\text{Byte} = 16\text{K word} 64KB/32bit=216Byte/4Byte=16K word
下图是按字节编址的地址分配(假设以高位字节地址为字地址),为了能访问到每个字节需要16位地址:

【习题4.14】某8位微型计算机地址码为18位,若使用 4Kx4位 的RAM芯片组成模块板结构的存储器,试问:
(1) 该机所允许的最大主存空间是多少?
(2) 若每个模块板为 32Kx8位,共需几个模块板?
(3) 每个模块板内共有几片RAM芯片?
(4) 共有多少片RAM?
(5) CPU如何选择各模块板?

  1. 最大主存空间: 2 18 × 8 bit = 256 KB 2^{18}\times 8\text{bit}=256 \text{KB} 218×8bit=256KB
  2. 需要 ( 256 K × 8 bit ) / ( 32 K × 8 bit ) = 8 (256\text{K}\times 8\text{bit})/ (32\text{K}\times 8\text{bit})=8 (256K×8bit)/(32K×8bit)=8 个模块板。
  3. 需要 ( 32 K × 8 bit ) / ( 4 K × 4 bit ) = 16 (32\text{K}\times 8\text{bit})/ (4\text{K}\times 4\text{bit})=16 (32K×8bit)/(4K×4bit)=16 个RAM芯片。
  4. 一共需要 8 × 16 = 128 8\times 16=128 8×16=128 个RAM芯片。
  5. 两片RAM“位扩展”成一个基本的存储片、8个存储片“字扩展”组成一个模块块、8个模板块再“字扩展”组成最终的主存。于是主存的地址格式如下图:

【习题4.15】设CPU共有16根地址线,8根数据线,并用 MREQ ‾ \overline{\text{MREQ}} MREQ (低电平有效)作访存控制信号, R / W ‾ \text{R}/\overline{\text{W}} R/W 作读/写命令信号(高电平为读,低电平为写)。现有这些存储芯片:ROM(2Kx8位,4Kx4位,8Kx8位),RAM(1Kx4位,2Kx8位,4Kx8位)及74138译码器和其他门电路(门电路自定)。
试从上述规格中选用合适的芯片,画出CPU和存储芯片的连接图。要求如下:
(1) 最小4K地址为系统程序区,4096~16383地址范围为用户程序区。
(2) 指出选用的存储芯片类型及数量。
(3) 详细画出片选逻辑。

  1. 写出对应的二进制地址码:系统程序区地址范围 4 K 4\text{K} 4K;用户程序区地址范围 4 K ∼ 16 K − 1 = 12 K 4\text{K}\sim 16\text{K}-1=12\text{K} 4K16K1=12K
  1. 确定芯片的数量及类型:
  • 系统程序区用ROM:两片 2Kx8位 位扩展,或者是两片 4Kx4位 字扩展。
  • 用户程序区用RAM:使用三片 4Kx8位 字扩展。
  1. 分配地址线、片选信号:可以看到选用两片 4Kx4位 ROM芯片的片选信号设置更简洁。
  • 系统程序区两片 4Kx4位 ROM进行字扩展:
  • 系统程序区两片 2Kx8位 ROM进行位扩展:

【习题4.16】CPU假设同上题,现有8片 8Kx8位 的RAM芯片与CPU相连。
(1) 用74138译码器画出CPU与存储芯片的连接图。
(2) 写出每片RAM的地址范围。
(3) 如果运行时发现不论往哪片RAM写入数据,以A000H为起始地址的存储芯片都有与其相同的数据,
分析故障原因。
(4) 根据(1)的连接图,若出现地址线 A 13 \text{A}_{13} A13 与CPU断线,并搭接到高电平上,将出现什么后果?

  1. 地址线全部用完,则地址线高三位作为38译码器输入,38译码器的每个输出都对应一个片选信号,如下左图:
  1. 地址按顺序存储,如上右图。
  2. 起始地址为 16’b1010 0000 0000 0000,也就是 RAM5 片选信号始终为低电平,可能原因有:
  • 38译码器损坏,输出 Y 5 ‾ \overline{\text{Y}_5} Y5 始终为低电平。
  • RAM5 的片选端与 R / W ‾ \text{R}/\overline{\text{W}} R/W 端错连或短路。
  • RAM5 的片选端与CPU的 MREQ ‾ \overline{\text{MREQ}} MREQ 端错连或短路;
  • RMA5 的片选端与地线错连或短路。
  1. CPU只能访问 Y 1 ‾ \overline{\text{Y}_1} Y1 Y 3 ‾ \overline{\text{Y}_3} Y3 Y 5 ‾ \overline{\text{Y}_5} Y5 Y 7 ‾ \overline{\text{Y}_7} Y7 对应的RAM,另外四个RAM永远无法访问。

【习题4.23】设CPU共有16根地址线,8根数据线,并用 M / IO ‾ \text{M}/\overline{\text{IO}} M/IO 作为访问存储器或 I/O 的控制信号(高电平为访存,低电平为访 I/O), WR ‾ \overline{\text{WR}} WR(低电平有效)为写命令, RD ‾ \overline{\text{RD}} RD(低电平有效)为读命令。设计一个容量为64KB的采用低位交叉编址的8体并行结构存储器。现有下图所示的存储芯片及138译码器。

画出CPU和存储芯片(芯片容量自定)的连接图,并写出图中每个存储芯片的地址范围(用十六进制数表示)。

  1. 写出对应的二进制地址码:要设计8体 64KB 存储器,且CPU字长为8,那么单个RAM存储容量应为 8 K × 8 bit 8\text{K}\times 8\text{bit} 8K×8bit
  1. 确定芯片的数量及类型:题目已经选好了,显然是需要8片 8K×8位 RAM。

  2. 分配地址线、片选信号:CPU地址线高13位作为8片RAM的地址线、低3位作为38译码器输入,38译码器输出作为片选信号。

4.3 *高速缓冲存储器

4.3.1 概述

  • 缓存:SRAM,容量小、价格高、集成度低、速度快。
  • 主存:DRAM,容量大、价格低、集成度高、速度相对慢。

  前面介绍到,随着科技的发展,“CPU”的访问速度已经大于“主存”的读写速度,这已经成为现代计算机系统的性能提升瓶颈。根据程序局部性原理,我们便可以采用“缓存Cache”作为CPU和“主存”之间的缓冲,将CPU最近访问的数据保存在“缓存”中,就可以使CPU尽可能多的访问速度更快的Cache。下图给出了主存、缓存的存储空间结构,两者都是按块存储且块的大小相同,存储时对应块的数据完全相同。注意 “块长 B B B” 应取一个存取周期内从主存调出的信息长度,比如“Cray-1计算机”采用16体交叉编址,那么 B = 16 B=16 B=16;IBM 370/168采用4体交叉编址,那么块长 B = 4 B=4 B=4 B B B 太大或太小都会导致CPU命中率降低。如下:

图4-20 主存、缓存的存储空间结构

一些基本概念:

  • B B B 表示单个块的大小、 M M M 表示主存的块数、 C C C 表示缓存的块数, M ≫ C M\gg C MC
  • 主存地址:分成“主存块号+块内地址”。
  • 缓存地址:分成“缓存块号+块内地址”,地址映射会用到。
  • 缓存的 标记:也就是 主存块号,表示 主存块 和 缓存块 的对应关系。
  • 命中:CPU要读取的主存数据地址正好映射在缓存中。反之就是“未命中”。
  • 命中率 h h h:CPU要访问的数据在Cache中的占比, h h h 与Cache的容量、块长有关,详见“计算机体系结构”课程。
  • 访问效率: e = 访问Cache的时间 平均访问时间 × 100 % e=\frac{\text{访问Cache的时间}}{\text{平均访问时间}}\times 100\% e=平均访问时间访问Cache的时间×100% e e e 与命中率 h h h 有关,假设Cache命中率为 h h h,访问Cache的时间为 t c t_c tc,访问主存的时间为 t m t_m tm,那么:
  • CPU同时访问主存、缓存(并行访问)的效率 e = t c h ⋅ t c + ( 1 − h ) t m × 100 % e = \frac{t_c}{h \cdot t_c + (1-h)t_m}\times 100\% e=htc+(1h)tmtc×100%
  • CPU先访问缓存、再访问主存(串行访问)的效率为 e = t c t c + ( 1 − h ) t m × 100 % e = \frac{t_c}{t_c + (1-h)t_m}\times 100\% e=tc+(1h)tmtc×100%

  那具体来说,CPU是如何读写数据呢?下左图给出了Cache的基本结构框图,右侧是CPU、左侧是主存,其中标红的是关键结构。CPU读写数据的基本步骤为:

图4-21 Cache的基本结构框图、CPU读数据的流程

CPU读数据的基本步骤:

  1. 查看是否命中:CPU向地址总线发送主存地址,然后“主存Cache地址映射变换机构”会将主存地址映射成Cache地址,查看是否命中。若命中跳转步骤2、未命中跳转步骤3。
  2. Cache发送数据:命中后“Cache存储体”直接将相应的数据发送到数据总线。
  3. 主存发送数据:未命中则由主存将数据发送到数据总线,并将该数据所在的“块”通过“直接通路”同步给Cache。若Cache未满可以直接写入;若Cache已满,则需要由“Cache替换机构”决定将哪个块替换掉写入新的块。

CPU写数据的基本步骤:关键要保证Cache和主存数据的一致性,有以下两种不同的规则。

  • 写直达法/写通过法(Write-through):写操作时数据既写入Cache又写入主存。写操作时间就是访问主存的时间,Cache块退出时不需要对主存执行写操作,更新策略比较容易实现。缺点是对相同地址反复写入时会导致数据更新慢,比如求累加和。
  • 写回法(Write-back):写操作时数据只写入Cache而不写入主存,当Cache数据被替换出去时才写回主存。写操作时间就是访问Cache的时间Cache块退出时再将被替换的块写回主存增加了Cache的复杂性。缺点是多处理器时,每个处理器的Cache数据均不一致,且均和主存不同,详见“并行体系结构”课程。

  最后来介绍两个Cache的改进方法

  1. 增加Cache的级数:除了片外的Cache,还可以将离CPU较近的Cache直接集成到CPU片内。如CPU的三级缓存,每个核都有自己的Cache,所有核还有共用的Cache。
  2. 统一缓存和分立缓存:“分立缓存”就是将“指令”和“数据”分别保存在不同的Cache中。如果指令执行的控制方式采用超前控制或流水线控制,就可以使用“分立缓存”,比如 Pentium 使用8K指令Cache、8K数据Cache;PowerPC620 使用32K指令Cache、32K数据Cache。

4.3.2 *Cache-主存的地址映射

  “地址映射”就是将“主存地址”映射为“地址”。主要有以下三种映射方法,注意每个“字块”中都有若干字节:

图4-22 直接映射、全相联映射、组相联映射
  1. 直接映射:将主存按照Cache的大小分成若干组,每个主存块只能存放在相应位置的Cache块中。每个Cache块都和若干个主存块对应,每个主存块只和一个Cache块对应。优点是“主存字块”只需和Cache的单个“标记”进行比较,比较电路结构简单、速度快。缺点是Cache利用率低,冲突概率大。
  2. 全相联映射:主存中的任一块可以映射到缓存中的任一块。优点是Cache利用率高。缺点是“主存字块”需要和Cache的所有“标记”同时进行比较,并且比较位数更长,所以比较电路更加复杂、速度慢
  3. 组相联映射【现代常用】:上面是两个极端,下面各取所长。将Cache分成若干“组”,每组都有若干个字块组成,此时再按照“组”的总数 Q Q Q 对主存进行分组。主存块 j j j Q Q Q 即可映射到缓存的第 i i i 组中,主存块 j j j 可以是 Cache第 i i i 组的任一块。优点是比“直接映射”有更高的Cache利用率,并且比较电路只需比较Cache组内的所有标记,而不是所有“标记”,比较电路结构比“全相联映射”简单得多

注:靠近CPU的Cache追求更高的速度,会选择“直接相连”、组长较小的“组相联映射”。
注:远离CPU的Cache追求更高的利用率,可以使用“全相联映射”。

4.3.3 替换算法

  “替换算法”指的是当Cache中字块满时,需要删除旧字块、写入新字块的替换策略:

  1. 先进先出(FIFO)算法:删除写入时间最早的块。可能是需要频繁读取的系统参数,没有很好的体现“程序局部性原理”。
  2. 近期最少使用(LRU)算法:删除调用次数最少的块。较好的体现了“程序局部性原理”,应用较广。
  3. 随机法:随机删除一个块。虽然电路简单,但不能提高Cache命中率,一般不用。

4.4 辅助存储器

辅助存储器
电磁感应定律
热磁效应
硬磁盘存储器:机械硬盘
软磁盘存储器:软盘
磁带
光盘
图4-23 辅助存储器分类

  虽然教材篇幅较长,但本小节不是重点,下面简要介绍。“辅存”的作用保存短时间用不到或者体积很大的程序、图像、文档,不直接与CPU交换信息。最常用的“辅存”就是利用了“电磁感应定律”的“磁表面存储器”,比如“机械硬盘”/“软盘”,常见的技术指标如下:

  1. 记录密度:道密度 D t D_t Dt、位密度 D b D_b Db D t D_t Dt 指径向方向的磁道密度, D b D_b Db 指磁道(一圈)的数据密度。
  2. 存储容量: C = n × k × s C=n\times k \times s C=n×k×s,也就是盘片数量×磁道数量×单磁道存储的位数。
  3. 平均寻址时间:寻道时间+等待时间。辅存的速度受平均寻址时间、磁头读写时间等因素影响。
  4. 数据传输率: D r = D b × V D_r=D_b\times V Dr=Db×V V V V 表示磁盘旋转速度。
  5. 误码率:出错信息位数与读出信息的总位数之比。

磁记录的原理如下图:

图4-24 磁记录写原理、读原理
  • 写原理:写线圈通电,使磁盘表面磁化。
  • 读原理:磁盘运动,在感应线圈中产生电流。

“硬磁盘存储器”和“软磁盘存储器”的结构如下:

图4-25 硬磁盘存储器结构、磁盘驱动器结构、软盘实物图、软盘内部结构

硬磁盘存储器:分为固定磁头、移动磁头(常见);可换盘、固定盘(常见)。由“磁盘控制器”、“磁盘驱动器”、“盘片”三大部分组成。

  1. 磁盘控制器:主机与磁盘驱动器之间的接口,对主机通过总线通信、对硬盘(设备)进行控制。
  • 接收主机发来的命令,转换成磁盘驱动器的控制命令。
  • 实现主机和驱动器之间的数据格式转换。
  • 控制磁盘驱动器读写。
  1. 磁盘驱动器:如上左二图,主要是将“磁头”移动到相应的“磁道”读取数据。
  2. 盘片:由硬质铝合金材料制成。

软磁盘存储器:由聚酯薄膜制成,如上右两图所示。

参考视频:【硬核科普】选购机械硬盘的大坑,不看你就上当,详解SMR瓦楞式堆叠硬盘
参考视频:20年前的软盘是怎么工作的,只有1.44M内存能干啥?拆解看看工作原理
参考视频:软盘不死?还被玩出了花!

表4-2 硬盘和软盘的对比
比较内容硬盘软盘
速度
磁头分为固定、活动,浮动在盘片表面活动,接触盘片
盘片固定盘、盘组大部分不可换可换盘片
价格
环境苛刻不苛刻

  最后介绍一下“光盘”存储器。光盘采用光存储技术,利用激光写入和读出。“只读型”和“只写一次型”光盘利用了热作用(物理或化学变化)存储信息;“可擦写型”光盘则是利用热磁效应。发展历程为:

  • 第一代光存储技术采用非磁性介质,不可擦写。
  • 第二代光存储技术采用磁性介质,可反复擦写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值