cache存储器

为什么要引入cache?
cache是一种高速缓冲存储器,为了解决CPU与主存之间速度不匹配的问题而提出。

03e9ef336a4b4347be1e52a88e002303.png

 

当前,随着半导体器件的集成度的进一步提高,cache的速度有接近CPU,所以可将小容量的cache放入CPU中,从而组成了二级以上的cache系统。


cache的原理
基于程序运行中具有的空间局部性和时间局部性特征。

CPU与cache直间的数据交换是以字为单位,
cache与主存之间的数据交换是以块为单位.

165199f7cbfa4e1883649d9d22d43ee4.png

 cache的命中率计算

8d5752bd045847b991ffa661a2794af0.png

3e00faedc7c346e8b58bae2906d3e982.png 

f54bfe9b553649789fce693177846f96.png 

 为提高访问效率,命中率h越接近1越好。r值以5~10为宜,不宜太大。

主存与cache的地址映射

1787787ee71e438ba0dcf79cc2bd5893.png

 

cache的替换策略
cache的工作原理要求它尽量保存最新数据。当一个新的主存块需要拷贝到cache,而允许存放此块的行位置被其他主存块占满时,就要替换。

硬件实现的常用算法主要有
1、最不经常使用(LFU)算法

LFU算法认为应将一段时间内被访问次数最少的那行数据替换

2、近期最少使用(LRU)算法
LRU算法将近期内长久未被访问过的行换出

3、随机替换
实际上不能称为算法,只需从特定的行位置中随机地选取一行换出即可

cache的写操作策略
由于cache的内容只是主存部分内容的副本,它应当与主存内容保持一致。而CPU对cache的写入更改了cache的内容。

问题:如何与主存内容保持一致

三种写操作
1、写回法

当CPU写cache命中时,只修改cache的内容,而不立即写入主存,只有该行被替换才写入主存

2、全写法
当CPU写cache命中时,修改cache与主存的内容

3、写一次法
基于写回法并结合全写法的写策略:写命中与写未命中的处理方法和写回法基本相同,只是第一次写命中时要同时写入主存

### 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、付费专栏及课程。

余额充值