cache存储器

主存和Cache之间的数据调动是由硬件自动完成的,对所有程序员均是透明的;而主存和辅存之间的数据调动则是由硬件和操作系统共同完成的,对应用程序员是透明的。
MDR和MAR逻辑上在主存中,实际上在CPU中;地址译码器在主存中。

一、半导体随机存取存储器

1.基本结构

2.随机存储器RAM

Cache由静态随机存取SRAM实现,主存由动态随机存储器DRAM实现,它们都是易失的。

(1) 工作原理

  • 静态随机存取存储器SRAM

SRAM基于双稳态触发器,存取速度快,但集成度低,功耗较大。

  • 动态随机存取存储器DRAM

DRAM基于电荷,采用地址复用技术(地址线是原来的一半),存取速度比SRAM慢,集成度高,价位低,容量大,功耗低。
即时电源不断电,信息也会自动消失,因此每个一个刷新周期(2ms)就要刷新一次,每次占用一个存储周期。

刷新方式:

①集中刷新:在死时间/死区对所有行一次刷新,访存速度快,但在死时间内不能访问存储器。
②分散刷新:把对每行的刷新分散到各个工作周期中去,访存速度慢,但没有死时间。若将刷新安排在不需要访问存储器的译码阶段,则既不会加长存取周期,又不会产生"死时间",这是分散刷新方式的发展,也称为"透明刷新"。
③异步刷新:具体做法是将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。这样可以避免使CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率。

刷新需注意以下问题∶

①刷新对CPU透明,即刷新不依赖于外部的访问;
②刷新单位是行,因此刷新操作时仅需要行地址;
③刷新操作类似于读操作,但又有所不同;
④刷新操作仅给栅极电容补充电荷,不需要信息输出;
⑤刷新时不需要选片,即整个存储器中的所有芯片同时被刷新。

(2)SRAM和DRAM的比较

3.只读存储器ROM

结构简单,所以位密度比RAM的高;具有非易失性,所以可靠性高。ROM的升级版有以下几种:

  • MROM(Mask Read-Only Memory)∶在生产过程中直接写入,以后任何人都无法改变其内容
  • PROM(Programmable ROM)∶允许用户用专门设备写入程序,写入后内容就无法改变
  • EPROM(Erasable Programmable ROM)∶允许用户写入程序,程序员可以对其内容进行多次改写
  • Flash∶在不加电时仍可长期保存信息且能进行快速擦除重写
  • SSD(Solid State Disk):什么都好,但价格高。一般由Flash芯片组成。

以前我总是分不清这几个,后来发现结合英文全称好记多了。

4.RAM和ROM区别

二、主存储器与CPU的连接

1.主存容量的扩展

芯片数=容量/单片芯片容量

2.存储器与CPU的连接

(1)合理选择存储芯片

通常选用 ROM存放系统程序,选用 RAM组成用户区。

(2)地址线的连接

低位用于地址空间,高位用于片选。片选原理会在下面单独介绍。

(3)数据线的连接

对应数据位数。

(4)读写控制线

两根,一根读,一根写。

3.片选

片选信号的产生分为线选法和译码片选法。

  • 线选法

优点∶不需要地址译码器,线路简单。缺点∶地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费。

  • 译码片选法
    即用一片74LS138作为地址译码器,则A15A14A13=000时选中第一片,A15A14A13=001 时选中第二片,以此类推(即3位二进制编码)。

三、并行技术

1.双端口RAM(空间并行)

当两个端口的地址不相同时,在两个端口上进行读写操作一定不会发生冲突。当对同一个主存操作时,写操作只能互斥进行(不能写写、写读),读操作可以同时进行。

2.多模块存储器(时间并行)

(1)单体多字存储器

存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。即每隔1/m存取周期,CPU向主存取一条指令。显然,这增大了存储器的带宽,提高了单体存储器的工作速度。

(2)多体并行存储器

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

  • 高位交叉编址(顺序)

总是按顺序访问存储模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率。仍是顺序存储器。

  • 低位交叉编址(流水线)

编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。
设模块字长等于数据总线宽度,模块存取一个字的存取周期为T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于m=T/r,以保证启动某模块后经过mxr的时间后再次启动该模块时,其上次的存取操作已经完成(流水线不间断)。

四、高速缓存Cache(采用SRAM)

