第三章:存储系统(408笔记|王道笔记|计算机组成原理笔记)

本文详细介绍了计算机组成原理中存储系统的关键概念,包括内存层次结构、RAM、ROM、高速缓存(Cache)的工作原理及其优化技术,适合考研及学习开发语言的读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一节:存储系统——基本概念

存储器的层次结构

  • 辅存中的数据要调入主存后才能被CPU访问
  • 主存—辅存:实现虚拟存存储系统,解决了主存容量不够的问题
  • Cache—主存:解决了主存与CPU速度不匹配的问题【由硬件实现,对所有程序员透明】

存储器的分类

按层次

高速缓存(Cache)可直接被CPU读写

主存储器(主存,内存)可直接被CPU读写

辅助存储器(辅存,外存)

按存储介质分

半导体存储器(主存,Cache)以半导体器件存储信息

磁表面存储器(磁盘,磁带,机械硬盘)以磁性材料存储信息

光存储器(光盘)以光介质存储信息

按存取方式分

随机存取存储器RAM

(RandomAccess Memory):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关【内存条】

顺序存取存储器SAM

(SequentialAccess Memory):读写一个存储单元所需时间取决于存储单元所在的物理位置【磁带】

直接存取存储器DAM

(Direct AccessMemory):既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取【磁盘,移动磁头臂到想要读取的数据区域是随机存取特性,等待磁盘转动,把存储目标数据的区域滑动到磁头下面就是顺序存储特性】

串行访问存储器

读写某个存储单元所需时间与存储单元的物理位置有关【SAMDAM

相联存储器CAM
按内容访问

(Associative Memory)即可以按内容访问的存储器(ContentAddressed Memory,CAM)可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器

按信息的可更改性分

读写存储器

(Read/Write Memory)即可读、也可写(如:磁盘、内存、Cache

只读存储器
ROM

(Read Only Memory)只能读,不能写(如:实体音乐专辑通常采用CD-ROM,实体电影采用蓝光光碟,BIOS通常写在ROM

【事实上很多ROM也可多次读写,只是比较麻烦,比如刷BIOS

按信息的可保存性

断电后,存储信息消失的存储器——易失性存储器(主存、Cache

断电后,存储信息依然保持的存储器——非易失性存储器(磁盘、光盘)

信息读出后,原存储信息被破坏——破坏性读出DRAM芯片,读出数据后要进行重写)

信息读出后,原存储信息不被破坏——非破坏性读出SRAM芯片、磁盘、光盘)

存储器的性能指标

存储容量

存储容量=存储字数×字长(如1M×8位)MAR位数反应存储单元的个数(最多支持多少个)MDR位数=存储字长=每个存储单元的大小】

单位成本

单位成本(每位价格)=总成本/总容量 /Gbit Mbit

存储速度

数据传输率(主存带宽)=数据的宽度/存储周期【数据的宽度即存储字长】

存取时间(Ta)

存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间

存取周期(Tm)

存储周期=存取时间+恢复时间

存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔

主存带宽(Bm)

主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)

第二节:主存储器的基本组成

半导体元件的原理

MOS管

MOS管可以理解为一种电控开关,输入电压达到某个阈值时,MOS管就可以接通

电容

给电容充电的过程,就是写数据的过程,给电容放电的过程,就是读数据的过程

步骤

红色线是MOS管,当MOS管给了一个电压之后导通,电容里的电荷就能顺着绿色的线往外导出,我们只需检测绿色的线有没有电流就能判断每条线对应的是0还是1,通过这种方式就能读取出存储元中存储的二进制比特的信息【一行存储元构成一个存储单元/存储字,多个存储单元构成一个存储体/存储矩阵

存储芯片的基本原理

解决

问题

如何通过地址来决定读或者写哪个存储字?——译码器

译码器工作原理

