相联存储器的工作原理(按内容访存,cache、快表中应用)

本文解释了按内容访存的概念及其实现原理,通过硬件实现并行比较,提高查找效率。介绍了cache和快表作为相联存储器的应用,并详细解析了其工作流程。

以前一直看不太懂什么叫按内容访存,为什么按内容访存会更快,后来去看了下相关视频,明白了其中的原理。它是直接用硬件实现,因此可以并行比较,达到很高的速度

cache、快表就是一种相联存储器,运用他们可以达到更高的查找效率

结合下方图像,原理/过程如下:

①我们要找寻的信息(即要找的主存地址)放置在检索寄存器中, 通过屏蔽寄存器得到key

    屏蔽寄存器原理:如图片右上方,假如我们要比较的只是画三角形的3bit,则屏蔽寄存器中将该3位设为1,其余为0,这样通过屏蔽寄存器后就只会得到我们所需要的3位,作为我们的key。

    图中,由01010010,知第1、3、6位是我们标记的位。则原数据11001110通过后只取该三位,得到key=101

②读选择电路的m代表了cache行,如图中即有m行cache,将m行与key在多路并发比较线路中比较,比较结果存储在符合寄存器中。

    符合寄存器内容:如果key值完全相同,则相应位为1。

③符合寄存器中为1的单元位置传入读选择电路=选中匹配成功的存储单元/一行

④将选中存储单元的data信息传入到代码寄存器,得到我们要的内容

(图片来源b站视频https://www.bilibili.com/video/BV14i4y187cK?from=search&seid=13416260846090671928

### 全相联Cache实验经验分享 全相联Cache是一种特殊的Cache映射方式,其特点是主存中的任何一个块都可以被放置到Cache中的任意一个位置。这种设计提高了Cache的利用率,但同时也增加了硬件复杂性[^3]。 在实验过程中,许多学生发现全相联Cache的设计和实现相对复杂。尤其是在理解Cache与RAM之间的关系时,初学者可能会遇到逻辑上的困难。例如,在搭建Cache与RAM的复合系统时,需要考虑读写操作以及如何处理不同的访问情况(命中、未命中、替换策略等)。解决这些问题的关键在于回归Cache的基本功能,明确其作为高速缓存的作用,并逐步将各个模块连接起来[^2]。 ### 实验总结 通过全相联Cache实验,可以更深入地理解以下几点: 1. **Cache容量的影响**:较大的Cache容量通常可以降低不命中率,但也可能导致更高的成本和更长的访问时间。实验中可以通过调整Cache大小来观察其对性能的影响。 2. **替换策略的重要性**:由于全相联Cache允许主存块放入任何可用的Cache块中,因此必须选择合适的替换算法(如LRU或随机法)来决定哪些块应该被淘汰。实验明,LRU算法虽然效率较高,但在硬件实现上较为复杂;而随机法则相对简单,但可能不如LRU有效[^1]。 3. **地址比较机制**:全相联Cache需要将主存地址的标记与所有Cache块的标记进行比较,这导致了比较器的数量增加,从而影响了整体性能。实验中可以通过分析不同地址映射方式下的比较次数来验证这一点[^3]。 ### 常见问题 1. **Cache未命中率过高**:这可能是由于Cache容量不足或者替换策略不合适造成的。可以通过增加Cache容量或优化替换算法来改善。 2. **地址比较错误**:在实现全相联Cache时,如果地址比较逻辑设计不当,可能会导致主存块无法正确匹配到Cache块。检查比较器的逻辑是否正确是解决此问题的关键。 3. **数据一致性问题**:当Cache和主存之间存在多个副本时,需要确保数据的一致性。实验中可以采用写回(Write-Back)或直写(Write-Through)策略来管理数据更新[^4]。 4. **替换策略实现复杂**:尤其是对于LRU算法,其实现需要额外的状态跟踪机制。为了简化实验,可以选择使用近似LRU的方法或直接采用随机替换。 ### 示例代码:全相联Cache的模拟 以下是一个简单的全相联Cache模拟程序,展示了基本的Cache操作,包括插入、查找和替换。 ```python class FullyAssociativeCache: def __init__(self, capacity): self.capacity = capacity # Cache的最大容量 self.cache = {} # 使用字典模拟Cache self.lru_order = [] # 记录最近使用的顺序 def get(self, key): if key in self.cache: # 更新LRU顺序 self.lru_order.remove(key) self.lru_order.append(key) return self.cache[key] else: return -1 # 示未命中 def put(self, key, value): if key in self.cache: # 如果键已存在,先删除旧的位置 self.lru_order.remove(key) elif len(self.cache) >= self.capacity: # 如果Cache已满,移除最久未使用的项 lru_key = self.lru_order.pop(0) del self.cache[lru_key] # 插入新项 self.cache[key] = value self.lru_order.append(key) # 测试全相联Cache cache = FullyAssociativeCache(3) cache.put('A', 1) cache.put('B', 2) cache.put('C', 3) print(cache.get('A')) # 输出1 cache.put('D', 4) # 此时Cache已满,移除'B' print(cache.get('B')) # 输出-1(未命中) ``` ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值