Cache Line操作和Cache相关概念介绍

本文介绍了计算机存储体系的层次结构,重点讲解了缓存Cache的作用和工作原理,包括Cache的概述、Cache行大小、Cache一致性操作、写策略等。通过对Cache的深入理解,读者可以更好地掌握CPU与内存之间的交互,提高系统性能。

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

1.计算机存储体系简介  

 

 存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小。寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2等缓存),再次是主存(普通内存),再次是本地磁盘。

 

寄存器的速度最快,可以在一个时钟周期内访问,其次是高速缓存,可以在几个时钟周期内访问,普通内存可以在几十个或几百个时钟周期内访问。

 

存储器分级,利用的是局部性原理。我们可以以经典的阅读书籍为例。我在读的书,捧在手里(寄存器),我最近频繁阅读的书,放在书桌上(缓存),随时取来读。当然书桌上只能放有限几本书。我更多的书在书架上(内存)。如果书架上没有的书,就去图书馆(磁盘)。我要读的书如果手里没有,那么去书桌上找,如果书桌上没有,去书架上找,如果书架上没有去图书馆去找。可以对应寄存器没有,则从缓存中取,缓存中没有,则从内存中取到缓存,如果内存中没有,则先从磁盘读入内存,再读入缓存,再读入寄存器。

2.计算机缓存

Cache本系列的文章重点介绍缓存cache。了解如何获取cache的参数,了解缓存的组织结构。

2.1 Cache 概述    

cache,中译名高速缓冲存储器,其作用是为了更好的利用局部性原理,减少CPU访问主存的次数。简单地说,CPU正在访问的指令和数据,其可能会被以后多次访问到,或者是该指令和数据附近的内存区域,也可能会被多次访问。因此,第一次访问这一块区域时,将其复制到cache中,以后访问该区域的指令或者数据时,就不用再从主存中取出。

 

 

    cache分成多个组,每个组分成多个行,linesize是cache的基本单位,从主存向cache迁移数据都是按照linesize为单位替换的。比如linesize为32Byte,那么迁移必须一次迁移32Byte到cache。 这个linesize比较容易理解,想想我们前面书的例子,我们从书架往书桌搬书必须以书为单位,肯定不能把书撕了以页为单位。书就是linesize。当然了现实生活中每本书页数不同,但是同个cache的linesize总是相同的。

    所谓8路组相连( 8-way set associative)的含义是指,每个组里面有8个行。


我们知道,cache的容量要远远小于主存,主存和cache肯定不是一一对应的,那么主存中的地址和cache的映射关系是怎样的呢?
    拿到一个地址,首先是映射到一个组里面去。如何映射?取内存地址的中间几位来映射。
    举例来说,data cache: 32-KB, 8-way set associative, 64-byte line size
    Cache总大小为32KB,8路组相连(每组有8个line),每个line的大小linesize为64Byte,OK,我们可以很轻易的算出一共有32K/8/64=64 个组。
    对于32位的内存地址,每个line有2^6 = 64Byte,所以地址的【0,5】区分line中的那个字节。一共有64个组。我们取内存地址中间6为来hash查找地址属于那个组。即内存地址的【6,11】位来确定属于64组的哪一个组。组确定了之后,【12,31】的内存地址与组中8个line挨个比对,如果【12,31】为与某个line一致,并且这个line为有效,那么缓存命中。
    OK,cache分成三类,
    1 直接映射高速缓存,这个简单,即每个组只有一个line,选中组之后不需要和组中的每个line比对,因为只有一个line。
    2 组相联高速缓存,这个就是我们前面介绍的cache。 S个组,每个组E个line。
  3 全相联高速缓存,这个简单,只有一个组,就是全相联。不用hash来确定组,直接挨个比对高位地址,来确定是否命中。可以想见这种方式不适合大的缓存。想想看,如果4M 的大缓存 linesize为32Byte,采用全相联的话,就意味着4*1024*1024/32 = 128K 个line挨个比较,来确定是否命中,这是多要命的事情。高速缓存立马成了低速缓存了。

 

   描述一个cache需要以下参数 :
    1 cache分级,L1 cache, L2 cache, L3 cache,级别越低,离cpu越近
    2  cache的容量
    3  cache的linesize
    4  cache 每组的行个数.
2.2 Cache 结构

    假设内存容量为M,内存地址为m位:那么寻址范围为000…00~FFF…F(m位)

    倘若把内存地址分为以下三个区间:

 

 

tag, set index, block offset三个区间有什么用呢?再来看看Cache的逻辑结构:

 

 

将此图与上图做对比,可以得出各参数如下:

B = 2^b

S = 2^s

现在来解释一下各个参数的意义:

一个cache被分为S个组,每个组有E个cacheline,而一个cacheline中,有B个存储单元,现代处理器中,这个存储单元一般是以字节(通常8个位)为单位的,也是最小的寻址单元。因此,在一个内存地址中,中间的s位决定了该单元被映射到哪一组,而最低的b位决定了该单元在cacheline中的偏移量。valid通常是一位,代表该cacheline是否是有效的(当该cacheline不存在内存映射时,

### 替换最近使用的缓存行策略 在计算机体系结构中,缓存替换策略决定了当新数据需要存储到已满的缓存中时应该移除哪一行。常见的几种缓存替换策略包括: #### 1. 随机替换 (Random Replacement) 随机选择一条缓存行进行替换。这种方法简单易实现,但由于缺乏预测性优化机制,在性能上通常不是最优的选择。 #### 2. 先进先出 (FIFO, First In First Out) 按照时间顺序记录每条进入缓存的数据项,并总是淘汰最早加入的那一项。尽管易于理解,但对于工作负载模式变化较大的情况表现不佳[^1]。 #### 3. 最近最少使用 (LRU, Least Recently Used) 跟踪各缓存行最后一次被访问的时间戳或位置,优先淘汰最久未使用的那一行。此方法能较好地适应多种应用场景下的局部性原理,因此应用广泛。为了高效管理 LRU 列表,可以采用位图或其他紧凑的数据结构来表示相对次序关系。 ```c++ struct CacheLine { int tag; bool valid; // 是否有效标志 unsigned long timestamp; // 时间戳用于模拟LRU行为 }; class LRUCache { private: std::unordered_map<int, CacheLine*> cacheMap; list<CacheLine> lruList; public: void access(int address) { auto it = cacheMap.find(address); if (it != cacheMap.end()) { // 命中 move_to_front(it->second); // 将其移到队列头部 } else { // 缺失 evict(); // 如果满了则驱逐最后面的一个元素 insert_new_line(address); // 插入新的缓存行至前端 } } void move_to_front(CacheLine* line){ lruList.splice(lruList.begin(), lruList, find(lruList.begin(),lruList.end(),line)); } void evict(){ if(cacheMap.size() >= MAX_SIZE){ CacheLine *last = &lruList.back(); cacheMap.erase(last->tag); lruList.pop_back(); } } void insert_new_line(int addr){ CacheLine newEntry{addr,true,time(NULL)}; lruList.push_front(newEntry); cacheMap[addr]=&lruList.front(); } }; ``` 对于使用了 Virtual Cache 的微架构而言,虽然 Bin-Index 算法仍然可能适用于某些场景,但主要是在更高级别的缓存(如 L2 或以上)而非追求极低命中延迟的一级缓存中找到更多应用实例。而针对具体某一层级内的 “最近使用过的” 行执行替换操作,则往往依赖上述提到的一种或组合形式的具体政策来进行决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值