假设CPU给译码器送过来的是000地址信号,译码器把000翻译成十进制0,所以译码器会把第0根字选线给它一个高电平信号,这样的话第一个存储字所对应的存储元件都会被选通,然后就可以读出二进制数据了【二进制地址信号十进制字选线高电平信号】

控制电路工作原理

控制电路用于控制译码器,MAR,MDR。比如CPU通过地址总线把地址送入MAR中,由于使用电信号来传送这些二进制数据,电信号难免有不稳定的情况,因此MAR里的电信号稳定之前,这个地址信息是不能送至译码器当中的,只有MAR电信号稳定之后,控制电路才会打开译码器的开关,让译码器翻译地址然后给出相应的字选线高电平信号。同理当数据输出时,只有当输出的电信号稳定之后,控制电路才会认为此时的输出才是正确无误的,然后送入数据总线

片选线

𝐶S或𝐶E Chip select/enable ,用于控制该存存储芯片是否有效头上划线表示该信号低电平有效

读写控制线

两根读/写线

WE 允许写,OE 允许读write enable output enable】

一根读/写线

WE 低电平写,高电平读

译码驱动

译码器后面其实接了个驱动器,就是为了放大译码器的信号,保证译码器输出的电信号稳定可靠

读写电路

图中的红绿色线以及控制电路,都是用来控制数据的读写的

存储矩阵

存储矩阵就是一个一个的存储元构成的

地址线

接收外界传进来的地址信息,通常是CPU通过地址总线传输进来的

数据线

把目标地址的数据传输到地址总线

片选线

通过片选线的电信号来确定这块芯片是否可用【一个内存条可能包含多块存储芯片】

读写控制线

可能有一条也有可能有两条-

题目:会告诉这块存储器芯片的一些参数信息,求这块芯片的金属引脚的数目至少是多少?
:求出地址线个数,数据线个数,再加上片选线和读写控制线即可(读写控制线至少一根)【另外还有供电引脚,接地引脚】

n位地址→2n个存储单元
总容量=存储单元个数×存储字长= 2^3×8bit = 2^3× 1Byte = 8B
8×8位的存储芯片【第一个8表示有8个存储单元,第二个8表示存储字长是多少】
常见描述:
8K × 8位,即2^13×8bit  8KB

8K × 1位,即2^13×1bit  8Kb=1KB

64K × 16位,即2^16×16bit
K:2^10      M:2^20      G:2^30      T:2^40

如何实现不同的寻址方式

如果按字寻址,因为一个字占4个字节,那么只要把字地址算数左移两位就把字地址转换为与之对应的字节地址,假如要访问1号字,那算数左移两位即100即为十进制的4,也就是对应的字节地址

第三节:DRAM和SRAM

Dynamic Random Access Memory,即动态RAM

Static Random Access Memory,即静态RAM

DRAM用于主存SRAM用于Cache

高频考点:DRAMSRAM的对比

DRAM也已经过时,现在采用SDRAM芯片,如DDR3,DDR4,它们都属于SDRAM芯片

存储元件不同导致的特性差异

核心

区别:
 

存储元不同

DRAM芯片

使用栅极电容存储信息

SRAM芯片

使用双稳态触发器存储信息

DRAM栅极电容

缺点

电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称作为“再生”——读写速度更慢

优点

每个存储元制造成本更低集成度高(体系小),功耗低

SRAM双稳态触发器

优点

读出数据,触发器状态保持稳定,是非破坏性读出无需重写——读写速度更快

缺点

每个存储元制造成本更高集成度低,功耗大,需要六个MOS管

对比

DRAM

栅极电容

电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失,2ms之内必须“刷新”一次(给电容充电)

SRAM双稳态触发器

只要不断电,触发器的状态就不会改变

DRAM的刷新

①多久需要刷新一次? ——刷新周期:一般为2ms

②每次刷新多少存储单元?——为单位,每次刷新一行存储单元

③为什么要用行列地址?——减少选通线(一行一字情况下的的字选线)的数量,使电路更简单

