计算机组成原理-存储系统
¶简介
计算机组成原理系列其二,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容是计算机内部和外部的存储介绍,主要包含以下几点:
- 存储器的分类与层次化的存储器基本结构
- 主存与外(辅)存
- 主存的拓展和外存的结构
- Cache
- 虚拟内存
¶大纲
- 存储系统
- 存储器概述
- 多种角度进行分类
- 存储器的性能指标
- 多层次的存储系统
- 主存储器(主存)
- SRAM和DRAM简介
- DRAM的工作原理
- DRAM的刷新
- DRAM的地址引脚复用
- ROM
- 特点
- 类型
- 多模块存储器
- 单体多字存储器和双端口RAM
- 多体并行存储器
- 高位交叉编址(顺序方式)
- 低位交叉编址(交叉方式)
- 两者的性能分析
- 主存储器和CPU的连接
- 连接原理
- 主存的容量扩展
- 位扩展法
- 字扩展法
- 字位同时扩展法
- 外部存储器
- 磁盘存储器(机械硬盘)
- 磁盘的组成
- 磁盘的性能指标
- 磁盘阵列和固态硬盘
- 磁盘存储器(机械硬盘)
- 高速缓冲存储器(Cache)(重难点)
- Cache的工作原理
- Cache的命中率
- Cache和主存的映射方式
- 直接映射
- 全相联映射
- 组相联映射
- Cache中主存块的替换算法
- 近期最少使用(LRU)算法
- Cache的写策略
- Cache写命中
- 全写法
- 写回法
- Cache写不命中
- 写分配法
- 非写分配法
- Cache写命中
- Cache的工作原理
- 虚拟内存
- 典型例题
- 存储器概述
¶存储器概述
¶计算机中的存储器可以按照多种角度进行分类
- 按照层次分类
- 主存:我们通常称为内存,CPU可以直接随机的对其访问,上联CPU和Cache,下联辅存
- 辅存:我们通常称为硬盘,用来存放需要永久保存的数据,计算机中的绝大多数数据都保存在辅存中,运行时调入内存和CPU计算
- 高速缓冲存储器:简称Cache,位于CPU和内存之间,是为了解决CPU和内存之间的速度不匹配问题
- 按照存储介质分类
- 磁表面:磁盘、磁带、
- 半导体存储器:RAM和ROM
- 光存储器:光盘
- 按照存取方式分类
- RAM(Random-access memory):顾名思义,RAM的任何一个存储单元都可以随机存取,可以视为一个巨大的数组,其存取时间和存储单元的物理位置无关,缺点是具有易失性(断电后信息会丢失)
- ROM(Read-only memory):虽然名字叫Read-noly但现代的ROM可以进行多次读写,“只读”的概念没有保留,但其仍保留了非易失性(断电后信息不会丢失)
- DAM(串行访问存储器):对存储单元进行读、写操作时,需要按照其物理地址的先后顺序寻址,如磁带、磁盘、光盘等
- 按信息的可保存性分类
- RAM
- ROM
¶存储器的性能指标
- 存储容量 = 存储字数 $\times$ 字长(如$ 1M \times 8位 =\rangle 地址位: 1 \times {10}^{20}个\ 数据位: 8bit$ ),存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量
在题目中常会遇到,某计算机存储器按字节编址,主存的地址空间大小为64MB,翻译过来就是地址位有$64M = 2^{26}$,即地址位为26位,按照字节编址其数据位就是 $1Byte = 2^{3}$,3位
- 存储速度:$数据传输率 = \frac{数据的宽度}{存取周期}$
- 存取时间($ T_a $):从启动一次存储器操作到完成该操作所经历的时间,分为读出和写入时间
- 存取周期($ T_m $):是连续两次独立访问存储器操作之间所需的最小时间间隙
Tips:$T_a \neq T_m$,通常来说,存取周期大于存取时间,因为在完成一次存取操作后,任何一个存储器都需要一个恢复时间
¶多层次的存储系统
一图总结:
Tips: 在Cache——主存层和主存——辅存层中,上一层的内容都只是下一层的一个副本,Cache(或主存)中的内容只是主存(或辅存)中内容的一部分
¶主存储器
¶SRAM和DRAM简介
RAM(随机存储器)分为SRAM(Static RAM)和DRAM(Dynamic RAM)两种,他们都具有易失性,其主要区别是是否需要刷新。SRAM常用来制作Cache,DRAM常用来制作内存。SRAM没什么考点,考试的重点是二者的区别
¶DRAM的工作原理
DRAM是利用存储元电路中栅极电容上的电荷来储存信息的,其具有集成度高、容量大、价格低、功耗低等优点,但其速度较SRAM慢,是破坏性读出。因此需要它需要进行刷新来保证其存储的信息不丢失
¶DRAM的刷新
DRAM上电容的电荷一般只能维持1~2ms,即使不断电也其信息也会消失,每隔一段时间必须刷新一次,通常取2ms,称为一个刷新周期。常用的刷新方式有以下三种:
- 集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读/写操作。集中刷新的时间不能进行读/写操作,故称为“死时间”或访存“死区”
- 分散刷新:对每行存储单元的刷新分散到每个存取周期内完成。其中,把机器的存取周期$T_c$分成两段,前半段$T_m$用来读\写或维持信息,后半段$T_r$用来刷新。优点是没有停止读/写的死时间,缺点是存取周期长了
- 异步刷新:既可以缩短“死时间”,又充分利用最大刷新间隔为2ms的特点,具体操作为:在2ms内对128行各刷新一遍。将刷新周期除以行数,得到两次刷新操作之间时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求
¶地址引脚复用
(考试常考,需记住)DRAM芯片容量较大,地址位数较多,为了减少芯片的地址引脚数,通常采用地址引脚复用技术,行地址和列地址通过相同的引脚分前后两次输入,这样就可以减少一半的地址引脚
¶ROM
¶特点
- 结构简单,位密度比可读写存储器高
- 具有非易失性
¶ROM的类型
考试只需记住各个类型的名称即可,无需细究
- MROM(Mask ROM,掩模式只读存储器)
- MROM的主要优点是存储内容固定,掉电后信息仍然存在,可靠性高。缺点是信息一次写入(制造)后就不能修改
- PROM(Programmable ROM,可编程只读存储器)
- 仅只能编写一次,第一次写入的信息就被永久性地保存起来
- EPROM(Erasable Programmable ROM,可编程可擦除只读存储器)
- 用户可以自己写入信息,且可以多次修改,但修改的次数有限
- Flash(Flash Memory,快擦除读写存储器)
- 可以长期保存信息,也可以在线进行快速擦除和重写
- SSD(Soild State Drives,固态硬盘)
¶双端口RAM和多模块存储器
多模块存储器是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率。常用的有单体多字存储器和多体并行存储器
¶单体多字存储器和双端口RAM
仅做简单了解,这里不详细说明,考试重点在多体并行存储器
¶多体并行存储器
多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,也具有独立的读写控制电路、地址寄存器和数据寄存器。其目的是为了解决一个存期周期中恢复时间较长问题,分为高位交叉编址和低位交叉编址
¶高位交叉编址(顺序方式)
高位交叉编址的实际效果相当于单纯的扩容,并没有解决存储周期恢复时间较长的问题。通过分析其地址存储方式可知,它是在一条存储器上顺序分布的,在连续取址时每个存储器还是需要时间来恢复,不能多条存储器并行操作
- 高位地址表示体号,低位地址为体内地址
- 一个体内的地址是连续的,只需要一个地址寄存器,也有利于存储器的扩充
- 多模块串行,性能无提升
¶低位交叉编址(交叉方式)
低位交叉编址的低位地址表示体号,高位表示体内地址,每个模块按“模M”交叉编址,模块号 = 单元地址 % M。
- 低位地址表示体号,高位地址表示体内地址(这种编址方法又称模M编址,M等于模块数)
- 相邻地址位于不同存储体中,每个存储体都需要寄存器
- 多模块并行,可以实现对存储器的流水线式访问,性能提升
¶性能分析
设存储周期为T,总线传送周期为r,交叉模数为m。
为了实现流水线方式存取,每通过r时间延迟后启动下一个模块,应满足:
$T = m \ast r$
交叉存储器要求其 $模块数 \geq m $,以保证启动某模块后经过$m \ast r$时间后再次启动该模块时,它上次存取操作已经完成。
- 对于高位多体交叉,连续读取n个字的时间:$t_2 = n \ast T$
- 对于低位多体交叉,连续并行读取n个字的时间:$ t_1 = T + (n - 1) \ast r$
¶主存储器和CPU的连接
¶连接原理
- 主存储器通过数据总线(CPU使用MDR与主存通过数据总线交互)、地址总线(CPU使用MAR向主存发送地址)、控制总线(包括片选线、读控制线、写控制线)与CPU连接
- 数据总线的$位数\times工作频率$与数据传输率成正比
- 地址总线的位数决定了可寻址的最大内存空间
- 控制总线指出了总线周期的类型和本次输入\输出的操作完成时刻
¶主存的容量扩展
因为单个存储芯片的容量有限,所以需要在字(扩展地址位)和位(扩展数据位)两个方法对其进行扩容来满足实际需求。通常有位扩展法、字扩展法和字位同时扩展法来扩展主存容量
¶位扩展法
CPU的数据线数与存储芯片的数据位数不一定相等,需要对其进行位扩展,即使用多个存储器对字长进行扩充,增加存储字长
Tips:CS位片选线,WE为读写控制线
¶字扩展法
字扩展是指增加存储器中的字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线并联,而由片选信号来区分各地址的范围
如下图,用4片$16K\times8$位的RAM芯片组成$64K\times8$ 位的存储器。4片RAM芯片的数据线$D_0\sim D_7$和WE都分别连在一起。将$A_{15} A_{14}$用作片选信号,$A_{15} A_{14} = 00$ 时,译码器输出端0有效,选中最左边的1号芯片$A_{15} A_{14} = 01$时,译码器输出端1有效,选中2号芯片,以此类推(在同一时间内只能有一个芯片被选中)。各芯片的地址分配如下:
第一片,最低地址:0000000000000000;最高地址:0011111111111111
第二片,最低地址:0100000000000000;最高地址:0111111111111111
第三片,最低地址:1000000000000000;最高地址:1011111111111111
第四片,最低地址:1100000000000000;最高地址:1111111111111111
注意:仅采用宇扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号CS或来用译码器设计连接到相应的芯片
¶字位同时扩展法
$2/4译码器$:有两条线可生成两个片选信号,即可控制四个芯片,同理还有$3/8译码器$
¶外部存储器
¶磁盘存储器(机械硬盘)
¶磁盘的组成
¶磁盘的性能指标(重点)
- 主机对磁盘的读写是以扇区为单位
- 每个磁道存储的数据量相同,越靠近内侧的磁道存储密度越大
- 磁盘的容量
- 非格式化容量:指理论上可以保存的数据量大小,由道密度和位密度计算
- 格式化容量,是指按照某种特定的记录格式所能存储信息的总量,格式化的容量要比非格式化的容量要小(会保留一部分容量备用)
- 平均存取时间(重点)
- 寻道时间:磁头移动到目的磁道的时间
- 旋转延迟时间:磁头定位到要读写扇区的时间
- 传输时间:传输数据所花费的时间
Tips:由于寻道和查找扇区的距离远近不一,所以寻道时间和旋转延迟时间通常取平均值
- 平均旋转延迟时间:存取一个扇区的平均旋转延迟时间取旋转半周磁道的时间
- 平均寻道时间:取磁头从盘面最内圈转到最外圈的时间的一半
- 传输时间:$\frac{需要读取的数据量}{数据传输的速率}$
¶磁盘阵列和固态硬盘
- 磁盘阵列(了解)
- SSD
数据的读写以页为单位,擦除以块为单位。只有在一页所属的块整个被擦除后,才能写这一页
在反复的写后,SSD的闪存块会磨损,SSD页会磨损,寿命有限
¶高速缓冲存储器(Cache)
Cache作为本章的重点和难点,其核心问题主要分为三点:
- Cache和主存的映射方式
- Cache中主存块的替换算法
- Cache的写策略
下面将重点从这三个方面来理解Cache在计算机中的工作方式和为什么需要Cache
¶Cache的工作原理
之所以要在CPU和主存之间增加一层Cache正是为了解决CPU和主存之间速度不匹配的问题,正如外存和主存一样,Cache中的内容是主存中的一个副本。因为计算机的程序访问具有局部性原理,所以我们可以在CPU和主存之间增加Cacha层来提高计算机的整体运行速度
¶Cache的命中率
CPU欲访问的信息已在Cache中的比率称为Cache的命中率。
设一个程序执行期间,Cache的总命中次数为$N_c$,访问主存的总次数为$N_m$,则命中率H为:$H = \frac{N_c}{N_c+N_m}$
设$t_c$为命中时的Cache访问时间,$t_m$为未命中时的访问时间,$1-H$表示未命中率,则Cache-主存系统的平均访问时间$T_a$为:$T_a=H\ast{t_c}+(1-H){t_m}$(此命中率为CPU对Cache和主存同时访问)
若为,先访问Cache再访问主存则时间为:$t=H\ast{t_c}+(1-H)({t_c+t_m})$
¶Cache和主存的映射方式
主存与Cache之间以“块”为单位进行数据交换(注:在操作系统中将主存中的“块”称为“页/页面”,Cache中的“块”称为“行”,在这里统一称为块,便于描述)
地址映射是指把主存的地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。地址映射的方式主要有以下三种:
- 直接映射
- 全相联映射
- 组相联映射
¶直接映射
直接映射是主存中的每一块只能装入Cache中的唯一位置。若该位置已有内容,则产生冲突,需要将原来的块替换出去。直接映射实现简单,即使Cache中有许多地址空缺也不能占用,但这使得直接映射的块冲突概论最高,空间利用率最低
直接映射关系可以定义为:Cache行号 = 主存块号 % Cache总行数
重点说明:在映射这一章中最任意糊涂的就是映射的地址结构,首先看直接映射的地址结构,它由三部分组成,分别是标记、Cacha行号和块内地址:
- 主存块号
- 标记
- Cacha行号
- 主存的块内地址
- 块内地址
根据上面的层次结构我们可以看出,一个Cache行由两个大部分组成(主存块号、块内地址,时刻记住Cache中的内容是主存的一个副本),其中主存块号又被分为标记和Cache行号。
- 这里的Cache行号是怎么来的? 其实它来源于直接映射的定义,因为对主存块号进行取模操作即对主存块号$ % 2^c $相当于留下最后c位二进制数。换句话说,若Cache共有$ 2^c $行,那么主存块号的低c位即为对应的Cache行号
- 这里可能会迷惑为什么低c位就是对应的Cache行号,其实对于取模操作,用二进制来表示的话就是取低c就可以直接得到,思维不要局限在十进制上
- CPU给出的访存地址是指访问主存的地址,CPU根据给出的访存地址的低c位(也就是Cacha行号)来在Cache中定位它,如果在Cache中该行有数据,然后再比较标记位且Cache行的有效位为1,则表示Cache中的这一行就是要找的访存地址(即Cache命中)
例题:
解析:
如果以上内容还没有看懂可以点击此处查看视频讲解
上面内容搞清楚以后,本章的难点也就是没有了,考试的重点也多在上面
¶全相联映射
与直接映射不同,全相联映射的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块。优点是比较灵活,冲突概率低,空间利用率高;缺点是速度较慢
¶组相联映射
组相联映射是将Cache分成Q个大小相等的组,组间采用直接映射、组内采用全相联映射,假设每组有r个Cache行,则称为r路组相联
组相联映射可定义为:Cache组号 = 主存块号 % Cache组数(Q)
组相联映射地址结构为:
标记 | 组号 | 块内地址 |
---|
若Cache共有$2^q$组,则主存块号的低q位即为对应的Cache组号
例题:
解析:
¶Cache中主存块的替换算法
在使用全相联映射或者组相联映射时,就需要考虑Cache和主存中数据的替换问题,直接映射则无需考虑。在计组中该部分内容简要带过,重点内容在操作系统中会学习到
常用的替换算法有:
- 随机(RAND)算法
- 先进先出(FIFO)算法
- 近期最少使用(LRU)算法
- 最不常用(LFU)算法
这里重点说一下LRU算法,其余内容在操作系统中学习
LRU的一个快速手算方法是:可以从当前块从左向右找到最长时间未使用的内存块来替换,而无需像下面一样使用计数器
¶Cache的写策略
Cache中的内容是主存块的副本,当对Cache中内容进行更新时,需要使用写操作策略使Cache内容和主存内容保持一致。分为两种情况
- Cache写命中
- 全写法
- 写回法:为了减少写回主存的开销,每个Cache行需要设置一个修改位(脏位),若脏位为1则表示修改过,为0则未修改过(不要忘记脏位!考试常考到,还有也不要忘记有效位,Cache映射时会用到)
- Cache写不命中
- 写分配法
- 非写分配法
-
Cache写命中
-
全写法
-
写回法
-
-
Cache写不命中
-
写分配法
-
非写分配法
-
¶虚拟内存
这一章主要内容在操作系统中会重点学习,在这里就不再提及了
¶典型例题
待补充