文章目录
存储系统基本概念
现代计算机的结构
存储器的层次化结构
存储器的分类—层次
存储器的分类—存储介质
存储器的分类—存取方式
随机存取存储器 RAM
顺序存取存储器 SAM
- 串行访问存储器:读写某个存储单元所需时间与存储单元的物理位置有关
直接存取存储器 DAM
- 磁头臂会随机移动到想要读取的区域(随机存取),马达会带动着磁盘旋转到相应位置磁头才能读取到对应的数据(顺序存取)
- 比顺序存取存储器更快些,比随机存取存储器更慢些
- 串行访问存储器:读写某个存储单元所需时间与存储单元的物理位置有关
相联存储器
存储器的分类—信息的可更改性
存储器的分类—信息的可保存性
存储器的性能指标
主存储器的基本组成
基本的半导体元件及原理
-
存储体、MAR、MDR这三部分会在时序控制逻辑的控制下有条不紊地相互配合着工作
-
存储体就是用来存放实际的二进制数据0和1的,一个存储体由多个存储单元构成,而每个存储单元又由多个存储元来构成,一个存储元可以存储1位的二进制0或1
-
MOS管可以理解为一种电控开关,输入电压达到某个阈值时,MOS管就可以接通
-
电容由两块金属板和中间的绝缘体构成,接地那端电压0V,只要给上面的金属板加一个高电压,俩金属板产生了电压差,电容里面的电荷就会开始移动,也就是所谓的给电容充电的一个过程,这样电容里面就可以保存一定的电荷
-
可以根据电容是否保存了电荷两种状态信息来分别表示二进制的0和1
-
【读出一个二进制的原理】:只要给MOS管加一个高电压,MOS管就会接通,电容的保存的电荷就可以顺着导线往外流,当我们检测到有输出电流的时候此时我们就知道电容里面保存的是二进制的1,当我们接通MOS管后导线没有电流我们就知道电容里面保存的是二进制的0
-
【写入一个二进制的原理】:假如我们现在想要让这个电容保存一个二进制的1,那么我们可以在导线的右端加一个高电平,同时也给MOS管加一个高电平让MOS管接通,这样电容上金属板电压为5V,下面的金属板接地电压为0V,电压差的存在导致电容里面的电荷开始移动,然后再把MOS管断开,于是电容就会存储一些电荷即二进制的1
- 如果我们把多个MOS管进行科学合理的连接,我们就可以一次性读出/写入多个二进制数据
- 上图中红色的线连接了存储元的MOS管,只要我们给红色的横线加一个高电平,这一排所有的MOS管都会被导通,每个电容里存储的电荷就可以顺着绿色的竖线往外被导出
存储器芯片的基本原理
-
译码器会根据MAR给出的n位地址把它转变为某条选通线的高电平信号
-
选通后数据从数据线(位线)读出
-
增加的控制电路用于控制译码器、MAR、MDR
-
比如CPU通过地址总线把地址传送到MAR当中,但是由于我们用的是电信号来存储这些二进制数据,电信号难免会不稳定,因此当MAR里面的电信号稳定之前,这个地址信息是不能送到译码器当中的,控制电路会控制MAR的电信号稳定后才把数据传送到译码器当中
-
当数据输出的时候,只有MDR的数据稳定的时候,我们才能认为此时的数据输出是准确无误的,所以控制电路也需要控制MDR在合适的时候给数据总线送出数据
-
CS:chip select
-
CE:chip enable
-
片选线表示的是当我们给片选线加个低电平的时候,这块芯片会被选中,能够使用投入工作
-
译码驱动其实包含了两个部分:译码器和驱动器;其中驱动器是为了帮助译码器输出的信号稳定有效而存在的,作用就是保证译码器输出的数字信号是稳定可靠的,其实就是把电信号进行放大的一个部件
-
读写电路还包括了控制电路(因为控制电路也是为了控制我们的读和写操作的)
寻址
- 这里一个字占4个字节,因此我们会把4个字节拼起来看作一个字
- 当我们指明要读的是第几个字的时候,我们只需要把字地址的信息算术左移两位就能得到实际的起始字节的字节地址的信息
SRAM和DRAM
DRAM芯片
栅极电容v.s.双稳态触发器
- 双稳态:这种触发器/存储元可以呈现两种稳定的状态
- 我们根据A高B低或者是A低B高这两种稳定的状态来判断此时存储的是二进制的1或者是0
- 双稳态触发器需要两根数据线来读出0或者1的状态,如果里面存储的是二进制的1,当我们的字选择线接通的时候,右边BLX这条线会输出一个低电平信号,而左边这条线不会输出任何电信号;而如果里面存储的是二进制的0,当我们的字选择线接通的时候,左边BL这条线会输出一个低电平信号,而右边这条线不会输出任何电信号
- 所以我们可以根据左边还是右边的哪条线输出了低电平信号来判断这个触发器里面原本存储的是二进制的0还是1
- 当我们要写入二进制的0的时候,我们只需要给左边BL这条线一个低电平,给右边BLX这条线一个高电平,这样就可以使这个触发器变为A低B高这个状态,也就是对应二进制的0
- 当我们要写入二进制的1的时候,我们只需要给右边BLX这条线一个低电平,给左边BL这条线一个高电平,这样就可以使这个触发器变为A高B低这个状态,也就是对应二进制的1
DRAMv.s.SRAM
- 注意这里的送行列地址:同时送出的意思是说行地址和列地址的信息会同时丢给行地址译码器和列地址译码器,这样的设计意味着我们的地址有多少位就要设计多少根地址线
- 但是DRAM这种芯片通常它的存储容量会比较大,有可能需要32位地址,即32根地址线,实际情况下的数量还有可能更多,为了让我们的电路更简单,DRAM里面通常会使用地址线复用技术
- 所以题目中如果涉及到DRAM芯片的引脚数量问题,应该考虑到DRAM芯片使用的地址复用技术,导致了地址线和地址引脚数量减半
- 但是SRAM的集成度,存储容量更小,其所对应的行列地址的地址位数也会比较少,所以对于SRAM通常我们把行列地址同时送过去就可以了
什么是刷新
- 在DRAM中,采用的是栅极电容来存储电荷,但是在电容中的电荷有可能会慢慢地流失,这样会导致电容中存储的二进制信息出现误差
DRAM的刷新
- 使电路变得更简单和清晰
- 在实际应用当中我们可以利用CPU不需要访问存储器的这段时间进行异步刷新,比如指令译码阶段
- 题目如果没特别说明,通常默认DRAM的刷新周期为2ms
DRAM的地址复用技术
- DRAM这种芯片通常它的存储容量会比较大,有可能需要32位地址,即32根地址线,实际情况下的数量还有可能更多,为了让我们的电路更简单,DRAM里面通常会使用地址线复用技术
- 所以题目中如果涉及到DRAM芯片的引脚数量问题,应该考虑到DRAM芯片使用的地址复用技术,导致了地址线和地址引脚数量减半
只读存储器ROM
了解各种ROM
计算机内的重要ROM
- CPU的任务就是从RAM主存里面取指令并执行指令,但是RAM内存中的数据在断电后里面的数据会全部丢失
- 那么在开机的时候,我们就需要把操作系统和一些有应用程序从辅存重新调入主存,操作系统是安装在辅存里面的
- 所以刚开机时CPU需要做什么事也需要我们提供给CPU具体的指令的,所以我们让CPU开机时从主板ROM芯片上读取开机所需要执行的那些指令,这块ROM芯片就是BIOS芯片,里面存储了“自举装入程序”,CPU会根据这段程序的指引指挥IO系统把辅存中存储的操作系统相关的数据给放到主存,所以BIOS芯片中的自举装入程序就是用来引导开机的
主存储器与CPU的连接
单块存储芯片与CPU的连接
- 字扩展:我们可以连接多块存储芯片来扩展主存的字数
- 我们尽量要让数据总线的宽度和存储字长一样,这样才能尽可能发挥数据总线的性能,每次多存多取一些数据可以减少存取次数,让数据的读写速度更快
- 位扩展:通过多块存储芯片的合理连接,我们可以让整个主存的存储字长扩展为和数据总线宽度一致
现在的计算机的结构
存储器芯片的输入输出信号
增加主存的存储字长—位扩展
- WE:write enable 写使能信号
-
此时的存储字长为1bit,数据总线的字长并没有被充分地利用
-
此时的存储字长扩展为了2bit,我们可以同时读/同时写2bit的信息
-
同样的,我们可以用同样的方法同时再增加同类型的6块芯片,依次连接,就可以把主存的存储字长扩展为8bit
增加主存的存储字数—字扩展
-
此时数据总线和存储字长都是8bit,数据总线的传输效率已经被使用到极致了,不需要位扩展操作
-
但是此时CPU还有3bit地址位的信息没有被利用到,也就是意味着本来CPU有16bit 即 216 的寻址能力,但是现在我们只使用了13bit的地址信息,并没有完全发挥出CPU的寻址能力
-
我们可以买一块同型号的存储芯片,按照之前位扩展那样的连接方法,试试能不能解决问题
-
但是现在出现了问题,当CPU给出了一个全0的地址信息的时候,会同时把地址信息传给左边和右边两块芯片,而由于此时这两块芯片的片选信号都是1,它们都在工作,因此这两块存储芯片的0号存储单位的信息都会通过数据总线传给CPU,就会导致数据总线的一个冲突
-
要解决上面的问题关键就在于片选信号的使用
-
我们可以利用A13和A14分别连到左边和右边两块芯片的CS片选线信号上面
-
由于片选信号是高电平有效,当A13和A14分别为1和0的时候,左边的片选信号有效,左边的芯片被选中,而右边的芯片片选信号是0,所以它不会工作,这个时候CPU提供的低13位的地址只会读取到左边这块芯片对应的8bit的数据
-
由于片选信号是高电平有效,当A13和A14分别为0和1的时候,右边的片选信号有效,右边的芯片被选中,而左边的芯片片选信号是0,所以它不会工作,这个时候CPU提供的低13位的地址只会读取到右边这块芯片对应的8bit的数据
-
看似问题似乎已经解决了,但是事情并没有那么简单!
-
如果此时A13和A14的信号都是1,ohhh又是和之前一样的问题,两边会同时读或者同时写数据,再次会出现数据总线冲突的情况
-
那么此时我们只能规定A13和A14的信号要么是01要么是10
-
那么此时把两块芯片看作是一块存储容器的话,我们会发现00开始的地址我们不能用,11开始的地址我们也不能用
-
上面的方法成为【线选法】,CPU如果有n条多余的地址线,采用线选法我们就只能有n个片选信号
-
下面我们对线选法做点改进,我们把A13的信号接出去的同时连接一个非门【1-2译码器】(非门的核心是三角形后面要有一个小圆圈)
-
假设此时A13的信号是一个1,那么连着左边芯片的片选线会是一个高电平信号1,连着右边芯片的片选线的信号会是个低电平信号0,由于片选信号是高电平有效,那么此时是左边这块芯片正在工作而右边这块芯片不能投入工作,此时CPU给出的低13位数据指明的是左边这块芯片的某一个存储单元,读出的是左边这块芯片的数据
-
假设此时A13的信号是一个0,那么连着右边芯片的片选线会是一个高电平信号1,连着左边芯片的片选线的信号会是个低电平信号0,由于片选信号是高电平有效,那么此时是右边这块芯片正在工作而左边这块芯片不能投入工作,此时CPU给出的低13位数据指明的是右边这块芯片的某一个存储单元,读出的是右边这块芯片的数据
-
译码片选法:我们可以使用译码器来处理CPU的高位地址部分,n条线的信号可以翻译为2n个片选信号
-
接下来我们看看有了译码器之后如何更好地进行字扩展,以2-4译码器为例
-
注意这里的画线方式,并不是说地址信息是从左边的芯片传给右边的芯片的,而是为了简洁,地址信息永远都是从CPU通过地址总线传给各个芯片的
-
当我们要表示低电平有效的时候,我们通常会在芯片的连接处画一个小圆⚪
-
不过考试的时候,命题老头为了考察大家的理解程度,他有可能是这么连接的,给A13和A15输入信号,这样的话无论A14到底是取0还是取1都影响不到我们选片这个操作
-
当A14为0的时候我们有可能取得8K个地址,当A14为1的时候又有8K个合法的地址,这样的话本来这块芯片只有8K个存储单元,然而现在会有16K个合法的地址对应到这8K个存储单元上,这在实际应用中是不可能采用的,只有考试的时候会出现而已
主存容量扩展—字位同时扩展
- 8块芯片,每两块芯片为一组,实现了位扩展,前面的芯片可以连接到D0到D3,后面的芯片可以连接到D4到D7
- 再来看字扩展,每个芯片都是16K即214个地址,我们可以利用A14到A15连接一个2-4译码器实现4个片选信号,分别连接到4组芯片组合上面去,这样我们的可用寻址数就是64K
- 这样我们就通过字位同时扩展实现了64K×8位的存储
补充:译码器
- 使能,enable,使译码器能够工作的意思,类比存储芯片的片选信号
- MREQ memory request 主存储器请求信号
- 当CPU想要访问主存的时候就会使这个信号有效(低电平)
- 此时我们给G1和G2A加上一个合法的信号,然后把G2B接上CPU的MREQ输出端
- 当CPU没有发出主存请求信号的时候,G2B输出的是一个1,也就是这个译码器不工作,所有的片选信号都是1,没有任何一个存储芯片被选通;而只有CPU发出MREQ请求信号的时候,G2B接收到0这个信号,译码器被选通,把地址信号映射为其中某一片的选通信号
- 实际上CPU和主存是这么配合工作的,CPU首先会通过地址线送出选通信号,包括更低的13位还有高位的这3位,地址信息是通过电信号的形式输出的,所以一开始的时候电信号有可能会不稳定,所以一开始的时候CPU会等电信号稳定的时候才会发出MREQ主存请求信号,也就是让译码器的某个选通线让它有效,这样的话就可以保证当一块存储芯片被选通的时候,这块芯片所接收到的地址信号即电信号一定是稳定的,这就是译码器使能端的一个作用
- 上面地址这一行表示的是CPU送出了地址信息,但是CPU会等地址信号稳定之后才会发出读或者写的请求
- 等到地址有效的时候CPU会发出存储器请求信号,使得译码器的某个输出端输出一个有效的片选信号,使得某一片存储芯片被选通,所以第二行表示的是片选信号的有效时间,这一时刻地址信号稳定了,同时某一片芯片被选通
- 经过一小段时间之后,这个芯片里的某一个存储单元里的数据就可以通过数据总线给传出,所以就是Dout,把数据传出的意思,等数据传出了一小段时间之后,CPU就可以撤销存储请求信号,也就是撤销这个片选信号,刚才传出的数据也需要一小段时间才可以传给CPU,CPU确定接收到这些数据之后,才会撤销刚才发出的地址信号
- 图中地址信号往上也往下表示的是传出的地址信号有可能是0也有可能是1,而对于片选信号,当它无效的时候是高电平(黑色),有效的时候是低电平(空缺的部分),对于数据的输出,灰色的表示没有数据的输出,而白色的部分既有往上也有往下也表示的是输出的数据有很多0101
双端口RAM和多模块存储器
存取周期
双端口RAM
多体并行存储器
- 【高位交叉编址】:我们会采用内存地址的【更高】的几个比特位来区分我们想要访问的是哪一个存储体,把地址翻译为十进制表现出来的是纵向编址
- 【低位交叉编址】:我们会采用内存地址的【更低】的几个比特位来区分我们想要访问的是哪一个存储体,把地址翻译为十进制表现出来的是横向编址
- CPU对存储体进行了一次读操作,每一次读它的存取周期是T=4r
- 实际上CPU只花了r这么一段时间就完成了读操作,但是后面还有3r的时间必须等待,等待存储体恢复之后才可以访问接下来的地址,因为接下来的地址同样是属于M0这个存储体,必须等T这么一段时间才可以访问1号地址
- 整个过程连续读取了n个存储字,耗时nT
-
CPU在开始的时候会从M0这个地方读出一个字,但是其实CPU从存储器里面读或者写一个字实际只需要r这么长的时间,因此过了r这么一段时间之后,相当于对M0的读取工作就已经完成了,那后面的3r的这么一段时间,CPU不用管它,只需要让它自己恢复就可以
-
所以当过了r这么一段时间完成对M0的读取之后,此时M1存储体已经准备好可以进行读写了,因此CPU可以直接从M1这里读取数据
-
读完M3之后,我们从刚开始已经经过了T=4r这么一段时间了,也就刚好过了一个存取周期。因此M3这个地址读取完之后,M0这个存储体又准备好可以被读取了,刚好我们也需要从M0读取数据,所以从M3读取完这个时刻开始,CPU又可以紧接着对M0读出下一个字的数据
-
实际应用的情况下很多数据就是存放在一片地址连续的空间,如:数组、程序指令,所以这里对“连续访问”的情况进行探讨是很有意义的
应该取几个“体”
多模块存储器
- 单体的灵活性要差一些
- 但是从总体的读取速度的提升来看,其实单体和多体都差不多,平均下来每读取一个字的时间都是r=T/4
- 所谓的“双通道”就是低位交叉编址的2体存储器
- 应插到颜色相同的两个内存条卡槽位实现低位交叉编址
- 如果两根内存条主频不一样,那么主频更高的内存条就会降频处理,发挥不出自己原来的所有功效
- 如果新加的内存比之前的大很多,那么多出来的部分就变成和高位交叉多体存储器一样了,也就是低地址实现了双通道但是高地址部分还是单通道
磁盘存储器
外存储器
- 磁带划过磁头下方的时候,磁头就可以1bit 地往里面写数据,【每次只能写1bit】
- 磁带划过磁头下方的时候,磁头就可以1bit 地读数据,【每次只能读1bit】
- 磁表面存储器每次读和写都是以1bit为单位的,而且读和写这两个动作是不可以同时进行的
磁盘存储器
磁盘设备的组成
- 硬盘拆开后里边的样子
-
驱动轴会带着磁盘旋转
-
盘片上的磁性材质是一圈一圈地涂的
-
当我们需要读取某一圈的数据的时候就需要移动磁头臂,把它移动到对应的那一圈磁性材质上
-
驱动轴的带动使得这一圈磁性材质在读写磁头的下方划过就可以读取或者写入数据
-
电路板就是磁盘控制器,实现对电路的控制以及和主机实现数据的交换
- 主机对磁盘的读或者写操作都是以扇区为一个单位的
磁盘的性能指标
- 格式化的容量指的就是,磁盘的某些扇区有可能会损坏,那为了防止个别扇区的损坏导致整个磁盘无法正常工作,因此很多厂商生产的磁盘需要进行格式化,比如说可以留下某些备用的扇区作为顶替使用,如果扇区A损坏,那么就会用一个备用的扇区B来顶替,因此对磁盘进行格式化之后,会有某些部分的容量被我们用作其他的用途,因此我们实际可以使用的磁盘容量就会变少
- 很多时候磁盘的存储性能会受到最内侧磁道的制约,因为这么短的磁道所支持存储的字个数肯定是有上限的,最内侧磁道的位密度很大程度会影响到磁盘的存储容量
- 寻道时间题目一般会给出一个平均的时间
- 旋转延迟时间我们可以取【转半圈】所需要的一个时间,如果题目没有明确给出一个旋转延迟时间的话
- 有的题目也会加上磁盘控制器的一个延迟时间,也就是磁盘的电子部分接收到CPU发出的命令并且对磁盘驱动器机械部分发出控制信号所需要的一个延迟时间
磁盘地址
磁盘的工作过程
- 由于磁盘的每一次读和写都是1bit,所以对于磁盘的控制器来说有必要在磁盘内部增加一个并-串变换电路,主机给发送的数据可能是并行发送的,一次发送多个比特位,然而我们要把这些并行数据写入磁盘的时候我们需要用串行的方式1bit地写;读数据也是一样,我们通过读写磁头1bit读出数据之后,但是我们通过给总线传输数据的时候是并行地传输的
磁盘阵列 RAID
- RAID,Redundant Array of Inexpensive Disks,廉价冗余磁盘阵列
- 磁盘冗余阵列,越往后磁盘的冗余信息占比越少,可靠性就更高,容错能力也更高
- 一般诸如百度云这种商用环境都是用磁盘冗余阵列来提高系统的性能和可靠性、提高系统的并行访问能力
固态硬盘SSD
- 原理:基于闪存技术Flash Memory,属于电可擦除ROM,即EEPROM
- 固态硬盘由多个闪存芯片Flash Chip构成,每个芯片包含多个块block,每个块包含多个页page
机械硬盘 v.s. 固态硬盘
固态硬盘的结构
读写性能特性
- 系统通过I/O总线发过来一个逻辑地址,这个逻辑地址经由闪存翻译层的翻译【通过电路实现】之后会把逻辑地址映射到对应的物理地址,找到对应页,所以闪存翻译层做的就是一个地址变换的工作
- 系统对【固态硬盘的读写是以页为单位的】,每次读或者每次写都是一个页,如果系统此时要读取的数据是存放在【磁盘】里面的,那么一个逻辑块号/物理地址对应的就是磁盘里面的某一个【块/扇区】;如果系统此时要读取的数据是存放在【固态硬盘】里面的,那么这所谓的逻辑块对应的就是固态硬盘里面的一个【页】,而不是固态硬盘里的一个块
- 这里的固态硬盘的块类比磁盘的扇区,而固态硬盘的页类比磁盘里面的一个磁道
- 块1的页0此时已经被写入数据了,如果我们此时还想对这一页写入数据的话是不被允许的,想要再往这一页写入数据,就必须先把这一整块进行擦除,然后再往里面写入数据
- 以块为单位进行擦除,整块擦除干净之后其中的每一页就可以再次被写入数据
- 但如果擦除的时候同一块里面的其他页面也有数据怎么办呢?固态硬盘的做法是:先把同一块中的其他页复制到一个新的可写入的块中,然后再把想要写入的数据写到新块里面的对应页里面,最后把原来原来的块整块擦除,这样就可以保证其他页的数据不会丢失
- 但此时又会有另一个问题,闪存翻译层会把相应的逻辑块号映射到刚刚被我们擦除的页的物理位置,但是经过上述操作后对应数据的物理位置被我们改变了,为了让地址的映射关系保持正确,闪存翻译层在做了刚刚的数据迁移之后,会把新的逻辑块号重新进行映射,而把原有的映射直接舍弃,保持正确的映射关系,所以实际的物理位置是会变的,只不过闪存翻译层会把这个映射关系的变化修改正确而已
- 磁盘是通过移动机械臂来定位到具体的地址,而固态硬盘是通过电路来直接固定到具体的物理地址,因此【固态硬盘支持随机访问】,访问任何地址所需要的时间都是相同的;但是对于机械硬盘而言,如果此时要访问的物理地址离磁臂的当前位置比较远那就需要移动磁臂,所以对于机械硬盘而言访问不同地址可能需要花的时间需要等的时间也各不相同
磨损均衡技术
Cache的基本概念和原理
存储系统存在的问题
Cache的工作原理
局部性原理
- 局部性原理就是Cache能够有效工作的理论依据
性能分析
有待解决的问题
Cache和主存的映射方式
- 如何区分Cache与主存的数据块对应关系——Cache和主存的映射方式
全相联映射(随意放)
直接映射(只能放固定位置)
组相联映射(可放到特定分组)
Cache替换算法
- Cache很小,主存很大,如果Cache满了怎么办?——Cache替换算法
随机算法 RAND
先进先出算法 FIFO
近期最少使用算法 LRU
最不经常使用算法 LFU
Cache写策略
- CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性——Cache写策略
写命中
写回法
全写法
-
为了减少CPU访存的次数,全写法通常使用“写缓冲”优化
-
当CPU对Cache写命中的时候,CPU在对Cache绿色块写入数据的同时还会同时对写缓冲区也写入相同的数据
-
然后CPU又想对紫色块写入数据,同样的也会把和这块相同的内容写到写缓冲里面
-
由于写缓冲是用SRAM实现的,所以CPU对写缓冲的写入操作要比CPU直接对主存进行写操作要快得多
-
然后CPU就可以转去干其他的事情,比如说会进行连续的好几次读操作,那么当CPU干其他事情的期间,会有一个专门的控制电路来负责把写缓冲里面的数据给同步到主存里面,所以当我们淘汰某个Cache块的时候也不需要把对应的数据写回主存
写不命中
写分配法
- 通常搭配写回法使用
非写分配法
- 通常搭配全写法使用
多级Cache
页式存储器
页式存储
虚地址 v.s. 实地址
页表:逻辑页号→主存块号
地址变换过程
地址变换过程(增加TLB)
虚拟存储器
- 操作系统虚拟性的一个体现,用户感知到的内存容量远比本机真实的内存容量大
页式虚拟存储器
- 访问位是为了实现页面替换算法才增加的属性,页面替换算法不同于Cache替换算法,页面替换算法解决的是主存和辅存之间的替换关系
存储器的层次化结构
段式虚拟存储器