④如何刷新?——有硬件支持,读出一行的信息后重新写入占用1个读/写周期
“刷新”由存储器独立完成,不需要CPU控制

⑤在什么时刻刷新?——假设DRAM内部结构排列成128×128的形式,读/写周期(存取周期)为0.5us,那么2ms2ms/0.5us=4000个周期

思路一

分散刷新:每次读写完都刷新一行系统的存取周期变为1us,前0.5us时间用于正常读写,后0.5us时间用于刷新某行

思路二

集中刷新:2ms内集中安排时间全部刷新→系统的存取周期还是0.5us,有一段时间专门用于刷新无法访问存储器,称为访存“死区

思路三

异步刷新:2ms内每行刷新1次即可2ms内需要产生128次刷新请求每隔2ms/128 = 15.6us一次,每15.6us内有0.5us的“死时间实际应用当中可以利用CPU不要访问存储器的这段时间进行刷新,如CPU取得了一条,在译码的阶段进行刷新

DRAM的地址线复用技术

DRAM分两次送行,列地址,可使地址线更少,芯片引脚更少【地址线,地址引脚数量减半】

第四节:只读存储器ROM

RAM芯片

易失性,断电后数据消失

ROM芯片

非易失性,断电后数据不会丢失

了解各种ROM

MROM

掩模式只读存储器厂家按照客户需求,在芯片生产过程中直接写入信息之后任何人不可重写(只能读出)可靠性高、灵活性差、生产周期长、只适合批量定制

(Mask Read-Only Memory)

PROM

可编程只读存储器用户可用专门的PROM写入器写入信息,写一次之后就不可更改(Programmable Read-Only Memory)

EPROM

可擦除可编程只读存储器允许用户写入信息,之后用某种方法擦除数据,可进行多次重写(Erasable Programmable Read-Only Memory)

UVEPROM

用紫外线照射8~20分钟,擦除所有信息(ultraviolet rays)

EEPROM

可用“电擦除”的方式,擦除特定的字(也常记为E^2PROM,第一个E是Electrically)

Flash Memory

闪速存储器(U盘,SD卡就是闪存)EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写注意:由于闪存需要先擦除在写入,因此闪存的“写”速度要比“读”速度更慢【每个存储元只需单个MOS管,位密度比RAM高】

SSD

