• CPU Cache 学习(一)


    在介绍cache line之前,我们先学习一下cache.

    一. Cache

    1. Overview

    当CPU从main memory中读取或者写入数据时,会先查看一下所要读取的数据副本是否在cache中。

    如果在cache中,则直接从cache读取或者向cache写入数据,这个过程要比从main memory中读取

    或者写入数据快的多。

    现代的个人PC或者Server的CPU至少有三种独立的cache,分别是:Data Cache, Instruction Cache

    和TLB。Data Cache用于加速数据的读取和存储,Instruction Cache用于加速指令的读取,而TLB

    用于加速指令或者数据虚拟地址到物理地址的转换。

    2. Cache Entry

    数据在main memory和cache之间是以固定块传送的,这个固定块的大小称为Cache Line。当cache line

    从main memory拷贝到cache时,cache entry被创建。cache entry包括传送的数据和所请求的memory

    location(现在成为tag)。

    当CPU需要从main memory中特定位置(memory location)读取或者写入数据时,它会首先检查cache中

    相应的cache entry。cache此时会检查所有cache line中(此处应该是所有cache entry)的memory location

    。如果此时所要查找的memory location在cache中,则CPU从cache中读取或者写入数据,这就是我们常

    说的Cacae Hit;如果所要查找的memory location不在cache中,则cache会分配新的cache entry,并且

    将数据从main memory拷贝到cache entry中,这就是我们常说的Cache Miss

    3.Cache Entry Structure

    cache entry通常的结构如下所示:

    Data Block(Cache Line)里面存放着从main memory中取出的数据,Tag保存着从main memory中取出数据

    的地址的一部分。

    Cache的大小(Size)可以如下计算得出,即Data Block中存放字节的数量和Cache中Data Block数量的乘积。

    尽管Tag和Flag占有一部分的空间,但是我们在计算cache大小的时候并没有考虑。

    一个有效的物理内存地址(Memory Address)被分为如下三个部分:

    Tag            Index                         Block Offset

    Index表示数据存在在哪一个cache line中,而Block Offset表示数据在cache line中的偏移量。

    因此Tag的长度是Memory_Address_len - Index_len - Block_Offset_len。

    例如:Pentium 4有一个4-way set associative L1 data cache, 该cache的大小为8KB,cache block(cache line)

    的大小为64Bytes,因此cache block的数量为:8 * 1024 / 64 = 128块,因为是4-way,所以each way包含的块

    的数量是128 / 4 = 32块,所以index的位数为5 bits (2^5 = 32),而block offset的位数为7 bits (2^7 = 128),最后

    得出的Tag的位数为 32 - 5 - 7  = 20。

     Flag Bits

    指令cache每个cache entry仅仅需要一个flag bit:a valid bit,用来指示该entry是否加载了有效的数据。

    数据cache每个cache entry需要两个flag bit:a valid bit and a dirty bit。Dirty Bit用来说明读进cache的数据是否

    发生过改变。

    4. Associativity

    Cache块的替换策略有如下几种:Fully Accociative,Direct Mapped,N-way Set Associative。

    Fully Associative:内存中的数据可以存放在cache中的任意一个cache entry中。

    Direct Mapped:内存中的数据仅仅可以存放在cache中的指定块。

    N-way Set Associative:内存中的数据可以存放在cache中N个cache entry之一。

    例如:上如所示为AMD Athlon的2-way Set Associative,内存中的任意entry可以映射到cache

    中特定level中的两个块之一。

  • 相关阅读:
    多态与多态性,鸭子类型
    类的继承与派生,抽象类
    常用模块
    模块与包
    三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
    函数装饰器
    函数基础
    文件处理
    数据类型
    Spring源码分析--IOC流程
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3416320.html
Copyright © 2020-2023  润新知