精华内容
下载资源
问答
  • 缓存行对齐

    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执行速度就会增加。

    展开全文
  • #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缓存一致性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

    在这里插入图片描述
    用数组模拟出多个缓存行的情况,用时246ms

    在这里插入图片描述

    JDK8,可以采用@Contended注解。可以不受cpu缓存行字节数的限制,可以将属性作为独立的缓存行。需要加上:JVM -XX:-RestrictContended
    有待验证

    展开全文
  • 缓存行(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)方式”,通过给缓存行添加标记的方式从硬件层面确保数据的一致性。

    展开全文
  • 前言对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为故意...
  • 对于缓存穿透、缓存雪崩和缓存击穿... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大..
  • 前言原创公众号:bigsai对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也就是...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以...
  • 对于缓存穿透、缓存雪崩...当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型hashmap)先过滤
  • 对于缓存穿透、缓存雪崩和缓存... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型has
  • 前言原创公众号:bigsai对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?redis缓存穿透理解重在穿透吧,也就是...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以...
  • HTTP 控制缓存

    千次阅读 2018-03-14 19:07:20
    一、HTTP请求和响应结构简图1. 请求一般分为三部分:请求、请求头和请求体,但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。...二、再验证和新鲜度检测web缓存可以自动保存常见文档副本,当web请求...
  • 前言 原创公众号:bigsai 对于缓存穿透、缓存雪崩和缓存击穿...当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等
  • 缓存壳问题

    2020-12-31 02:10:46
    验证了 keyValues.Length % 2 != 0 然后 报错: <code>throw new Exception("keyValues 参数是键值对,不应该出现奇数(数量),请检查使用姿势。"); 是否应该在 583 行前,对 ...
  • 文章目录简述缓存行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二级缓存 这一数据我刚好在修改数据库中密码前查询过 错误的数据被保存在了...
  • 对于缓存穿透、缓存雪崩和缓存... 当然,也可以根据明显错误的key在逻辑层就就行验证。 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。 其他等等,比如用布隆过滤器(超大型ha
  • 对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣​​redis缓存穿透​理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为...
  • 保证每代码都经过验证! 如有疑惑,欢迎留言,看见即回;祝好__by Dxg_LC Panel 双缓存 当做项目的时候,会遇见图像延迟,残影这类情况[类似没有装显卡驱动],可能就需要考虑是需要增加双缓存了; //Panel 自身并...
  • 对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣​​redis缓存穿透​理解重在穿透吧,也...当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为...
  • 同一组件被多次复用,有时需要缓存页面数据有时不需要缓存页面数据,最初想到的方法是利用 keep-alive 来进行页面缓存,经过一番验证发现单纯的用keep-alive是不通的,原因如下 keep-alive 会对已加载过的路由...
  • 它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。第二层值得关注。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,...
  • 申请加群后请等待,24小时内就会批复的,禁止多加,发现多加,全部拒绝,加群验证信息:飞翔网络 ·最后提醒一下:用本程序刷流量是很危险的,目前版本已经开源,如果刷流量过度,将提前终结该程序寿命。 程序自带...
  • 今天遇到一个js缓存的问题,就是有一个公用的js里面添加了方法,但是在浏览器页面调用的时候怎么整都说取不到新加的方法,都是老的js文件,搞了浏览器自带的清除和电脑优化软件的清空都不得,后来还是小组里面的...
  • ②:token存在哪儿都,localstorage或者cookie。 ③:token和cookie举例,token就是说你告诉我你是谁就可以。 cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是...
  • OBM无盘1.2本地验证

    2011-07-01 13:42:06
    OBM无盘1.2本地验证 2011年6月28日OBM1.2加强版正式发布,本次版本更新: 1.添加动态回写功能. 2.添加交叉回写手动设置按钮. 3.添加关机删除回写文件功能. 4.增加1366*768这个分辨率. 5.修正Win7下上传器修改,...
  • 是英文题,原题是不用buffer(缓存)反转字符串打印输出,受OJ的毒害,我就认为只要逆序打印就了(要是把原字符串改了,我还真不知道怎么办到,尤其听说字符串常量不能被更改,在文章尾部会做验证)。 版本一: ...
  • 下单请求压测 创建测试计划 线程属性: 线程数200, ...库存行锁(修改库存时对item_id值所在加行锁) <!-- 库存扣减操作--> <update id="decreaseStock"> update item_stock set stock = stock - .

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386
精华内容 154
关键字:

验证缓存行