• CPU的cache知识


    cache是指cpu的高速缓存. 在我们程序员看来, 缓存是一个透明部件. 因此, 程序员通常无法直接干预对缓存的操作. 但是, 确实可以根据缓存的特点对程序代码实施特定优化, 从而更好地利用高速缓存.

    高速缓存的置换策略会尽可能地将访问频繁的数据放入cache中, 这是一个动态的过程, 所以cache中的数据不会一直不变. 目前一般的机器的cpu cache可分为一级缓存和二级缓存. 一级缓存更靠近cpu, 速度比二级缓存更快. 二级缓存比一级缓存速度更慢, 容量更大, 主要就是做一级缓存和内存之间数据临时交换的地方用.
    这两者和RAM在空间和效率上的关系如下:
    L1 Cache —> L2 Cache —> RAM
    ————> 容量递增 ————>
    ————> 速度递减 ————>
    —–> CPU访问优先级递减 —–>
     
    在linux系统中, 我们可以使用cat /proc/cpuinfo 来获知机器的cpu和核数.
    而cpu cache的信息, 我们通过dmesg | grep cache来获知.
    例如:
    CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
    CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
    说明我这台机器有两个处理器, 并只有一级缓存, 大小为 64K, 缓存行/快 大小为64 bytes.
     
    由 于不同的处理器之间都具有自己的高速缓存, 所以当两个cpu的cache中都存有数据a, 那么就有可能需要进行同步数据, 而cache之间同步数据的最小单元为cache行大小, 可以把一个cache想象成一张表, 表的每一行都是64bytes(假设), 当cpu被告知cache第一行的第一个byte为脏数据时, cpu会将第一行都进行同步.
    例如以下场景:

    CPU1读取了数据a(假设a小于cache行大小),并存入CPU1的高速缓存.

    CPU2也读取了数据a,并存入CPU2的高速缓存.

    CPU1修改了数据a, a被放回CPU1的高速缓存行. 但是该信息并没有被写入RAM.

    CPU2访问a, 但由于CPU1并未将数据写入RAM, 导致了数据不同步.

    为 了解决这个问题, 芯片设计者制定了一个规则. 当一个CPU修改高速缓存行中的字节时, 计算机中的其它CPU会被通知, 它们的高速缓存将视为无效. 于是, 在上面的情况下, CPU2发现自己的高速缓存中数据已无效, CPU1将立即把自己的数据写回RAM, 然后CPU2重新读取该数据. 这样就完成了一次两个cpu之间cache的同步.

  • 相关阅读:
    JS 利用数组拼接html字符串
    IE浏览器下读取客户端上传的文件大小
    PrintWriter out = response.getWriter() 输出中文乱码问题
    非常有用的Java程序片段
    sql之left join、right join、inner join的区别
    JAVA 数组常用技巧
    java 图片文件格式转换(多页tif转jpg 、jpg转tif)
    SQL Server 字段状态判断语句
    sql server 2008中id如何设为自增
    java基于xml配置的通用excel单表数据导入组件(五、Action处理类)
  • 原文地址:https://www.cnblogs.com/google4y/p/2377325.html
Copyright © 2020-2023  润新知