固态硬盘由控制单元+存储单元(Flash芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘【手机辅存也使用Flash芯片,但相比SSD使用的芯片集成度高、功耗低、价格贵】

计算机内的重要ROM

CPU的任务:到主存中取指令并执行指令
由于RAM的易失性,断电后RAM内数据全部丢失包括操作系统,而操作系统原程序是安装在辅存当中的,但是主板上的BIOS芯片(ROM)存储了“自举装入程序”,负责引导装入操作系统(开机),把相关操作系统从辅存当中调入内存当中【注:我们常说“内存条”就是“主存”,但事实上,主板上的ROM芯片也是“主存”的一部分

第五节:主存储器与CPU的连接

单块存储芯片与CPU的连接

注:以前的计算机的MAR和MDR放在存储芯片当中但是,现在的计算机MAR、MDR通常集成在CPU内部。存储芯片内只需一个普通的寄存器(暂存输入、输出数据)

存储器芯片的输入输出信号

输入输出信号有:地址线,数据线,片选线,读写控制线

有横线低电平有效,没有横线高电平有效

多块存储芯片与CPU的连接

位扩

展法

字扩

展法

线选法

概念

𝐴14𝐴13只能为01或10,00和11无法使用。n条线→n个选片信号【说白了哪个芯片为1就说明这个芯片启用】

优点

电路简单

缺点

地址空间不连续,如有多个片选线,也只能0001有效,0011则无效了

片选法

概念

通过译码器使得n条线→2n个选片信号

优点

地址空间可连续,实际的应用当中都是采用片选法

缺点

电路复杂

注意:片选信号CS上加了横线说明低电平有效,也就是0有效,当我们要表示一个低电平有效的输入信号的时候通常在信号输入端画一个小圆圈。译码器右侧的信号输出端也有个小圆圈,也是对译码器输出信号的取反,由于片选信号是低电平有效,而译码器输出的信号是高电平如0001,而片选信号是低电平有效,所以我们需要在输出端取反变成1110,也就是0号存储芯片有效

注意:考察译码器的使用,根据输入输出的线的数量,来判断地址空间是多少,如1-2译码器;2-4译码器;3-8译码器,CPU输入的地址信号为3个二进制,片选线有8

题目当中通常会不选择相邻的地址线来考察我们,没有被使用的地址线,不管取任何值都不会影响我们接通的地址线的地址信号,如下图接通的是A13与A15的地址信号线,而A14号被直接跳过了,也就是A14号地址信号不管为任何值都不影响A15和A13组成的二进制片选信号的值。但是由于A14任意值都依然对应合法的地址存储单元,例如本来一个芯片只有8K个存储单元,但是多出一个A14随意取任何值的多余的信号位,导致有16K个合法地址对应8K个存储单元【实际应用不可能采用,考试用来考察我们】

字位扩展法

一般考察存储器芯片的选择

位扩展能使得存储器的字长变的更长,从而更好的发挥数据总线的数据传输能力
字扩展能增加存储器的存储字数更好的利用CPU的寻址能力
位扩展与字扩展从不同纬度上扩展主存的总容量

字位同时扩展:

关于译码器知识的补充

第六节:双端口RAM&多模块存储器——对于主存提升CPU访问主存速度的方法

问题

多核CPU都要访存,怎么办?——用双端口RAM来解决,优化多核CPU访问一根内存条的速度

CPU的读写速度比主存快很多,主存恢复时间太长怎么办?——多模块存储器来解决

双端口RAM

图示

两个端口对同一主存操作的4中情况

1. 两个端口同时对不同的地址单元存取数据。✔

2. 两个端口同时对同一地址单元读出数据。✔

3. 两个端口同时同一地址单元写入数据。❌写入错误

4. 两个端口同时同一地址单元,一个写入数据,另一个读出数据。❌读出错误

有了双端口RAM的这种访问方式,也就优化了多核CPU访问一根内存条的速度

错误解决办法:置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问

多模块存储器
——

多体并行存储器

单体多字存储器
 

图示

     高位交叉编址的多体存储器

连续取n个存储字→此处耗时5T→耗时nT

低位交叉编址的多体存储器

连续取n个存储字→此处耗时T+4r=2T→耗时nr+3r=T+(n-1)r

应该取几个“体”

方法

采用“流水线”的方式并行存取(宏观上并行,微观上串行)宏观上,一个存储周期内,m体交叉存储器可以提供的数据量为单个模块的m倍。

两种常见描述

存取周期为T,存取时间为r为了使流水线不间断,应保证模块数mT/r

存取周期为T,总线传输周期为r,为了使流水线不间断,应保证模块数m≥T/r

不管怎么描述,都是把一个数据传输给CPU所需的时间为r,另外3r为存储器自己的恢复时间r+3r=T(存取周期)

三种情形对比

思考

给定一个地址x,如何确定它属于第几个存储体?(采用低位交叉编址的多体存储器)
答:如果是二进制,直接根据末尾体号判断是哪个存储体,如果是十进制,直接对存储体的个数M取余x%m即可

对比

多体并行存储器

  • 每个模块都有相同的容量和存取速度。
  • 各模块都有独立的读写控制电路、地址寄存器和数据寄存器
  • 它们既能并行工作,又能交叉工作

单体多字存储器

——

相当于把多体合并

  • 每个存储单元存储m个字
  • 总线宽度也为m个字
  • 一次并行读出m个字
  • 每次只能同时取m个字
  • 指令和数据在主存内必须是连续存放的
  • 只需一套控制电路,地址寄存器和数据寄存器
  • 相比于多体并行存储器灵活性差

【不能单独取其中某个变量,比如一个变量占了5个字,存在行现象,得读取多次,而且读取了无用信息】

两者时间差不多:当T=4r时,多体并行存储器的每个字存取时间接近于r,单体多字存储器每一个T能直接存取4个字的内容,平均来看T/4=r,也就是每个字也是r的时间

如何插入内存条,实现高位交叉的多体存储器(相当于单纯的扩容)?

如何插入内存条,实现低位交叉的多体存储器(俗称“双通道”)?

Tips:买内存条时,可挑选相同主频(1/读写周期T、相同容量的两根来组成双通道

如果两根主频不一样的内存条,其中高主频的内存条会进行降频处理,发挥不出功效

如果不同容量的两根内存条,低地址部分构成双通道,高地址部分依然是单通道,会造成性能不太稳定

⭐第七节:高速缓冲器Cache

Cache基本原理基本概念

存储系统存在的问题

局部性原理

空间局部性

在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的【数组元素、顺序执行的指令代码】

时间局部性

在最近的未来要用到的信息,很可能是现在正在使用的信息循环结构的指令代码】

基于局部性原理,不难想到,可以CPU目前访问的地址周围的部分数据放到Cache

Cache的工作原理

性能

分析

tc为访问一次Cache所需时间,tm为访问一次主存所需时间

命中率H:CPU欲访问的信息已在Cache中的比率

缺失率M = 1 - H

Cache—主存  系统的平均访问时间t有两种方式

两种

方式

t = Htc +(1H)(tc + tm) 【先访问Cache,未命中访问主存】

t=Htc+(1H) tm【同时访问Cache和主存,若Cache命中则立即停止访问主存

例题

存在的问题

问题

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。如何界定“周围”?

办法

将主存的存储空间“分块”,如:每1KB为一块。主存与Cache之间以“块”为单位进行数据交换Cache的“块”又叫“行”】

图示

注意:每次被访问的主存块,一定会被调入Cache

新问题

  • 如何区分Cache与主存的数据块对应关系?——Cache和主存的映射方式
  • Cache很小,主存很大。如果Cache满了怎么办?——替换算法
  • CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性?——Cache写策略

Cache和主存的映射方式(重点)

三种映射方式

图示

全相联映射问题

问题

如何区分Cache中存放的是哪个主存块?

办法

给每个Cache块增加一个标记位”,记录对应的主存块号

新问题

由于Cache中初始的块“标记”为0,操作系统无法辨别还是0号块副本

办法

增加有效位”,有效位为1则该块有效,为0则该块无效

全相联映射

概念

主存块可以放在Cache的任意位置

例子

优点

Cache存储空间利用充分,命中率高,灵活性高

缺点

查找“标记”最慢,有可能需要对比所有Cache/块的标记

相联映射访存步骤

CPU访问主存地址11101001110:

①主存地址的22,对比Cache中所有块的标记

②若标记匹配且有效位=1,则Cache命中,访问块内地址为001110的单元。

③若未命中或有效位=0,则正常访问主存

直接相联映射

概念

每个主存块只能放到一个特定的位置Cache块号=主存块号% Cache总块数

例子

优点

对任意地址,都可以直接根据块号确定它唯一有可能在Cache中存放的位置,只要一次对比

缺点

其他地方有空闲Cache块,但是8号主存块不能使用。相比于全相联映射,灵活性差一些,空间利用率也不充分

优化

“标记”的优化:没必要全部保存“标记”的22位主存块号,只需保存22位当中的前19位,因为后3位其实就是8Cache块号序号的二进制表示——主存块号%2^3相当于留下最后三位二进制【若Cache总块数=2^n,则主存块号末尾n位直接反映它在Cache中的位置,只需将主存块号的其余位作为标记即可】

图示

直接相联映射访存步骤

CPU访问主存地址001000 001110 :

根据主存块号的3确定Cache

②若主存块号的前19位与Cache标记匹配且有效位=1,则Cache命中,访问该Cache块内副本的块内地址为001110的单元

③若未命中或有效位=0,则正常访问主存

组相联映射

概念

Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置组号=主存块号%分组数【主要是为了解决直接相联映射的缺点——有空闲Cahche块还无法放入】

图示

2路组相联映射

优点

结合了全相联映射中自由度——组内随意存放
结合了直接相联映射快速找到组号的速度,综合效果比较好

相联映射访存步骤

CPU访问主存地址11101001110 :

①根据主存块号的2确定所属分组号

②若主存块号的20与分组内的某个标记匹配且有效位=1,则Cache命中,访问块内地址为001110的单元。

③若未命中或有效位=0,则正常访问主存

结合每种地址映射方式的地址结构思考:给定一个主存地址,如何拆分地址,并查找Cache、访存?

替换算法

三种

情况

全相联映射

Cache完全满了才需要替换需要在全局选择替换哪一块——本节以全相联为例

直接映射

如果对应位置非空,则毫无选择地直接替换——无需考虑替换算法

组相联映射

组内满了才需要替换需要在分组内选择替换哪一块

注意

每次被访问的主存块,一定会被调入Cache,所以我们需要Cache替换算法

Cache替换

算法

随机

算法RAND

概念

若Cache已满,则随机选择一块替换

示例

优点

实现简单

缺点

完全没有考虑局部性原理,命中率低,实际效果很不稳定

先进先出算法FIFO

概念

若Cache已满,则替换最先被调入Cache的块

示例

优点

实现简单,最开始按#0#1#2#3放入Cache,之后轮流替换#0#1#2#3

缺点

FIFO依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的

抖动

抖动现象——频繁的换入换出现象刚被替换的块很快又被调入

近期最少使用LRU

概念

为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的(LRU,Least Recently Used)

规则

  1. 命中时,所命中的行的计数器清零,比其低的计数器加1其余不变
  2. 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1
  3. 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1

示例

Cache块的总数=2n,则计数器只需n位。且Cache装满后所有计数器的值一定不重复

优点

基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高

缺点

若被频繁访问的主存块数量> Cache行的数量,则有可能发生抖动如:{1,2,3,4,5,1,2,3,4,5,1,2…}

最近不经常使用LFU

概念

为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的

规则

新调入的块计数器=0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行,若有多个计数器最小的行,可按行号递增,或FIFO策略进行选择

示例

计数器的值是0到一个很大的的数,如果要用硬件实现LFU的计数器,每一个Cache/块对应的计数器,需要比较长的二进制比特位来表示

缺点

曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),并没有很好地遵循局部性原理因此实际运行效果不如LRU

Cache写策略

命中

写回法

write
back

概念

当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存

示例

需要新增一个脏位数据表示当前Cache块是否被修改

优点

减少了访存次数

缺点

存在数据不一致的隐患

全写法
 

write

through

概念

当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)

