cpu缓存

java高级-高性能-多线程并发编程--1.1.4 CPU优化的两种方法及二次问题的修复 读写-内存屏障

血红的双手。 提交于 2019-12-02 09:17:56
CPU性能优化之一–缓存cache L1-L3缓存 L1-L3缓存 CPU 缓存一致性协议 CPU 主内存 多级缓存,不断提高容量 L1 Cache (一级缓存)是CPU第一层高速缓存, 分为数据缓存和指令缓存, 一般服务器CPU的L1缓存的容量通常在32-4096kb L2 Cache (二级缓存) 由于L1高速缓存的容量限制, 为了再次提高CPU的运算速度, 在CPU外部放置一高速缓存存储器, 即二级缓存 L3 Cache(三级缓存)现在都是内置的, 而它的实际作用既是, L3缓存的应用可以进一步降低内存延迟, 同时提升大数据量计算时处理器的性能. 具有较大 L3缓存的处理器更有效的文件系统缓存行为及较短消息和处理器队列长度. 一般是多核共享一个L3缓存 CPU在读取数据时, 先在L1中寻找, 再从L2中寻找, 再从L3中寻找, 然后是内存, 最后是外存储器 缓存同步协议 多CPU读取同样的数据进行缓存, 进行不同运算之后, 最终写入主内存以那个CPU为准? 在这种高速缓存回写的场景下, 有一个缓存一致性协议, 多数CPU厂商对它进行了实现. 即MESI协议, 它规定每条缓存有个状态位, 同时定义了下面四种状态: 修改态(Modified) 此cache行已被修改过(脏行), 内容已不同于主内存, 为此cache专有 专有态(Exclusive) 此cache行同于主存,

register

