-
缓存行对齐
2021-02-27 19:47:59目录什么是缓存行对齐验证CPU的缓存行对齐现象原因分析 什么是缓存行对齐 高速缓存控制器是针对数据块,而不是字节进行操作的。从程序设计的角度讲,高速缓存其实就是一组称之为缓存行(cache line)的固定大小的数据...什么是缓存行对齐
高速缓存控制器是针对数据块,而不是字节进行操作的。从程序设计的角度讲,高速缓存其实就是一组称之为缓存行(cache line)的固定大小的数据块,其大小是以突发读或者突发写周期的大小
为基础的。缓存基本上来说就是把后面的数据加载到离CPU自己进的地方,对于CPU来说,它是不会一个字节一个字节的加载的,因为这非常没有效率,一般来说都是要一块一块的加载的,在CPU的缓存技术中,这个术语叫“CacheLine”(有的中文编译成“缓存行”),一般来说,一个主流的CPU的CacheLine是64Bytes(也有的CPU用32Bytes和128Bytes),也就是16个32位的整型。也就是说,CPU从内存中捞数据上来的最小数据单位。
关于缓存行介绍详细可见:http://www.elecfans.com/d/1196867.html
验证CPU的缓存行对齐现象
由于一个缓存行是64字节,所以我们设计如下代码:
public class CacheLineTest { private static class TClass { private volatile long data = 0; private volatile long a, b, c, d, e, f, g; // 测试此行加与不加时运行速度对比 } private static volatile TClass[] tClasses = new TClass[2]; static { tClasses[0] = new TClass(); tClasses[1] = new TClass(); } public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> { for (long i = 0; i < 1000_0000L; i++) { tClasses[0].data = i; } }); Thread thread2 = new Thread(() -> { for (long i = 0; i < 1000_0000L; i++) { tClasses[1].data = i; } }); final long start = System.nanoTime(); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println((System.nanoTime() - start) / 100_1000); } }
当上面代码内部类TClass不加上标记的那一行成员变量时,运行速度如下:
当加上时,运行速度如下:
原因分析
由于缓存行是64字节,而一个long类型为8字节,当不加那一行代码时,计算的总的字节数为8+8=16字节,所以这两个变量在一个缓存行中。
于是这个缓存行中就有数据1和数据2。
当两个线程分别执行时,由于加了volatile关键字,线程1改变了缓存行中的数据1,需要去通知线程2去更新缓存行中的数据1(即使数据1线程2不需要用到),因此就降低了CPU的执行速度。
但是上面代码如果加上
private volatile long a, b, c, d, e, f, g;
这时每个TClass有8个long类型的成员变量,即8 * 8 = 64个字节,每个TClass都单独在一个缓存行中。
因此两个线程分别执行时都不需要通知对方,CPU执行速度就会增加。 -
Linux C 验证行缓存的大小
2020-08-10 09:06:18#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, const char *argv[]) { ...i++)#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, const char *argv[]) { char buff[] = "this is a demo test"; int i = 0; for(i=0;i<53;i++) { printf("%s", buff); } printf("1234567890"); printf("1234567890"); while(1); return 0; }
测试结果
结论
Linux下行缓冲大小为1K。
-
Java多线程验证CPU缓存一致性
2020-08-21 00:14:46Java多线程验证CPU缓存一致性CPU缓存CPU缓存层级缓存行缓存一致性Java多线程验证 CPU缓存 cpu运算速度大于内存读写速度,导致cpu花费大量的时间等待从内存读取数据和写入数据。缓存的交换速度比内存快很多,它的出现...CPU缓存
cpu运算速度大于内存读写速度,导致cpu花费大量的时间等待从内存读取数据和写入数据。缓存的交换速度比内存快很多,它的出现缓解了这个矛盾。
CPU缓存层级
双核CPU,每个CPU有独立的缓存L1、L2,有共享的缓存L3。在缓存中没有的情况下才会去内存中读取数据。
缓存行
cpu的缓存为了性能一般是以缓存行Cache Line为单位,一次性缓存一块区域的数据。 目前最常用的Cache Line大小为64字节。
缓存一致性
对于缓存行A,如果Cpu1对其中数据a进行修改,Cpu2缓存的数据块会失效,需要重新去内存中读取一次。 缓存一致性协议:https://www.cnblogs.com/z00377750/p/9180644.html
Java多线程验证
同一个缓存行,多线程用时429ms
用数组模拟出多个缓存行的情况,用时246msJDK8,可以采用@Contended注解。可以不受cpu缓存行字节数的限制,可以将属性作为独立的缓存行。需要加上:JVM -XX:-RestrictContended
有待验证 -
Java - 【缓存行】CacheLine
2020-10-13 20:08:59缓存行(Cache Line) CPU三级缓存 ...x86架构64位CPU,内存缓存行大小64B(Talk is cheap, show me the code),如何在使用Java程序进行验证? 复习:CountDownLatch与Semaphore import java.util.concur缓存行(Cache Line)
CPU三级缓存
CPU直接操作内部寄存器中的数据速度比直接操作内存中的数据快百倍,为了减少这种差距,出现了缓存(Cache),现在缓存一般被封装进入CPU,分为三级缓存
L1(1ns)
L2(3ns)
L3(15ns)
x86架构64位CPU,内存缓存行大小64B(
Talk is cheap, show me the code
),如何在使用Java程序进行验证?import java.util.concurrent.CountDownLatch; /** * 64位x86CPU,缓存行大小64B * * 测试一:23756 ms * 测试二:5688 ms * 性能提高4倍 */ public class CacheLineTest1 { private static final int NUM = 1_000_000_000; private static class T{ // private long t1,t2,t3,t4,t5,t6,t7; private volatile long l = 0L; // private long tt1,tt2,tt3,tt4,tt5,tt6,tt7; } public static T[] ts = new T[2]; static { ts[0] = new T(); ts[1] = new T(); } public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(2); long satrtTime = System.currentTimeMillis(); Thread th1 = new Thread("thread-1"){ @Override public void run() { for(int i=0;i<NUM;i++){ ts[0].l = i; } latch.countDown(); } }; Thread th2 = new Thread("thread-2"){ @Override public void run() { for(int i=0;i<NUM;i++){ ts[1].l = i; } latch.countDown(); } }; th1.start(); th2.start(); latch.await(); long endTime = System.currentTimeMillis(); System.out.println(endTime-satrtTime); } }
-
解释
-
如果两个线程从内存中读取的数据处于同一个缓存行,那么一旦线程A修改了该缓存行中的一个变量,那么此时其他线程中使用当前变量的缓存行将会被标记为“Invalid(失效)”状态,指示线程需要再去内存中读取一遍数据;
-
这种协议被称为“针对缓存行CacheLine的协议”,不同硬件有该协议的不同的落地实现方式,其中一种实现是“MESI(Modify+Eclusive+Shared+Inviled)方式”,通过给缓存行添加标记的方式从硬件层面确保数据的一致性。
-
-
缓存击穿 穿透 雪崩_缓存穿透、缓存雪崩和缓存击穿是什么?
2020-11-26 16:26:58前言对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为故意... -
缓存穿透、缓存雪崩和缓存击穿是什么?
2020-11-13 09:45:06对于缓存穿透、缓存雪崩和缓存击穿... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大.. -
缓存击穿 穿透 雪崩_面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
2020-11-26 16:26:59前言原创公众号:bigsai对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也就是...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以... -
Redis——缓存穿透、缓存雪崩和缓存击穿是什么?
2020-11-16 13:35:53对于缓存穿透、缓存雪崩...当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型hashmap)先过滤 -
缓存穿透、缓存雪崩和缓存击穿是什么?(转)
2020-11-13 10:43:02对于缓存穿透、缓存雪崩和缓存... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型has -
mac被限制什么意思_面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
2021-01-06 11:09:56前言原创公众号:bigsai对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也就是...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以... -
HTTP 控制缓存
2018-03-14 19:07:20一、HTTP请求和响应结构简图1. 请求一般分为三部分:请求行、请求头和请求体,但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。...二、再验证和新鲜度检测web缓存可以自动保存常见文档副本,当web请求... -
面试官:谈谈Redis缓存和MySQL数据一致性问题
2020-11-10 12:24:11前言 原创公众号:bigsai 对于缓存穿透、缓存雪崩和缓存击穿...当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等 -
缓存壳问题
2020-12-31 02:10:46则验证了 keyValues.Length % 2 != 0 然后 报错: <code>throw new Exception("keyValues 参数是键值对,不应该出现奇数(数量),请检查使用姿势。"); 是否应该在 583 行前,对 ... -
温故知新-多线程-Cache Line存在验证
2020-06-02 17:16:49文章目录简述缓存行Cache Line验证CacehLine存在?参考你的鼓励也是我创作的动力 Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简述 本地... -
今天遇到了二级缓存的脏读现象
2018-05-09 22:51:44之前给项目弄了个MD5加密 为了省事 把原数据库某密码直接在mysql workbench改成了MD5加密后数值 但是因为改之前 我启用了redis做mybatis二级缓存 这一行数据我刚好在修改数据库中密码前查询过 错误的数据被保存在了... -
面试中经常出现的缓存穿透、雪崩和击穿到底是什么?
2020-11-10 10:56:59对于缓存穿透、缓存雪崩和缓存... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型ha -
mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?
2021-02-07 12:56:19对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣redis缓存穿透理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为... -
C# Panel 双缓存;图片闪烁处理方式,视频闪烁处理方式
2020-09-28 09:38:38保证每行代码都经过验证! 如有疑惑,欢迎留言,看见即回;祝好__by Dxg_LC Panel 双缓存 当做项目的时候,会遇见图像延迟,残影这类情况[类似没有装显卡驱动],可能就需要考虑是需要增加双缓存了; //Panel 自身并... -
mac被限制什么意思_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?
2021-01-06 11:09:58对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣redis缓存穿透理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为... -
vue单页面多路由缓存问题,解决多路由前进刷新,后退不刷新问题
2018-08-30 10:02:45同一组件被多次复用,有时需要缓存页面数据有时不需要缓存页面数据,最初想到的方法是利用 keep-alive 来进行页面缓存,经过一番验证发现单纯的用keep-alive是行不通的,原因如下 keep-alive 会对已加载过的路由... -
mysql 缓存架构_MySQL之五----存储引擎、服务器配置、查询缓存、索引及事务及隔离级别...
2021-01-19 18:09:11它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。第二层值得关注。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,... -
DD38美图之家伪静态缓存开源版 v1.3.1.rar
2019-07-05 07:14:36申请加群后请等待,24小时内就会批复的,禁止多加,发现多加,全部拒绝,加群验证信息:飞翔网络 ·最后提醒一下:用本程序刷流量是很危险的,目前版本已经开源,如果刷流量过度,将提前终结该程序寿命。 程序自带... -
强制刷新浏览器调用的js和css以及js清除浏览器缓存的几种方法
2016-12-15 15:44:51今天遇到一个js缓存的问题,就是有一个公用的js里面添加了方法,但是在浏览器页面调用的时候怎么整都说取不到新加的方法,都是老的js文件,搞了浏览器自带的清除和电脑优化软件的清空都不得行,后来还是小组里面的... -
【网络安全】CSRF同样能携带缓存中的Token,那怎么实现的防CSRF
2021-03-15 23:25:13②:token存在哪儿都行,localstorage或者cookie。 ③:token和cookie举例,token就是说你告诉我你是谁就可以。 cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是... -
OBM无盘1.2本地验证
2011-07-01 13:42:06OBM无盘1.2本地验证 2011年6月28日OBM1.2加强版正式发布,本次版本更新: 1.添加动态回写功能. 2.添加交叉回写手动设置按钮. 3.添加关机删除回写文件功能. 4.增加1366*768这个分辨率. 5.修正Win7下上传器修改,... -
按单词(word)反转字符串(string)输出(output)——不用额外缓存(without a buffer)
2014-05-17 22:24:48是英文题,原题是不用buffer(缓存)反转字符串打印输出,受OJ的毒害,我就认为只要逆序打印就行了(要是把原字符串改了,我还真不知道怎么办到,尤其听说字符串常量不能被更改,在文章尾部会做验证)。 版本一: ... -
秒杀项目系列之七: 交易性能优化技术之缓存库存(库存放在redis+使用rocketmq异步写入数据库)
2021-02-01 20:11:49下单请求压测 创建测试计划 线程属性: 线程数200, ...库存行锁(修改库存时对item_id值所在行加行锁) <!-- 库存扣减操作--> <update id="decreaseStock"> update item_stock set stock = stock - .