赞
踩
- 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理(上)_哈尔滨工业大学》、《计算机组成原理(下)_哈尔滨工业大学》。
- 或者是B站《计算机组成原理(哈工大刘宏伟)135讲(全)高清》,大家一起听比较热闹。
- 中文教材:《计算机组成原理(第二版)-唐朔飞.pdf》、《学习指导与习题解答(第2版)-唐朔飞.pdf》
- 本篇笔记对应课程第四章(下图加粗)。
加星号的目录为本章重点。
本节问题:
- 存储器可分哪些类型?
- 现代存储器的层次结构,为什么要分层?
存储器是计算机系统最重要的部件之一,执行程序时程序、指令都来自于存储器,执行结果也保存在存储器中。存储器分类的判定标准非常多,比如存储容量、存储介质、存储器位置、存储器作用等,下图给出了三种分类方法:
按存储介质分类:半导体、磁、光(下面看似四种,本质是三种)。
- 半导体存储器:较为常见,主要分为TTL(晶体管)、MOS(金属氧化物半导体)两种类型,TTL型存储器集成度低、功耗高、但速度快;MOS型存储器集成度高、功耗低。所以内存条上的内存颗粒、U盘一般都是MOS型存储器。
- 磁表面存储器:需要有磁头、载磁体,比如磁盘(机械硬盘)、磁带。以磁盘来说,在塑料/合金的基片涂上一层磁层,再将这个磁盘分成若干个同心圆磁道,再按照固定角度切割成不同的扇区,每个扇区可以按照磁层小格子的0/1存储几百~几千个比特。
- 磁芯存储器:是早期计算机系统的内存,由硬磁材料、环状元件构成。本质上利用了磁化材料,使用两根电流线磁化某个硬磁材料,然后读出磁场方向表示0/1。
- 光盘存储器:本质上和机械硬盘差不多,只是采用激光、磁光材料。
按存取方式分类:
- 随机访问:给出不同的物理地址,可以在相同时间内写入/读出。又分为随机存储器(可读/可写)、只读存储器。
- 串行访问:存取时间与物理地址有关,又分为顺序存取存储器(磁带)、直接存取存储器(磁盘)。磁带想听刚才的对话只能倒带;磁盘(机械硬盘)则是不同数据的寻址时间不一样,只能给出平均寻址时间。
参考视频:【CSAPP-深入理解计算机系统】6-2. 机械磁盘——4:12s介绍机械磁盘对扇区的访问时间
按在计算机中的作用分类:主存储器、高速缓冲存储器后面会详细介绍。
- 主存储器:RAM可读可写,可以存储用户程序;ROM只读,比如主板上存储BIOS的芯片。
- Flash Memory:是半导体存储器,比如U盘。通常会作为“主存储器”和“辅助存储器”之间的桥梁,弥补两者读写速度差距过大的问题,比如固态硬盘上的“缓存”芯片。
- 高速缓冲存储器(Cache):通常是静态RAM,比Flash Memory、主存都快,作为CPU和主存储器之间的缓冲。
- 辅助存储器:磁盘、磁带、光盘。
在使用存储器的时候,用户最关心三个指标:速度、容量、价格。实际上没有任何一种存储器能同时实现速度快、容量大、价格低,于是便需要多种不同层次的存储器形成一个“存储体系”。“存储体系”指的是使用两种及以上存储器,采用软件、硬件、软硬件结合的方式连接成一个整体,使得从某一级程序员的角度看,这个整体具有速度快、容量大、价格低的特性。下图给出了计算机中存储器的层次结构,可以看到越往下,速度越慢、容量越大、价格越低:
- 寄存器:这里指的是集成在CPU中的寄存器,IO端口中也有寄存器。分为对程序员透明的“体系结构寄存器”、对程序员不透明的“非体系结构寄存器”。
- 缓存:早期CPU中没有缓存,随着技术发展部分缓存集成到CPU中提升读写速度,部分缓存在外提升存储容量。
- 寄存器、主存、缓存构成主机中的存储器,剩下的辅存则是外接的IO设备。
进一步来说,存储器的层次结构主要体现在“缓存-主存层次”、“主存-辅存层次”这两个存储层次上。正常来说,在运行程序时只有两个主体——CPU、“主存”,CPU从主存读信息、并将运行结果写入到主存中。但是随着科技发展,对运行速度和存储容量有了更高的要求,于是便有了“缓存”、“辅存”解决这两个问题,如下图所示:
- 缓存-主存层次:解决“CPU”和“主存”速度不匹配的问题。早期CPU和主存速度相当,但随着科技发展,CPU速度提升速率明显大于“主存”,两者的速度提升差距称为“剪刀差”。于是引入“缓存(cache)”,虽然功耗大、容量小,但是速度比主存快得多,将CPU常用数据放在“缓存”中(程序的局部性原理)。为了保证速度,直接采用纯硬件方法将“主存”、“缓存”连接在一起,对系统程序员、机器语言程序员无需关心两者的区别。注意“缓存”的地址是“实地址”,也就是实际的“物理地址”,CPU只知道“主存”地址,只不过“缓存”会将“主存地址”转换成自己的“块编号+块内偏移地址”。
- 主存-辅存层次:解决“主存”容量有限的问题。使用软硬件结合的方法将“主存”、“辅存”构成一个整体,将文档、视频等大文件存储到“辅存”中。从应用程序员角度看,这个整体有“主存”的速度、“辅存”的容量,无需自己手动为数据划分存储位置。注意“辅存”的地址是“虚地址”,也就是“逻辑地址”。
下图给出了主存的基本组成,其中存储体、MAR、MDR在前面“1.3 计算机的工作步骤”已经介绍过,下面来分析更细化的结构。MAR地址寄存器中的地址要经过“译码器”进行译码,才能选定指定的存储单元;MDR数据寄存器则是由“控制电路”和“读写电路”进行控制,决定数据从存储体读出、向存储体写入。如下图所示:
下图给出了主存与CPU之间的联系,主要分成三类信号:数据总线、控制总线、地址总线。下图中只给出读/写两个控制信号,还有其他的控制信号后续会介绍。另外注意数据总线是双向传输、地址总线是单向传输:
下图给出了主存中存储单元地址的分配。假设主存的存储字长是32位,现在要存储32位的16进制数 3 2 ′ h 12345678 32'\text{h}12345678 32′h12345678,那么可以高位字节 8 ′ h 12 8'\text{h}12 8′h12 为字地址、也可以低位字节 8 ′ h 78 8'\text{h}78 8′h78 为字地址(x86机器)。注意下图中每个格子都表示一个字节:
假设地址总线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。
最后是主存的技术指标:
- 存储容量:可以存放的字节数或比特数。
- 存储速度:一般来说,存取时间<存取周期。
- 存取时间:从收到地址到给出/写入数据的总时间,也称为存储器的访问时间。分为读出时间、写入时间。
- 存取周期:连续两次独立的存储器操作(读或写)所需的最小间隔时间,和存储器刷新有关。分为读周期、写周期。
- 存储器的带宽(位/秒):装机常用指标。
下面将主存进一步抽象,给出“半导体存储芯片的基本结构”,也就是“译码驱动”接收地址、“存储矩阵”存储数据、“读写电路”读写数据。从外界来看,主要有以下四类与外界连接的接口信号:
- 地址线:单向输入。利用地址线可以计算存储单元的数量。
- 片选线:一般表示为 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位地址线控制 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 个存储单元。
本小节问题:静态RAM(SRAM)
- 保存0和1的原理是什么?——触发器
- 基本单元电路的构成是什么?——六管SRAM
- 对单元电路如何读出和写入?
- 典型芯片的结构是很么样子的?
- 静态RAM芯片的如何进行读出和写入操作?
本小节问题:动态RAM(DRAM)
- 保存0和1的原理是什么?——电容
- 基本单元电路的构成是什么?——三管DRAM、单管DRAM
- 对单元电路如何读出和写入?
- 典型芯片的结构是很么样子的?
- 动态RAM芯片的如何进行读出和写入操作?
- 动态RAM为什么要刷新,刷新方法?
本小节介绍静态RAM、动态RAM,上面给出了本小节的问题。如下图所示,对于每种RAM,首先会先介绍存储单元的电路结构,明确如何存储0/1数据;然后介绍使用该存储单元电路的芯片的存储矩阵电路,明确如何按照地址读/写数据。
本段介绍使用六管SRAM作为存储单元的静态RAM(SRAM)。SRAM使用触发器保存0/1数据,如下图T1~T4是双稳态触发器、T5/T6则控制是否对触发器进行读/写。T1~T6组成一个单独的“存储单元”(虚线框),许多个这样的“存储单元”组成一列,然后使用T7/T8控制整列信号的读写。于是在T5/T6行开关、T7/T8列开关的配合下,就可以选中某行某列的单个“存储单元”。下面给出其读操作、写操作过程:
- 六管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”:
- 三管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”:
- 单管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内部电路,刷新时将行读选择线、行写选择线同时打开,那么连接在读数据线和写数据线之间的“刷新放大器”就可以给电容刷新,就可以完成对一行存储单元的刷新。主要有以下三种刷新策略:
假设存储矩阵为 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)的最后刷新一行。从单个时间片看是集中刷新,从整体看是分散刷新,刷新安排合理时不会影响正常读写,比如将刷新安排在指令译码阶段。
比较内容 | 存储原理 | 集成度 | 芯片引脚 | 功耗 | 价格 | 速度 | 刷新 | 用途 |
---|---|---|---|---|---|---|---|---|
DRAM | 电容 | 高 | 少 | 小 | 低 | 慢 | 有 | 主存 |
SRAM | 触发器 | 低 | 多 | 大 | 高 | 快 | 无 | 缓存 |
ROM一般用于保存无需修改的系统程序、系统配置信息。下图给出了ROM的发展历程,以及每个阶段的代表产品:
掩模ROM(MROM):厂家写定,无法修改。如下图所示,行列选择线交叉处有MOS管为“1”、无MOS管为“0”。
PROM(一次性编程):用户可以写入,但只能一次性编程。熔丝断为“0”、熔丝未断为“1”。
EPROM(多次性编程):用户可以反复电写入、紫外线照射(15min)擦洗。存储单元使用N型沟道浮动栅MOS电路,D端加正电压,形成浮动栅,S与D不导通为“0”;D端不加正电压,不形成浮动栅,S与D导通为“1”。
EEPROM(多次性编程):电可擦写,可以局部擦写、全部擦写。
Flash Memory(闪速型存储器):价格便宜、集成度高,使用起来类似于RAM,且掉电不易失。
CPU的执行指令、数据、运行结果都保存在主存中,所以实现CPU和主存之间的正确连接非常重要。通常CPU地址线比较多、寻址空间范围比较大,所以 “主存”一般由多个存储芯片组成,来扩展存储器容量。通常有以下三种扩展方式:
- 位扩展:扩展数据线,增加存储字长。如上左图,用2片1K×4位存储芯片组成1K×8位的存储器,同时工作。
- 字扩展:扩展地址线,增加存储字数量。如上中图,用2片1K×8位存储芯片组成2K×8位的存储器,不同时工作。
- 同时扩展:同时扩展数据线、地址线。如上右图,用8片1K×4位存储芯片组成4K×8位的存储器,先两个一组位扩展、再四组字扩展。
注:对地址/数据进行扩展时,CPU和存储芯片无需按序连线,只需要保证每个存储芯片取出的位数地址一致。
下面借助两个习题,帮助大家加深对于“扩展”的理解,以及如何将CPU和存储器正确连接:
存储器与CPU的连接的思路:
- 地址线的连接:字扩展,高位连接片选信号。
- 数据线的连接:位扩展,数据分开连接。
- 读/写命令线的连接。
- 片选线的连接。
- 合理选择存储芯片。
- 其他:时序、负载。讲课时不关注。
【例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与存储器的连接图,要求如下:
- 主存地址空间分配:16’h6000~16’h67FF为系统程序区。16’h6800~16’h6BFF为用户程序区。
- 合理选用上述存储芯片,说明各选几片。
- 详细画出存储芯片的片选逻辑图。
注:38译码器的非数据的三个输入就是使能信号。
确定芯片的数量及类型:系统程序区直接使用1片2K×8位ROM,用户程序区使用2片1K×4位RAM(位扩展)。
分配地址线:
细节:地址线单向、数据线双向。
【例4.2】假设同前,要求最小4K为系统程序区,后续相邻8K为用户程序区。
本小节问题:
- 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)
L−1=D+C(D≥C)
汉明码是具有一位纠错能力的编码,采用分组的奇偶校验,下图给出其通俗的原理解释。假设数据分组长度为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
2k≥n+k+1
下面通过两个例子理解汉明码的编码、译码、纠错过程。
【例4.4】求0101按“偶校验”配置的汉明码。
由 n = 4 n=4 n=4,根据 2 k ≥ n + k + 1 2^k\ge n+k+1 2k≥n+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=1⊕3⊕5⊕7=0、 P 2 = 2 ⊕ 3 ⊕ 6 ⊕ 7 = 1 \text{P}_2=2\oplus3\oplus6\oplus7=1 P2=2⊕3⊕6⊕7=1、 P 4 = 4 ⊕ 5 ⊕ 6 ⊕ 7 = 1 \text{P}_4=4\oplus5\oplus6\oplus7=1 P4=4⊕5⊕6⊕7=1,于是[P4,P2,P1]=3’b110=6,也就是第6位出错。纠正为0100101,原信息应该是0101。注:如果出错的正好是校验位,那么也可以不纠正,因为接收端只关心原信息。
自1985到现在以来,由于采用了RISC技术,CPU的访问速度提升明显超过存储器(“剪刀差”),尽管存储器的容量在不断扩大,但依旧跟不上CPU的访问速度,进而制约了整个计算机系统的性能,称为“存储墙”。于是就需要提高访存速度
- 采用高性能存储芯片:
- SDRAM(同步DRAM):前面介绍的都是异步DRAM,CPU不知道异步RAM何时给数据,所以只能空等。而SDRAM在CPU时钟的控制下进行读写,CPU知道几个周期后会有数据,所以可以先去做其他事情。现在主流的内存条DDR3、DDR4、DDR5都是SDRAM。
- RDRAM:由RAMBUS公司开发,主要解决存储器带宽问题,因为必须成对使用且成本高昂所以被市场淘汰。
- 带Cache的DRAM:在DRAM的芯片内集成了一个由SRAM组成的Cache,每次读取数据时,都会将本行所有数据存储到cache中,有利于猝发式读取。
- 采用层次结构Cache-主存(4.1.2节-存储器的层次结构):cache是SRAM,速度快、集成度低、功耗高、价格贵。可以将CPU常用信息存储在小容量chache中,放在主存与CPU之间作为缓冲。下一节介绍其地址映射原理。
- 调整主存结构:主要有两种结构,“单体多字系统”、“多体并行系统”。介绍如下。
“单体多字存储器”是以整体的方式一次性从主存中取出多个机器字,比如下图中存储器的存储单元字长是CPU字长的4倍。缺点是,为保证能够写入单个字,需要为存储器增加额外的写入控制电路;另外若所需指令/数据不连续,此结构失去意义。总结就是,需要改变存储周期,才能增加存储器的带宽。如下图:
“多体存储器”的思想就是希望能使用多个存储体组成一个整体,存储体之间并行工作,就可以增加存储器带宽。直观的思想是借助前面“4.2.5节-存储器与CPU的连接”中的“字扩展”方式,也就是“多体存储器”的“高位交叉”编址方式(下左图)。但由于程序都是连续存放在存储单元中,“高位交叉”显然无法使存储器并行工作,于是便采用“低位交叉”的编址方式(如下中图),就可以使多个存储体采用流水线的形式并行工作(如下右图)。总结就是,“高位交叉”只增加存储器容量,“低位交叉”不改变存取周期,同时增加存储器容量和顺序读写带宽。如下图:
上右图周期计算:假设单存储体存取周期为 T T T,总线传输周期为 τ \tau τ,且满足 T = 4 τ T=4\tau T=4τ。此时便采用“四体多存储器”,连续读取4个字所需的时间为 T + ( 4 − 1 ) τ T+(4-1)\tau T+(4−1)τ。
【习题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如何选择各模块板?
【习题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) 详细画出片选逻辑。
【习题4.16】CPU假设同上题,现有8片 8Kx8位 的RAM芯片与CPU相连。
(1) 用74138译码器画出CPU与存储芯片的连接图。
(2) 写出每片RAM的地址范围。
(3) 如果运行时发现不论往哪片RAM写入数据,以A000H为起始地址的存储芯片都有与其相同的数据,
分析故障原因。
(4) 根据(1)的连接图,若出现地址线 A 13 \text{A}_{13} A13 与CPU断线,并搭接到高电平上,将出现什么后果?
【习题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和存储芯片(芯片容量自定)的连接图,并写出图中每个存储芯片的地址范围(用十六进制数表示)。
确定芯片的数量及类型:题目已经选好了,显然是需要8片 8K×8位 RAM。
分配地址线、片选信号:CPU地址线高13位作为8片RAM的地址线、低3位作为38译码器输入,38译码器输出作为片选信号。
- 缓存: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命中率降低。如下:
一些基本概念:
- B B B 表示单个块的大小、 M M M 表示主存的块数、 C C C 表示缓存的块数, M ≫ C M\gg C M≫C。
- 主存地址:分成“主存块号+块内地址”。
- 缓存地址:分成“缓存块号+块内地址”,地址映射会用到。
- 缓存的 标记:也就是 主存块号,表示 主存块 和 缓存块 的对应关系。
- 命中: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=h⋅tc+(1−h)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+(1−h)tmtc×100%
那具体来说,CPU是如何读写数据呢?下左图给出了Cache的基本结构框图,右侧是CPU、左侧是主存,其中标红的是关键结构。CPU读写数据的基本步骤为:
CPU读数据的基本步骤:
- 查看是否命中:CPU向地址总线发送主存地址,然后“主存Cache地址映射变换机构”会将主存地址映射成Cache地址,查看是否命中。若命中跳转步骤2、未命中跳转步骤3。
- Cache发送数据:命中后“Cache存储体”直接将相应的数据发送到数据总线。
- 主存发送数据:未命中则由主存将数据发送到数据总线,并将该数据所在的“块”通过“直接通路”同步给Cache。若Cache未满可以直接写入;若Cache已满,则需要由“Cache替换机构”决定将哪个块替换掉写入新的块。
CPU写数据的基本步骤:关键要保证Cache和主存数据的一致性,有以下两种不同的规则。
- 写直达法/写通过法(Write-through):写操作时数据既写入Cache又写入主存。写操作时间就是访问主存的时间,Cache块退出时不需要对主存执行写操作,更新策略比较容易实现。缺点是对相同地址反复写入时会导致数据更新慢,比如求累加和。
- 写回法(Write-back):写操作时数据只写入Cache而不写入主存,当Cache数据被替换出去时才写回主存。写操作时间就是访问Cache的时间,Cache块退出时再将被替换的块写回主存,增加了Cache的复杂性。缺点是多处理器时,每个处理器的Cache数据均不一致,且均和主存不同,详见“并行体系结构”课程。
最后来介绍两个Cache的改进方法:
- 增加Cache的级数:除了片外的Cache,还可以将离CPU较近的Cache直接集成到CPU片内。如CPU的三级缓存,每个核都有自己的Cache,所有核还有共用的Cache。
- 统一缓存和分立缓存:“分立缓存”就是将“指令”和“数据”分别保存在不同的Cache中。如果指令执行的控制方式采用超前控制或流水线控制,就可以使用“分立缓存”,比如 Pentium 使用8K指令Cache、8K数据Cache;PowerPC620 使用32K指令Cache、32K数据Cache。
“地址映射”就是将“主存地址”映射为“地址”。主要有以下三种映射方法,注意每个“字块”中都有若干字节:
- 直接映射:将主存按照Cache的大小分成若干组,每个主存块只能存放在相应位置的Cache块中。每个Cache块都和若干个主存块对应,每个主存块只和一个Cache块对应。优点是“主存字块”只需和Cache的单个“标记”进行比较,比较电路结构简单、速度快。缺点是Cache利用率低,冲突概率大。
- 全相联映射:主存中的任一块可以映射到缓存中的任一块。优点是Cache利用率高。缺点是“主存字块”需要和Cache的所有“标记”同时进行比较,并且比较位数更长,所以比较电路更加复杂、速度慢。
- 组相联映射【现代常用】:上面是两个极端,下面各取所长。将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追求更高的利用率,可以使用“全相联映射”。
“替换算法”指的是当Cache中字块满时,需要删除旧字块、写入新字块的替换策略:
- 先进先出(FIFO)算法:删除写入时间最早的块。可能是需要频繁读取的系统参数,没有很好的体现“程序局部性原理”。
- 近期最少使用(LRU)算法:删除调用次数最少的块。较好的体现了“程序局部性原理”,应用较广。
- 随机法:随机删除一个块。虽然电路简单,但不能提高Cache命中率,一般不用。
虽然教材篇幅较长,但本小节不是重点,下面简要介绍。“辅存”的作用保存短时间用不到或者体积很大的程序、图像、文档,不直接与CPU交换信息。最常用的“辅存”就是利用了“电磁感应定律”的“磁表面存储器”,比如“机械硬盘”/“软盘”,常见的技术指标如下:
- 记录密度:道密度 D t D_t Dt、位密度 D b D_b Db。 D t D_t Dt 指径向方向的磁道密度, D b D_b Db 指磁道(一圈)的数据密度。
- 存储容量: C = n × k × s C=n\times k \times s C=n×k×s,也就是盘片数量×磁道数量×单磁道存储的位数。
- 平均寻址时间:寻道时间+等待时间。辅存的速度受平均寻址时间、磁头读写时间等因素影响。
- 数据传输率: D r = D b × V D_r=D_b\times V Dr=Db×V, V V V 表示磁盘旋转速度。
- 误码率:出错信息位数与读出信息的总位数之比。
磁记录的原理如下图:
- 写原理:写线圈通电,使磁盘表面磁化。
- 读原理:磁盘运动,在感应线圈中产生电流。
“硬磁盘存储器”和“软磁盘存储器”的结构如下:
硬磁盘存储器:分为固定磁头、移动磁头(常见);可换盘、固定盘(常见)。由“磁盘控制器”、“磁盘驱动器”、“盘片”三大部分组成。
- 磁盘控制器:主机与磁盘驱动器之间的接口,对主机通过总线通信、对硬盘(设备)进行控制。
- 接收主机发来的命令,转换成磁盘驱动器的控制命令。
- 实现主机和驱动器之间的数据格式转换。
- 控制磁盘驱动器读写。
- 磁盘驱动器:如上左二图,主要是将“磁头”移动到相应的“磁道”读取数据。
- 盘片:由硬质铝合金材料制成。
软磁盘存储器:由聚酯薄膜制成,如上右两图所示。
参考视频:【硬核科普】选购机械硬盘的大坑,不看你就上当,详解SMR瓦楞式堆叠硬盘
参考视频:20年前的软盘是怎么工作的,只有1.44M内存能干啥?拆解看看工作原理
参考视频:软盘不死?还被玩出了花!
比较内容 | 硬盘 | 软盘 |
---|---|---|
速度 | 高 | 低 |
磁头 | 分为固定、活动,浮动在盘片表面 | 活动,接触盘片 |
盘片 | 固定盘、盘组大部分不可换 | 可换盘片 |
价格 | 高 | 低 |
环境 | 苛刻 | 不苛刻 |
最后介绍一下“光盘”存储器。光盘采用光存储技术,利用激光写入和读出。“只读型”和“只写一次型”光盘利用了热作用(物理或化学变化)存储信息;“可擦写型”光盘则是利用热磁效应。发展历程为:
- 第一代光存储技术采用非磁性介质,不可擦写。
- 第二代光存储技术采用磁性介质,可反复擦写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。