*爱你&永不变心* 提交于 2019-12-02 06:39:52
一般情况下,变量的值是存储在内存中的,CPU 每次使用数据都要从内存中读取。如果有一些变量使用非常频繁,从内存中读取就会消耗很多时间,例如 for 循环中的增量控制: int i; for(i=0; i<1000; i++){ // Some Code } 执行这段代码,CPU 为了获得 i,会读取 1000 次内存。 为了解决这个问题,可以将使用频繁的变量放在CPU的通用寄存器中,这样使用该变量时就不必访问内存,直接从寄存器中读取,大大提高程序的运行效率。 寄存器、缓存、内存 为了加深对 register 变量的理解,这里有必要讲一下CPU寄存器。 按照与CPU的远近来分,离CPU最近的是寄存器,然后是缓存,最后是内存。 寄存器是最贴近CPU的,而且CPU只在寄存器中进行存取。寄存的意思是暂时存放数据,不用每次都从内存中取,它是一个临时的存放数据的空间。 而寄存器的数据又来源于内存,于是 CPU <-- 寄存器 <-- 内存,这就是它们之间的信息交换。 那么为什么还需要缓存呢?因为如果频繁地操作内存中同一地址上的数据会影响速度,于是就在寄存器和内存之间设置一个缓存,把使用频繁的数据暂时保存到缓存,如果寄存器需要读取内存中同一地址上的数据,就不用大老远地再去访问内存,直接从缓存中读取即可。 缓存的速度远高于内存,价格也是如此。 注意:缓存的容量是有限的

寄存器vs缓存vs硬盘

喜欢而已 提交于 2019-12-02 04:43:11
如下配置:一个处理器cpu,六个核。处理器速度为2.2GHz即电流每秒钟可以振荡22亿次。二级缓存256KB,每个核都独自有一个二级缓存;三级缓存9M,是六个核共享的。使用了超线程技术,所以总共有十二个核,即十二个线程 来源: https://www.cnblogs.com/shengulong/p/11730226.html

缓存技术使用的实践思考分析

自作多情 提交于 2019-12-02 03:28:00
按照现在流行的互联网分层架构模型,最简单的架构当属Web响应层+DB存储层的架构。从最开始的单机混合部署Web和DB,到后来将二者拆分到不同物理机以避免共享机器硬件带来的性能瓶颈,再随着流量的增长,Web应用变为集群部署模式,而DB则衍生出主从机来保证高可用,同时便于实现读写分离。这一连串系统架构的升级,本质上是为了追求更高的性能,达到更低的延时。 缘起:为何使用缓存 在应用对外提供服务时,其稳定性受到诸多因素影响,其中比较重要的有CPU、内存、IO(磁盘IO、网络IO)等,这些硬件资源十分宝贵,因此对于那些需要经过复杂计算才能得到结果的,或者需要频繁读取磁盘数据的,最好将结果缓存起来,避免资源的重复消耗。 CPU瓶颈 如果项目中有很多正则表达式计算,或者某个计算结果是多次中间结果合并后才得出的,且CPU的使用率一直居高不下,那么就可以考虑是否应该将这些结果缓存起来,根据特定Key直接获取Value结果,减少中间链路的传递过程,减少CPU的使用率。 IO瓶颈 众所周知,从磁盘获取数据受到磁盘转速、寻道速度、磁盘缓冲区大小等诸多因素影响,这些因素决定了磁盘的IOPS,同时我们也知道对于数据的读写来说,CPU的缓存读写速度> 内存的读写速度>磁盘的读写速度。虽然磁盘内部也配备了缓存以匹配内存的读写速度,但其容量毕竟是有限的,那么当磁盘的IOPS无法进一步提升的时候

CPU缓存和内存屏障

核能气质少年 提交于 2019-12-01 19:30:54
CPU性能优化手段-缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化。 例如:CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能。 多级缓存 L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存的容量通常在32-4096KB。 L2由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置-高速存储器,即二级缓存。 L3现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。一般是多核共享一个L3缓存! CPU在读取数据时,先在L1中寻找,再从L2寻找,再从L3寻找,然后是内存,再后是外存储器。 缓存同步协议 多CPU读取同样的数据进行缓存,进行不同运算之后,最终写入主内存以哪个CPU为准? 在这种高速缓存回写的场景下,有一个缓存一致性协议多数CPU厂商对它进行了实现。 MESI协议 ,它规定每条缓存有个状态位,同时定义了下面四个状态: 修改态(Modified) -此cache行已被修改过(脏行),内容已不同于主存,为此cache专有; 专有态(Exclusive) -此cache行内容同于主存

Java 中的 volatile 关键字

徘徊边缘 提交于 2019-12-01 13:11:43
Java 中 volatile 关键字是一个类型修饰符。JDK 1.5 之后,对其语义进行了增强。 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了共享变量的值,共享变量修改后的值对其他线程立即可见 通过禁止编译器、CPU 指令重排序和部分 happens-before 规则,解决有序性问题 volatile 可见性的实现 在生成汇编代码指令时会在 volatile 修饰的共享变量进行写操作的时候会多出 Lock 前缀的指令 Lock 前缀的指令会引起 CPU 缓存写回内存 一个 CPU 的缓存回写到内存会导致其他 CPU 缓存了该内存地址的数据无效 volatile 变量通过缓存一致性协议保证每个线程获得最新值 缓存一致性协议保证每个 CPU 通过嗅探在总线上传播的数据来检查自己缓存的值是不是修改 当 CPU 发现自己缓存行对应的内存地址被修改,会将当前 CPU 的缓存行设置成无效状态,重新从内存中把数据读到 CPU 缓存 看一下我们之前的一个可见性问题的测试例子 package constxiong.concurrency.a014; /** * 测试可见性问题 * @author ConstXiong */ public class TestVisibility { //是否停止 变量 private static boolean stop = false;

数据中心服务器基础知识大全

旧街凉风 提交于 2019-12-01 11:53:39
服务器对于每个从事it工作的人来说并不陌生,但是服务器所涉及的各种知识细节,并非大家都十分清楚,为了让大家深入了解服务器的关建知识点,我在网络上找到一些资料,合并整理,旨在帮助大家从服务器的架构和分类开始。 按照服务器的体系来分,服务器哦主要分为非x86服务器和x86服务器。 非x86服务器 非x86服务器包括大型机、小型机和UNIX服务器,它们是使用RISC或EPIC,并且主要采用UNIX和其它专用操作系统,RISC处理器主要包括IBM公司的Power和PowerPC处理器,SUN和富士通合作研发的SPARC处理器。EPIC处理器主要是Intel研发的安腾处理器等 x86服务器 x86服务器又称CISC架构服务器,采用intel或其他的兼容x86指令集的处理器芯片和windows操作系统的服务器,服务器按照不同分类方法主要分为如下: 1:CLSC(complex instruction set computer) 复杂指令集计算 2:RIRC( Reduced instruction set computer)精简指令集计算 3:EPIC:Explicitly Parallel Instruction Computing 显式并行指令运算 实际上,服务器的分类没有一个统一的标准,下面从多个纬度来看服务器的分类,可以加深我们对各种服务器的认识。 容量计量单位 是一种容量计量单位

指令重排序和内存屏障

百般思念 提交于 2019-12-01 10:22:23
一、指令重排序   指令重排序分为三种,分别为 编译器优化重排序 、 指令级并行重排序 、 内存系统重排序 。如图所示,后面两种为处理器级别(即为硬件层面)。 编译器优化重排序: 编译器在不改变程序执行结果的情况下,为了提升效率,对指令进行乱序的编译。例如在代码中A操作需要获取其他资源而进入等待的状态,而A操作后面的代码跟其没有依赖关系,如果编译器一直等待A操作完成再往下执行的话效率要慢的多,所以可以先编译后面的代码,这样的乱序可以提升不小的编译速度。 指令级并行重排序: 处理器在不影响程序执行结果的情况下,将多条指令重叠在一起执行,同样也是为了提升效率。 内存系统重排序: 这个跟之前两个不同的是,其为伪重排序,也就是说只是看起来像在乱序执行而已。对于现代的处理器来说,在CPU和主内存之间都具备一个高速缓存,高速缓存的作用主要为减少CPU和主内存的交互(CPU的处理速度要快的多),在CPU进行读操作时,如果缓存没有的话从主内存取,而对于写操作都是先写在缓存中,最后再一次性写入主内存,原因是 减少跟主内存交互时CPU的短暂卡顿 ,从而 提升性能 ,但是延时写入可能会导致一个问题——数据不一致。 // CPU1执行以下操作 a = 1; int i = b; // CPU2执行下面操作 b = 1; int j = a;其执行图如下:     从上面图中我们可以看到,对于CPU来说

web网站的性能优化

旧时模样 提交于 2019-12-01 10:07:19
Web前端性能优化 1、减少http请求 http协议是无状态的应用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http请求都需要启动独立的线程去处理。减少http请求的数目可有效提高访问性能。 减少http的主要手段是合并CSS、合并javascript、合并图片。 2、使用浏览器缓存 对一个网站而言,CSS、javascript、logo、图标,这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次http请求都需要的。如果将这些文件缓存在浏览器中,可以极好的改善性能。通过设置http头中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以自定义。 3、启用压缩 在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量。如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个。文本文件的压缩效率可达到80%以上,因此HTML、CSS、javascript文件启用GZip压缩可达到较好的效果。但是压缩对服务器和浏览器产生一定的压力,在网络带宽良好,而服务器资源不足的情况下要综合考虑。 4、CSS放在页面最上部,javascript放在页面最下面 浏览器会在下载完成全部CSS之后才对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。

Java内存模型

我是研究僧i 提交于 2019-12-01 09:52:42
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。 如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 原始的Java内存模型存在一些不足,因此Java内存模型在Java1.5时被重新修订。这个版本的Java内存模型在Java8中人在使用。 Java内存模型内部原理 Java内存模型把Java虚拟机内部划分为线程栈和堆。这张图演示了Java内存模型的逻辑视图。 每一个运行在Java虚拟机里的线程都拥有自己的线程栈。这个线程栈包含了这个线程调用的方法当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的本地变量对其它线程不可见,仅自己可见。即使两个线程执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建本地变量。因此,每个线程拥有每个本地变量的独有版本。 所有原始类型的本地变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递一个原始类型变量的拷贝,但是它不能共享这个原始类型变量自身。 堆上包含在Java程序中创建的所有对象,无论是哪一个对象创建的。这包括原始类型的对象版本