文档章节

一致性专题之cpu缓存一致性(一)

F
 FAT_mt
发布于 06/25 20:11
字数 1217
阅读 18
收藏 0

只要涉及到缓存的业务场景就一定会出现数据一致性问题。对于该问题,从微观的角度来看cpu与内存之间建立了N级缓存来提高效率,从宏观的角度来看分布式存储使用数据副本机制来提高数据的安全性和访问效率,不同的业务场景解决的技术手段不同,本文主要讨论cpu的缓存一致性问题。由于对cpu内部结构的详细情况不熟,本文只会对核心的概念进行讨论。

通过cpu-z工具就可以看到如下图所示的内容:

        图中显示了cpu有3级缓存,其中一级缓存分为数据缓存和指令缓存其余的只有数据缓存(至于为什么只有一级缓存有指令缓存本人暂不清楚),每级的缓存大小也不同并且数据缓存级别越高空间越小。缓存行大小(即line-size)都是64byte,组关联(即way-set associative)数量也不同。现围绕这些内容进行讨论。

1、cpu在访问内存数据时需将数据先加载到缓存中,然后从缓存中读取,缓存行是内存与缓存进行数据交换的基本单位,在本人电脑中为64字节。

2、当cpu读取数据时如何知道在哪个cache line中呢(注意这里说的数据先当成1个字节算,而不要当作short、int、long等类型,后面会说明这个问题),有以下方法:

    (1)将内存按照cache line 大小即64byte为一个数据块,对于4Gb的内存可以分为个数据块,对于每个cache line而言会额外记录当前访问数据所属数据块的地址(暂时命名为tag字段,长度为26bit)。遍历所有的cache line,然后将数据地址/64并与tag字段进行验证是否相等,如果相等表示当前数据在该cache line 中,再对64取模就能读取需访问的数据。这种方法又叫全关联映射很明显在查找时比较耗时,但是由于cache line只要有空闲就能填满因此空间利用率较高;

    (2)将内存按照缓存大小进行分块,比如按照一级数据缓存大小32kb进行划分,4Gb的内存可以分为个块,然后每个块再按照cache line的大小64byte划分成个缓存行,与全关联不同,该方法中每个内存数据所在的数据块与缓存中的缓存行是一一对应的,不能像全关联一样,当有缓存行冲突的时候只要发现某个缓存行空闲就可以把内存中的数据加载过去,也就是说该方法即使有缓存行空闲着也不能用。与全关联一样每个缓存行需要额外的空间来记录内存地址所属的块号和缓存行的行号,该方法又叫直接映射;

    (3)将缓存分成8份则每份4kb,将内存按照4kb进行分块,4Gb的内存可以分为个块,然后每个块再按照cache line的大小64byte划分成个缓存行,该方法与直接映射法很像只是没按照整个缓存大小进行划分,因此同样会出现缓存行冲突的问题,不同的是当发现第1份中的某个缓存行被占用时,会将数据加载到第2份中同一个缓存行行号中,如果第2份也被占用会依此类推到第3份中。这种方法又叫组关联映射法实际上是前两种方法的整合。该方法也就是目前cpu使用的最广泛的方法。

3、由组关联法可知,当第8份也被占用的时候就需要从1-8份里替换一个cache line了,替换的策略有随机替换法、先进先出替换法、最近最少被使用(简称LRU,通过记录每个cache line访问的时间将长时间没被访问的替换掉,考虑的是时间局部性)、最不经常使用(简称LFU,通过记录每个cache line被访问的次数,将次数最少的替换掉)。

© 著作权归作者所有

F

FAT_mt

粉丝 4
博文 78
码字总数 45804
作品 3
南京
高级程序员
私信 提问
一致性专题之cpu缓存一致性(三)

本篇聊聊熟悉了cpu缓存一致性对编程有什么帮助。 1、数据对齐访问 在一致性专题之cpu缓存一致性(一)中强调过先将要读写的数据当成1个字节。这是因为对于short、int、long、以及小数组而言可...

FAT_mt
06/29
0
0
内存模型是怎么解决缓存一致性的?

前言 在再有人问你Java内存模型是什么,就把这篇文章发给他。这篇文章中,我们介绍过关于Java内容模型的来龙去脉。 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这...

Java架构
2018/08/20
0
0
一致性专题之cpu缓存一致性(二)

在一致性专题之cpu缓存一致性(一)中主要描述了缓存与内存的映射方式,该篇主要描述cache line的状态: 1、状态M表示该缓存行中数据有修改,并且与内存中的数据不一致; 2、状态E表示该缓存...

FAT_mt
06/29
0
0
CAS指令与MESI缓存一致性协议

转: CAS(Compare-And-Swap)指令是并行程序设计最基础的基石,随着越来越多的本本都用上了双核,这个世界已经快速步入并行计算时代,CAS指令发挥的作用也就越来越大。CAS指令,在Intel CPU...

刘小兵2014
2011/10/15
0
0
CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作

CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作 “最轻量级的锁”,通常也叫”原子操作”,之所以加引号是因为他们在汇编级别并不是原子操作,是用多条指令完成的,这些操作大多都是利用...

程序员诗人
2018/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
21
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部