示例

缺点

访存次数增加,速度变慢,但更能保证数据一致性

优化

——
使用写缓冲

优点

使用写缓冲,CPU写的速度很快

若写操作不频繁,则效果很好

若写操作很频繁,可能会因为写缓冲饱和而发生阻塞

新增cache

缓冲区

命中

写分

配法
write
allocate

概念

当CPU对Cache写不命中时,把主存中的块调入Cache在Cache中修改副本通常搭配写回法使用【写回法—— 当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存】

示例

非写分配法
not

Write

allocate

概念

当CPU对Cache写不命中只写入主存不调入Cache搭配全写法使用
【采用非写分配法,只有“读”未命中时才调入Cache

示例

多级Cache

概念

现代计算机常采用多级Cache

离CPU越近的速度越快,容量越小

离CPU越远的速度越慢,容量越大

图示

搭配

各级Cache之间常采用“全写法(命中:cache和主存都写)+非写分配法(未命中:只写入主存,不写入cache【每个Cache都速度起

Cache-主存之间常采用“写回法(命中:cache块调出时才写回)+写分配法(未命中:先从主存中调入cache再在cache中修改副本

第八节:页式存储器

页式

存储

页式存储系统

一个程序(进程)在逻辑上被分为若干个大小相等的“页面”“页面”大小与“块”的大小相同。每个页面可以离散地放入不同的主存块

虚地址
vs
实地址

逻辑地址

也是虚地址,程序员视角看到的地址

物理地址

也是实地址,实际在主存中的地址

示例

程序员视角:整个程序共4KB=2^12B,地址范围:000000000000~111111111111

现在取变量x至ACC寄存器

机器指令:000001 001000000011【程序员给逻辑地址,操作系统映射为物理地址】

操作码+地址码(使用逻辑地址)

变量x的逻辑地址:001000000011

变量y的逻辑地址:110000001010

变量x的物理地址:0000000000101000000011

变量y的物理地址:1111111111110000001010

页表

CPU执行的机器指令中,使用的是"逻辑地址"因此需要通“页表”将逻辑地址转为物理地址

页表的作用

记录了每个逻辑地址页面存放在哪个主存块中,逻辑页号→主存块号,页表的数据存在主存里

示例

CPU访问某个主存地址:这个块的数据可能在Cache
近期访问的页表项放入更高速的存储器,可加快地址变换速度——TLB快表

改进引入快表

快表Cache区别

快表是在逻辑地址到物理地址变换的过程中起到加速作用【可能直接访问快表命中,而快表是相联存储器按内容寻访很快,也可能需要访问主存中的页表(快表采用了SRAM快得多,而内存中的页表则是DRAM更慢。快表是相联存储器按内容寻访,对于普通主存来说,CPU寻访某一信息是根据地址信息寻访,相联存储器可以根据标记的实际内容快速通过硬件电路找到在快表当中有没有对应的标记
Cache则是在最终得到了地址,访问这个地址起到加速的作用【可能直接访问Cache中的副本,也可能仍需访问主存中的内存块

快表中存储的是页表项的副本;Cache中存储的是主存块的副本

访问一个逻辑地址的整个过程

第九节:虚拟存储器

虚拟存储器

虚拟存储器是辅存→内存。和内存→Cache原理基本相同,都是根据局部性原理
【虚拟存储器主要是由操作系统来实现的】

页式虚拟存储器

外存块号

可以把128G的辅存页进行分块,方便调入主存

有效位

表示当前页表项是否有效

访问位

(引用位)

为了实现页面替换算法类似Cache的替换,只不过页面替换算法是辅存主存,而Cache替换算法则是主存高速缓存Cache【页面替换算法可以用LRUFIFO等,此处访问位可以使用LFU算法,优先淘汰被访问总次数较少的页面】

脏位

  • 与Cache的脏位一样的意思,当我们修改了Cache中某块的数据,当这块数据需要被淘汰的时候,由于脏位为1,需要把这个Cache块写回主存
  • 同理对于页式存储,我们对于主存中某些块的内容进行了更改之后,当这个块需要被淘汰的时候,由于该块数据已经被更改,脏位为1,我们需要把这块内容写回辅存

存储器的层次化结构

段式虚拟存储器

页式虚拟存储器

把某个程序拆分成大小相等的页面

段式虚拟存储器

按照功能模块拆分,如:#0段是自己的代码,#1段是库函数代码,#2段是变量

图示

段页式虚拟存储器

概念

把程序按功能逻辑结构分段每段再划分为固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位。每个程序对应一个段表,每段对应一个页表

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是bit不是byte

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

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

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

打赏作者

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

抵扣说明:

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

余额充值