第三章 存储系统
3.1 存储器概述
基本的半导体元件和原理
MOS管可以理解为电控开光,输入电压到达阈值后,MOS管就可以接通,是一种半导体。如果电容上有电子,则为1,反之为0。给MOS管施加电压导通后,如果监测到有电流,则意味着电容上有电子,电容存储的信息为1,反之为0。
可能需要补充存储芯片选片原理
一颗存储器可能有的引脚类型如上,其中较为固定的是:1根片选线、一根读信号线,一根写信号线、一根电源线、一根接地端。而所需的地址线和数据线数量如下:
存储单元中寻址有n位地址,意味着有2n个存储单元,总容量=存储单元个数x存储字长,数据线的数量和存储单元的二进制位数相同,因为每一条数据线负责读写一位数据,比如说16*8位,那么需要4条地址线和8条数据线
分类
1.按照在计算机中的作用分类
- 主存储器,又称内存储器(内存),用于存放计算机运行所需的程序和数据,CPU可以直接随机对其进行访问,内存也可以和高速存储器交换数据
- 辅助存储器,又称外存储器(外存)
- 高速缓冲存储器,简称Cache
2.按存储介质分类
存储器可以分为磁表面存储器(磁盘,磁带),磁芯存储器,半导体存储器和光存储器(光盘)
3.按存取方式分类
- 随机存储器,存储器的任何一个存储单元都可以随机存取,并且存取时间与存储单元的物理位置无关。优点是读写方便、使用灵活,主要用于主存或者高速存储器
- 只读存储器,存储器只能随机读出而不能写入,信息一旦写入存储器则会固定不变,即使断电内容也不会丢失。一般只会存放固定不变的程序比如汉字字库等等。
- 串行访问存储器,对存储单元进行读写操作的时候,需要按照器物理位置的先后顺序寻址,比如磁带、磁盘、光盘
4.按信息的可保存性分类
断电后存储消息直接消失的存储器称为易失性存储器,如RAM。断电后信息仍保存的存储器称为非易失性存储器,比如我们常见的硬盘。
多层级的存储系统
通常来说,相同价格下,速度越快的存储器容量越小。
为了解决存储系统大容量、高速度和低成本这三个相互制约的矛盾,在计算机系统中,通常采用多级存储结构。
寄存器——高速缓存——内存——外存
3.2 主存储器
主存储器由DRAM实现,靠处理器的那一层则由SRAM来实现,它们都属于易失性处理器,只要电源被切断,原来保存的信息就会全部丢失。DRAM的价格比SRAM低,速度也更慢,价格差异在于SRAM需要消耗更多的硅
一、SRAM芯片和DRAM芯片
通常把存储一个二进制位的物理器件称之为存储元,是存储器的最基本构件。
1.SRAM的工作原理
静态随机存储器(SRAM)的存储元是双稳态触发器(六晶体管MOS),因此即使信息被读出后,它仍然保持其原状态不需要再生,是非破坏性读出。但是需要较多的晶体管,成本较高。
2.DRAM的工作原理
动态随机存储器(DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的,其存储元只需要用到一个二极管,因此同价位下容量较高。在读出的时候,会使得电容失去电子,因此是破坏性读出,因此在读出后需要再次写回信息,速度没有SRAM快。另外DRAM电容上的电荷一般只能维持1~2ms,因此即使电源不断电信息也会消失,为此必须每隔一段时间就刷新,通常取2ms为刷新周期。
SRAM集成度低,容量小,所需的地址位数少,因此可以直接一次同时送行列地址;DRAM存储量大,集成度高,所需要的地址位数多,使用地址线复用两次分别传送行列地址可以减小引脚数量,降低成本。这就是地址复用技术,使用地址复用技术后,地址线可以减半
3.DRAM刷新方式
- 多久刷新:2ms一次
- 每次刷新多少存储单元:在存储器管理中,存储单元会以行列的方式排序,一般每次刷新一行存储单元(TIPS:在现在的大容量存储器中,甚至会有三维、四维存储器排列)
- 每次刷新占用一个读写周期
- 集中刷新:在一个周期内利用一定时间,对存储器进行逐一的刷新,在此期间停止对存储器的操作,称为死时间,又称访存死区。优点是在读写期间不受刷新工作影响,缺点是刷新期间不能访存
- 分散刷新:把对每行的刷新分散到各个工作周期中,每次完成一次读写都刷新一行。比如如果一次读写需要 0.5 μ s 0.5\mu s 0.5μs,那么存储周期为 1 μ s 1\mu s 1μs,前 0.5 μ s 0.5\mu s 0.5μs用于正常读写,而后 0.5 μ s 0.5\mu s 0.5μs用于刷新
- 异步刷新:如果DRAM阵列为128×128的形式,那么2ms内需要刷新128次,也就是平均2ms/128 = 15.6 μ s \mu s μs一次,也就是每15.6 μ s \mu s μs内有一次 0.5 μ s 0.5\mu s 0.5μs的刷新。实际中可以在CPU不需要使用存储器的时候进行刷新,从而避开死时间,更加灵活
3.DRAM芯片的读取周期
4.存储芯片的内部结构
- 存储体:存储体是存储单元的集合,由行选择先和列选择线来选择所访问的单元,存储体的向同行、列上的位同时被读出或者写入
- 地址译码器:用来将地址转换为译码输出线上的高电平,以便驱动相应的读写电路
- IO控制电路:用以控制被选中的单元的读出和写入,具有放大信息的作用
- 片选控制信号:单个芯片容量太小,满足不了计算机对存储器容量的需求,因此会使用一定数量的芯片进行存储器的扩展。在访问特定内容的时候,需要选中其所在的芯片,而这就是用片选控制信号来控制的。
- 读写控制信号:根据CPU给出的读命令和写命令,控制被选中单元进行读或者写。
二、只读存储器(ROM)
ROM是非易失性的,断电不会丢失信息。其中用于存储BIOS的ROM芯片(也就是计算机自举程序),是主存的一部分,和主存采用统一编址,而不从属于外存的一部分
1.只读存储器(ROM)的特点
ROM和RAM都是支持随机存取的存储器。ROM一旦有了信息就不能轻易改变,掉电了也不会消失,ROM器件有两个显著优点:结构简单所以存储密度高,具有非易失性因此可靠性高
2.ROM的类型
- 掩模式只读存储器(MROM)
MROM的内容由厂商按照用户需要在生产过程中直接写入,任何人都无法改变。优点是可靠性高,集成度高,缺点是灵活性差,一般用于固件。
- 一次可编程只读存储器(PROM)
PROM是可以实现一次性编程对的只读存储器,允许用户使用专门的设备写入自己的程序,一旦写入就不可变。
- 可擦除可编程只读存储器(EPROM)
EPROM可以多次对内容进行改写,但是不能取代RAM,因为其写入时间长,写入次数有限。分为UVEPROM,使用紫外线照射可以擦除全部信息。EEPROM,可以用电擦除的方式,以擦除指定部分的信息
-
闪速存储器Flash Memory:由EPROM发展而来,可以进行多次快速擦除重写,需要先擦除再写入因此写比读慢。
-
固态硬盘(SSD)
基于闪存的固态硬盘使用固态电子存储芯片阵列制成硬盘,读写速度快,低功耗但是价格高。速度快,功耗低,价格高
三、主存储器的基本组成
主存储器中的主要部件是由一个个存储单元构成的存储矩阵。为了知道如何获取存储体中的信息,需要对存储体中的存储单元进行编址。单位化编址指的是将具有相同地址的存储元件构成一个单位,比如现代化计算机都采用按字节编址的方式,而一个存储单位仅存储一个bit,因此可以将8个存储元件视作一个单位。
指令执行的过程需要访问主存时,CPU首先把需要访问的单元的地址送到MAR,然后通过地址总线将该地址送到主存中的地址寄存器。,以便地址译码器进行译码。同时,CPU将读写信号通过控制线送到主存的读写控制电路。如果是写操作,则CPU会同时将需要写入的信息传到MDR中。
1.主存储器优化技术
采用分散刷新的DRAM的一个存取周期包括存取时间和恢复时间,因此DRAM芯片的时间比较长,一般DRAM的恢复时间是存取时间的3倍。另外,存取周期
因此普遍在用多模块存储器来优化存取速度,多模块存储器是一种空间并行技术,利用多个结构完全相同的存储模块并行工作来提高存储器的吞吐率。
多体并行存储器
在主机上使用若干个相互独立的存储器,比如说在电脑上插上4条内存条。其编址方式分为高位交叉编制和低位交叉偏执。在使用了n个独立存储器的高位交叉编址中,内存地址的头log2n位是用于选择存储器的地址。随后的位用于指明数据在存储器内部的地址;低位交叉编制则是刚好相反,内存地址的尾部log2n位是用于选择存储器的地址。
对于高位交叉编址,0000,0001,0010,0011表示的是其第一个存储器的0,1,2,3号存储单元;而对于低位交叉编址,0000,0001,0010,0011分别表示的是其第1个、第二个、第三个、第四个存储器的0号存储单元
对于一次访问逻辑上连续紧挨的数个存储单元(比如连续访问0000,0001,0010,0011)的操作,高位交叉编址会访问同一个存储器,而采用DRAM的存储器需要读出并恢复才能读取下一个数据,效率会比较低。但是采用地位交叉编制会逐个访问不同的存储器,因此在第一个存储器读出的时候,就可以访问第二个存储器,而不需要等待第一个存储器进行恢复操作,速度是较快的。可以看出,在待访问单元足够多的时候,低位交叉编址的速度是高位交叉编址的4倍。
上述的低位交叉编址在存取的时候,采用的是流水线的并行存取方式(宏观上并行,微观上串行)。在存取周期为T,存取时间(或总线传输周期)为r的情况下,为了保证流水线不间断,应该保证模块数 m ≤ T / r m\leq T/r m≤T/r,其中最完美的情况是 m = T / r m= T/r m=T/r,此时流水线不会中断,效率最高,并且存储体也不会空闲,最大化利用了硬件。高位交叉编址只是扩充了容量,就像是换了更大的内存条;而插入两个内存条组成双通道,实际上是实现了低位交叉的多体存储器,将吞吐量翻倍了。
多提并行存储器中,每个模块都有相同容量和速度,各个模块都有独立的读写控制电路、地址寄存器和数据寄存器。既可以并行工作也可以交叉工作。
单体多字存储器
单体多字存储器中,只有一套存取电路和控制电路,多个存储器共用这套电路。每个存储单元存储m个字,只能同时读取m个字,也就是一次读一行,不能单独存取其中各个子,灵活性较差,但是读取效率相近,并且硬件成本更低。
3.3 主存储器与CPU的连接
一、连接原理
- 主存储器通过数据总线、地址总线和控制总线与CPU连接
- 地址总线的位数决定了可寻址的最大内存空间
CPU中的MDR通过数据总线与主存相连,其宽度就是存储字长,MAR通过地址总线与主存相连。单个内存芯片的容量不大,但是可以将多个芯片集成在一根内存条上,然后多个内存条和主板上的ROM管理芯片组成计算机的主存系统。
二、主存容量的扩展
在了解主存容量扩展之前,先看看存储器芯片的各种输入输出信号
其中地址线分为A0,A1,A2用于标识地址的各个位;数据线用D0,D1,D2表示数据的各个位
单个存储芯片的容量有限,在字长或者位长方面与实际要求可能有差距,因此需要在这两方面进行扩充
1.位扩展法
有的存储器的位数与CPU数据线的位数不一致,比如64位地址线,64位数据线的i7-7700HQ芯片搭配上16位的存储芯片。这种情况下需要使用多个存储器件对位长进行扩充,比如使用4片16位的存储芯片,使其数据位长与芯片相等。CPU对数据的0-15位的访问从第一个芯片中取出,对16-31位的从第二个中取出,同理推导。
在上述例子的位扩展中,读取第0号数据的时候,是一次性读出4片存储器中第0号数据,总计4个16bit,加起来就是一个64bit。因此四个芯片的读写信号是统一操作的,它们的读写信号线是同一根信号线。
以下是将1位8k的存储器芯片拓展为2位字长的实例,可以以此类推一直扩展到8位
2.字扩展法
上述的位扩展字扩展了内存中单个字的二进制位数,相对应的字扩展增加了内存中字的数量,而保持位数不变。字扩展将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。也就是将数个存储芯片都接入到相同的地址线上,比如i将4片2G64位的内存接在64位的i7-7700芯片的地址线上。但是这样做会使得CPU无法区分存储芯片(因为都是使用相同的地址线),所以需要使用片选信号,通常通过空余的数位地址线来传递片选信号以确定选中的是哪个芯片。如何进行片选,请看下面的存储芯片的地址分配和片选
3.字位扩展法
事实上,存储器一般会同时扩展字和位,则会采用多个芯片同时扩展主存的字和主存的位。
三、存储芯片的地址分配和片选
CPU访问内存单元需要先进行片选,再在所在的存储器中进行字选。CPU直接通过地址线的N条低位线将地址传输到所有存储芯片的地址输入端,由主存内部器件进行片选。片选分为线选法和译码片选法
1.线选法
线选法指的是每一条地址线代表一片内存芯片。比如一个有16位地址线、8位地址线的CPU接入4片8位的内存芯片,采用字扩展扩展内存。那么线选法就需要4位地址线:第一条地址线的高电平表示选中第一个芯片,第二条地址线的高电平表示选中第二个芯片,以此类推。在例子中,0~13位已经用于选择芯片内地址了,因此第14位地址线高电平就是选择第一片芯片以此类推。
线选法的优点在于不需要地址译码器,线路简单。但是缺点在于地址空间不连续,而且不能充分利用地址线资源。比如上述例子只会存在0001、0010、0100、1000这四种内存地址开头,如果是1100开头的内存地址会导致的同时选中两片内存芯片,CPU无法区分内存信号来自哪个芯片。
2.译码片选法
译码片选法将控制片选的地址线接入到特定的译码器中,从而使得可以用二进制信号控制片选。比如有8片内存芯片,那么译码片选法则需要3条地址线abc,其中abc=000代表选中第一个芯片,abc=001代表选中第二个芯片,以此类推。
和片选法不一样,使用该法的时候,会使得内存空间连续,并且接入更多的内存芯片。但是电路复杂,成本高。
3.译码器知识补充
高电平有效和低电平有效所需要使用到的译码器是不一样的。其中还有使能端,使能端用于控制该译码器是否起作用,也可能存在多个使能端,只有所有使能端均有效才能表示该译码器起作用。
使能端能够让CPU控制片选信号的生效时间。CPU刚开始发出地址信号的时候,电流尚不稳定,此时会让使能端暂时不导通。到了电流稳定的时候,才导通使能端,进行内存读写操作
3.4 外部存储器
磁表面存储器是最主要使用的存储器
磁盘存储器
优点在于1.存储容量大,价格低2.记录介质可以重复使用3.记录信息可以长期保存不丢失4.非破坏性读出
缺点在于:存取速度慢,机械结构复杂,对工作环境要求高
一、概念
注意的是,一个盘片的正面和背面都可以涂上磁性材料携带信息,从而增加信息存储密度。
磁盘性能指标
3.平均存取时间
平均存取时间=寻道时间(磁头移动到目的磁道)+旋转移动时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间),平均旋转时间是旋转半圈需要的时间
4.数据传输率
磁盘存储器在单位时间内向主机传输的字节数。
磁盘转速为r,每条磁道容量为N字节,则数据传输率为D=rN
磁盘地址
驱动器号 | 柱面(磁道)号 | 盘面号 | 扇区号 |
---|
一台电脑可能有多个硬盘因此需要驱动器号;柱面号则是负责移动磁头臂进行寻道操作,而盘面号用于选择激活哪个磁头,扇区号则使得磁盘旋转将特定扇区划过磁头下方。
硬盘工作过程
由于硬盘是串行读写的,而主机的某些操作是并行的,因此会需要一个串并行转换器进行转换,比如说主机要求读出一个字节,那么磁盘分别读出8个位后,传回到串并行转换器完成转换后,一并送往主机。
二、磁盘阵列
RAID 0:无冗余无校验的磁盘阵列,将逻辑上相邻的数据存储在多个不同的磁盘中,从而提升磁盘读取速度,和内存的低位交叉编址思想相似。
RAID1:镜像磁盘阵列,多个磁盘存储同一份数据,安全性高,但是利用率低,只有二分之一
RAID2:逻辑上连续的几个bit物理上分散存储在各个磁盘中,并且采用海明码进行纠错。一般4bit信息位会配备3bit海明校验位,可以纠正一位错,发现两位错
RAID3:位交叉奇偶校验磁盘阵列
RAID4:块交叉奇偶校验的磁盘阵列
RAID5:无独立校验的奇偶校验磁盘阵列
其中数据安全性和数据密度随着数字标号的增长而增加
3.5 高速缓冲存储器(Cache)
近几十年来,主存存取速度变成了计算机的瓶颈,CPU运行速度和主存存取速度不协调。也许CPU完成一次加法操作只需要1ns,但是从内存中取出这两个操作数就需要耗时100ns。而单纯提升一整个主存的存取速度所需要的成本极大,所以需要将内存体系进行分级,将需要频繁使用的信息放置到Cache速度更快但是容量更小的Cache中,将不常用的数据调入速度慢但是容量大的辅存中。如今的分级体系为“Cache——内存——外存”,进行分级的主要依据是程序访问的局部性原理
一、程序访问的局部性原理
程序访问的局部性原理包括时间局部性和空间局部性。时间局部性指的是近期用到的信息在未来很有可能还会用到,比如说for中的sum+=add语句,sum变量是会需要在短时间内反复访问的;空间局部性的信息是指要用到的信息在内存空间上有一定几率是连续的,比如说程序中广泛使用的数组在空间上也是紧邻的。Cache的原理就是将程序正在使用的部分数据放入到存储量小但是速度快的Cache中,从而减小内存读取时间。
二、Cache的基本工作原理
Cache位于存储器层次结构的顶层,通常由SRAM组成。
为便于Cache和主存交换信息,Cache和主存都被划分为等长的块,Cache块又称为Cache行,块的长度被称为块长,一个块中一般包含一个或若干个存储单元。由于Cache容量远小于主存,因此它仅仅保存主存中最近活跃的数据,并且会依照某种策略,预测主存未来一段时间活跃的数据。
当然,并不是每次需要的数据都能在主存中找到。CPU发出读命令,如果访存地址在Cache中命中则在Cache中寻找数据,否则则从主存中寻找数据。CPU要访问的信息已经在Cache中的比率称之为Cache命中率。,反之未命中的情况称之为缺失
CPU主要用两种访问Cache的方式:
- 访问Cache,如果未命中,则访问内存进行查找。设命中率为H,则该种方式平均访问时间为 t = H ⋅ t c + ( 1 − H ) ( t c + t m ) t=H\cdot t_c+(1-H)(t_c+t_m) t=H⋅tc+(1−H)(tc+tm),其中tc为Cache查找时间,tm为主存查找时间
- 同时访问Cache和主存,如果命中了则立刻停止主存查找,如果未命中则等待主存查找结果,设命中率为H,则该种方式平均访问时间为 t = H ⋅ t c + ( 1 − H ) t m t=H\cdot t_c+(1-H)t_m t=H⋅tc+(1−H)tm,其中tc为Cache查找时间,tm为主存查找时间
可以看出,方法2的速度比方法1要快,但是它会挤占一部分主存访问带宽
三、Cache和主存的映射方式
Cache行中的信息是主存中某个块的副本。因此Cache要为每一个块添加一个标记,指明是主存中哪个块的副本。
1.直接映射
主存中的某一数据块只能被装入到Cache中的唯一位置,如果这个位置有内容了,则旧信息会被强制替换掉。直接映射实现最简单,但是不够灵活,即使其他Cache其他许多地址空着也不能占用,使得直接映射的冲突概率最高,空间利用率最低。
Cache行号 = 主存块号 mod Cache总行数
假设Cache有2c行,主存有2m块,在直接映射的方式中,主存的第0块到第2m-c-1块都只能映射到Cache的第0行,以此类推。
直接映射的地址结构为:
有效位 | 主存块号(又称标记位) | Cache块内地址 |
---|
直接映射地址可以进行进一步优化,如果Cache有2c行,那么主存块号的末位c位直接反映了它在Cache中的位置,因此不需要存储末尾n位信息。
比如说有8个Cache块和64个主存块,那么查询地址为28内存块(地址为01100100)是否在Cache中的时候,根据直接映射的规则,该块一定位于地址为0100的Cache上,因此在Cache中的地址可以只存储高4位的信息
上述例子在Cache块的地址如下:
有效位 | 主存块号(又称标记位) | Cache块内地址 |
---|---|---|
1 | 0110 | xxx |
CPU取得上述内存地址01100100的时候,根据地址后4位确定Cache块的位置,然后根据前4位地址确定Cache中存放的是否所需的地址,然后看有效位是否为1,如果都满足则命中
2.全相联映射
主存中的每一块都可以装入Cache中的任何位置,因此每行的标记用于指出该行取自主存的哪一块,所以CPU访存的时候需要与所有的Cache行的标记进行比较。全相联映射方式的优点是比较灵活,Cache块冲突概率低,命中率高。缺点是标记的比较速度较慢,实现成本较高,需要使用昂贵的按内容寻址的相联存储器进行地址映射。
其地址是:
有效位 | 标记位TAG | Cache块内地址 |
---|
其中有效位是用于标记本块是否有存放信息
CPU取得内存地址x,访问Cache,将该地址和所有的Cache块地址中的标记位进行对比,如果存在对应的Cache块,并且该块地址的有效位为1,则Cache命中,否则需要再主存中访问
3.组相连映射
将Cache分成Q个大小相等的组,每个主存块可以装入固定组中的任意一行,即组之间采用直接映射,而组内采用全相联映射。其中一个组有r个Cache块,则称为r路组相关联,组相连映射的关系可以定义为:
Cache组号 = 主存块号 mod Cache组数
组相联映射的地址结构为
有效位 | 标记 | 组号 | 块内地址 |
---|
其中如果有2m个主存块,和2c个Cache组,则一个主存地址的前c位就是组号,后m-c位是标记号。
CPU访存过程如下:
CPU取得内存地址x,根据内存地址的后c位确认组号,然后用内存地址的前m-c位和所选中组中的Cache块的地址的标记位作对比,如果有相同的则命中
四、Cache中主存块的替换算法
在采用全相联映射或者组相联映射方式的时候,从主存向Cache传送一个新块,当Cache中的空间被占满的时候,就需要使用替换算法置换Cache行。如果是直接相联方式,主存块直接替换就好了,从而无需替换算法。
常用的替换算法有:
1. 随机算法(RAND)
随机地替换Cache块。他的实现比较简单,但是命中率比较低。
2. 先进先出算法(FIFO)
选择最早点入的行进行替换。比较容易实现,但是未根据程序访问的局部性原理,因此最早进入的主存块也可能是目前经常要用的,也会出现抖动现象,也就是刚换出的块下一刻又要使用了。
3. 近期最少使用算法(LRU)
根据程序访问的局部性原理,选择近期内长久未访问过的Cache行进行替换,平均命中率要比FIFO高,是堆栈类算法。其中计数器运作原理如下:
- 命中时,数值比命中行计数器低的计数器加1,所命中的行计数器清零,其余不变
- 未命中并且还有空闲行的时候,新装入得行的计数器置为0,其余非空闲行加一
- 未命中并且无空闲行时,计数值最大的行信息块被淘汰,新装入的行置为0,其余全加1
该算法命中率很高,是根据程序的局部性原理进行设计的算法,但是如果频繁访问的主存块数量>Cache数量,则还是会发生抖动
5. 最不经常使用算法(LFU)
根据程序访问的局部性原理,选择最少使用的Cache行进行替换。该算法会使用一个计数器,每个Cache行初始都为0,每被命中一次就加一,当Cache满的时候,将会选择命中次数最少的进行替换。
如果有多个计数器最小的行,则可以按照最小行号或者FIFO的规则进行选择。但是曾经经常被使用的主存块在未来不一定用到,并没有很好的遵循局部性原理,因此实际运行效率不如LRU
五、Cache写策略
因为Cache中的内容是主存块的副本,因此当对Cache中的内容进行更新的时候,需要写操作策略使得Cache内容和主存的一致。此时分为两种处理方法:
写命中
当Cache写命中的时候:
1.全写法。当CPU对Cache写命中的时候,必须把数据同时写入Cache和主存。当某一块需要替换的时候不需要将这一块写回主存,而是用新调入的块直接覆盖。这种方法实现简单,能够保持主存数据的正确性。但是增加了访存次数,而且写回主存的速度会比写回Cache的速度慢很多,导致速度不匹配。因此会采用写缓存来减少全写法直接写入主存的时间消耗,在Cache和主存之间加一个写缓冲,写缓冲是一个SRAM存储器,采用FIFO队列。CPU首先将需要写回主存的数据写入写缓冲中,然后无需等待继续执行下一步,写回主存的任务交由写缓冲来进行,但是这样子有一定几率在频繁写的时候导致写缓冲饱和溢出的情况。
2.回写法。CPU对Cache写命中的时候,只把数据写入Cache,而不立刻写入主存,只有当此块被换出的时候才写回主存。这种方法减少了访存次数,但是存在内存不一致的情况。每个Cache行会设置一个修改位(脏位),当该位为1的时候表明数据经过修改,替换的时候需要写回主存。
写不命中
当Cache写不命中的时候(也就是需要写入的数据不在Cache而在主存中):
1.写分配法:加载主存中的块到Cache中,然后更新这个Cache块。利用了程序的空间局部性,但是每次不命中都需要从主存中读取一块,适合和写回法配合使用。
2.非写分配法:只写入主存,不进行调块,适合和全写法使用,这种情况下只会在读未命中的时候调入Cache,写不命中不会调入Cache
总的来说,各级Cache之间常用全写法+非写分配法;Cache-主存之间常用写回法+写分配法
六、总结
到最后可以总结的是,一个Cache行里,会有什么:
分别是标记该Cache行是否有效的有效位1bit,标志改Cache行是否经过更改的修改位1bit,以及根据替换算法的需要所设置的若干位的替换控制位,以及用于标记该cache行位于什么位置的标记位,最后是该cache行的数据内容
有效位 | 脏位 | 替换控制位 | 标记位 | 数据内容 |
---|
3.6 虚拟存储器
详情请见操作系统第三章
将一个程序拆分为若干个大小相等的页,分散地放置在主存中,以减少对连续地址空间的需要。分页是操作系统分配的,对程序员是透明的。因此引申出一个新概念,称为虚拟地址(虚地址),虚拟地址是程序员视角看到的地址,物理地址(实地址)则是在内存中实际的位置
假设一个程序有26B大小,那么在程序员视角,该程序的地址是从000000到111111。通过页表可以将逻辑页号映射为物理页号。页表存储在主存中,
逻辑地址构成如下
逻辑页号 | 页内地址 |
---|
物理地址构成如下
物理页号 | 页内地址 |
---|
另外还有一个页表基址寄存器,用于指明页表存储的位置。
快表是一个相联存储器,可以使用内容查询
今天的文章计算机组成原理存储结构_以存储器为中心的计算机工作原理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88038.html