zoukankan      html  css  js  c++  java
  • 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中的两个块之一。

  • 相关阅读:
    669 v-on:绑定多个事件,参数传递,修饰符
    668 v-bind:绑定基本属性,绑定class,绑定style,动态绑定属性,绑定一个对象
    667 Vue模板语法:Mustache,基本指令
    666 vue3初体验,调试Vue的源码
    660 文本修饰标签:strong,em,sup,sub,del,ins
    655 webpack的Tree Shaking、Scope Hoisting:usedExports,sideEffects,CSS实现Tree Shaking,PurgeCss
    654 webpack的Terser、CSS的压缩
    653 webpack中使用CDN、shimming,Hash、ContentHash、ChunkHash
    652 webpack代码分离:多入口起点,入口依赖,SplitChunks,动态导入,代码懒加载,optimization.chunkIds、runtimeChunk,Prefetch和Preload
    651 webpack环境分离:区分环境,入口文件解析,配置文件的分离
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3416320.html
Copyright © 2011-2022 走看看