高速缓冲技术就是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的Cache 中,使CPU的访存操作大多数针对Cache 进行,从而大大提高程序的执行速度。

1.工作原理

  • Cache由SRAM实现。
  • Cache和主存的交换单位是块(又称行,包含多个字节),主存块远多于Cache块;CPU与Cache之间的数据交换以字为单位。
  • Cache保存的仅仅是主存块的副本。
  • 当CPU发出请求时,先在Cache里面找,不必访存;若未命中,去主存中找,并把这页调入Cache中。
  • 如果Cache满了,需要用替换算法替换某页。

2.Cache命中率与平均访问时间

  • 命中率:Nc为Cache命中次数,Nm为主存命中次数

  • 平均访问时间:tc为Cache访问时间,tm为主存访问时间

3.Cache和主存的映射方式

  • 两个重要概念

标记:Cache中块是来自主存的哪一块。
有效位:Cache中块/行中的信息是否有效。

(1)方式一: 直接映射

无条件替换,块冲突概率最高,空间利用率最低。

  • 地址结构:

(2)方式二:全相联映射

优点是比较灵活,Cache 块的冲突概率低,空间利用率高,命中率也高。
缺点是标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。

(3)方式三:组相联映射

  • 组相联映射

4.Cache中主存块的替换算法

### Cache存储器与虚拟存储器的工作原理 #### Cache存储器概述 Cache是一种高速缓存技术,位于CPU和主存之间。为了提高访问速度,主存中的数据被划分为固定大小的块(即主存块),而Cache也被划分成同样大小的块(即Cache块)。当CPU需要从内存中读取或写入数据时,会先检查所需的数据是否已经在Cache中存在[^2]。 如果在Cache中找到了对应的数据,则称为命中;如果没有找到,则会发生一次缺失,这时就需要从主存加载相应的块到Cache中,并可能替换掉某些已有的Cache块。这种机制能够显著减少平均访存时间,因为大多数情况下程序具有局部性特征,使得最近使用的数据更有可能再次被使用。 #### 虚拟存储器概述 虚拟存储器通过引入逻辑地址空间来扩展物理内存容量。段页式虚拟存储器结合了分段和分页两种方式的优点,在支持按段进行共享的同时也能提供较好的内存管理和保护功能。然而,由于每次地址转换都需要经历两次查找过程(首先是段表,其次是页表),这增加了系统的额外开销[^1]。 对于操作系统而言,它负责管理这些复杂的映射关系以及处理页面置换等问题。应用程序员通常不需要关心具体的细节,只需要知道自己的程序可以在更大的地址范围内运行即可。 #### 主要区别 | 特征 | Cache 存储器 | 虚拟存储器 | | -- | --- | | **位置** | CPU 和 RAM 间的小型临时缓冲区 | 系统级抽象层,涉及磁盘交换文件作为辅助存储 | | **目的** | 提升频繁访问数据的速度 | 扩展可用内存总量,允许更大规模的应用执行 | | **透明度** | 对程序员完全透明 | 需要操作系统的配合和支持 | | **硬件/软件依赖** | 完全由硬件实现 | 结合软硬件共同完成 | ### 示例代码展示两者差异 下面是一个简单的Python模拟例子用于说明两者的不同之处: ```python import random class SimpleCache: def __init__(self, size=8): self.cache = {} self.size = size def access(self, address): if address not in self.cache or len(self.cache) >= self.size: print(f"Miss! Loading data from main memory at {address}") # Simulate loading into cache (here we just add it to dict) self.evict_if_full() self.cache[address] = "data" else: print(f"Hit! Data found in cache for {address}") def evict_if_full(self): if len(self.cache) >= self.size: key_to_remove = next(iter(self.cache)) del self.cache[key_to_remove] def virtual_memory_simulation(): addresses = list(range(0, 100)) * 5 # Repeat some addresses multiple times. random.shuffle(addresses) simple_cache = SimpleCache() for addr in addresses[:20]: simple_cache.access(addr) if __name__ == "__main__": virtual_memory_simulation() ``` 此脚本创建了一个简易版的Cache模型`SimpleCache`类,并展示了如何模拟Cache命中的情况。而对于虚拟存储器来说,实际应用中涉及到的操作更为复杂,包括但不限于页面调度算法的选择、异常处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值