cpu缓存

CPU缓存和内存屏障

牧云@^-^@ 提交于 2019-12-26 14:40:49
目录 目的 CPU性能优化手段-缓存 多级缓存说明 缓存同步协议 cpu性能优化手段-运行时指令重排 存在的问题 内存屏障 目的 主要是了解CPU在程序性能优化上所做的努力。 CPU性能优化手段-缓存 目的:减少程序运行的时间开销,从而提高性能。 多级缓存说明 多级缓存的概念 缓存同步协议 最终写入主内存以哪个CPU为准? cpu性能优化手段-运行时指令重排 目的:将执行快的代码优先执行,以不改变程序运行的结果为前提。 存在的问题 内存屏障 来源: CSDN 作者: 阿莫西邻 链接: https://blog.csdn.net/xiaofbing/article/details/103713313

数据库缓存

自古美人都是妖i 提交于 2019-12-23 13:10:58
1.What a) mysql 等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对 mysql 产生的增删改查操作造成巨大的 I/O 开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。 b) 极大地解决数据库服务器的压力 c) 提高应用数据的响应速度 d) 常见的缓存形式:内存缓存(可避免 I/O 开销)、文件缓存 2.Why a) 缓存数据是为了让客户端减少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度地降低对数据库服务器的访问压力。 b) 默认不使用缓存时的情况:用户请求 - 》数据查询 - 》连接数据库服务器并查询数据 - 》将数据缓存起来( HTML 、内存、 JSON 、序列化数据) - 》显示给客户端 c) 用户再次请求或者新用户访问 - 》数据查询 - 》直接从缓存中获取数据 - 》显示给客户端 注意:缓存需要考虑的内容(缓存方式的选择、缓存场景的选择、缓存数据的实时性) 3. 使用 Mysql 查询缓存 ( 粒度小,了解下即可 ) a) 启用 mysql 查询缓存 query_cache_type ( 0 :不使用 1 :始终使用 2 :按需使用) 1.query_cache_type=1时,也可以关闭查询缓存:Select SQL_NO_CACHE * from table

JAVA并发--volatile

廉价感情. 提交于 2019-12-22 17:10:32
学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间。在进行运算的时候,CPU将需要的数据映射一份在缓存中,然后直接操作位于缓存中的数据,操作完毕后再将缓存中的数据写回到主存。这在单线程环境中是没有任何问题的。但是在多线程环境中就大不同了。 假设现在有这样的一个场景:有两个线程thread1和thread2,他们都在操作位于主存上的一个数据int a=2(具体操作为读取a的值并执行一个自增操作)。逻辑上正确的结果:应当是最后a=4。但可能有这样的情况,thread1将a=2从主存映射到自己的工作内存上,自增后变成a=3,在将a=3从工作内存写回到主存之前,thread2也将a=2从从主存映射到自己的工作内存上,也自增后变成a=3。然后两个线程先后将a=3写回到主存上。显然,a=3不是我们想看到的。看,这就是一个常见的缓存一致性问题。两个线程对a的操作结果互不可见,thread1不知道thread2对a进行了自增,thread2也不知道thread1对a进行了自增。在多线程编程中就是会出现这样一致性的问题。(在JMM中,可以知道,内存分为主内存和工作内存 ,每个线程有自己 的工作内存,他们共享主内存 )。 因此我们要办法让线程对共享变量的操作结果互相可见

CAS操作原理分析

旧城冷巷雨未停 提交于 2019-12-20 21:25:02
一、CAS简单介绍 CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。synchronouse是一种悲观锁,它会导致其他所有需要锁的线程挂起。 二、CAS原理 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 CAS采用的是一种非阻塞算法(nonblocking algorithms),一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 CAS通过调用JNI的代码实现Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言。 拿AtomicInteger来举例, private volatile int value; 1.它有个volatile的成员变量 value,通过volatile关键字来保证多线程间数据的可见性的。 所以在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。这样才获取变量的值的时候才能直接读取。 public final int get() { return value; } 2.通过CAS操作来实现+1操作的

JAVA CAS原理深度分析

泪湿孤枕 提交于 2019-12-20 02:59:07
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html http://www.searchsoa.com.cn/showcontent_69238.htm http://ifeve.com/atomic-operation/ http://www.infoq.com/cn/articles/java-memory-model-5 java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。可见CAS的重要性。 CAS CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。 CAS应用 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 非阻塞算法 (nonblocking algorithms) 一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令

JMM和Volatile底层原理分析

雨燕双飞 提交于 2019-12-16 10:49:54
JMM和volatile分析 1.JMM:Java Memory Model,java线程内存模型 JMM:它是一个抽象的概念,描述的是线程和内存间的通信,java线程内存模型和CPU缓存模型类似,它是标准化的, 用于屏蔽硬件和操作系统对内存访问的差异性 。 2.JMM和8大原子操作结合 3.volatile的应用及底层原理探究 volatile : 轻量级的synchronized,在多处理器的开发中保证了共享变量的"可见性"。可见性的意思:当一个线程修改了某个共享变量时,其他使用到该共享变量的线程能够及时读取到修改的值。修饰得当,比synchronized的执行成本更低,因为它不会引起线程上下文切换和调度。 public class VolatileTest { private static volatile boolean flag = false; public static void main(String[] args) { update(); } public static void update(){ flag = true; System.out.println(flag); } } Volatile JIT编译器编译java代码为汇编指令查看 1.在jdk\jre\bin\ 目录下添加 hsdis-amd64.lib 2.在jdk1.8\jre\bin

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

♀尐吖头ヾ 提交于 2019-12-14 17:13:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 只要涉及到缓存的业务场景就一定会出现数据一致性问题。对于该问题,从微观的角度来看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的内存可以分为 个数据块

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

空扰寡人 提交于 2019-12-14 17:10:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 一致性专题之cpu缓存一致性(一) 中主要描述了缓存与内存的映射方式,该篇主要描述cache line的状态: 1、状态M表示该缓存行中数据有修改,并且与内存中的数据不一致; 2、状态E表示该缓存行中数据有修改,并且与内存中的数据一致; 3、状态S表示该缓存行中数据与内存中的数据一致,并且与其它内核中的cache line一致; 4、状态I表示该缓存行无效; 每个cache控制器除了监听自己cache的读写操作还监听其它cache的 读写操作与状态 ,因此每个缓存行根据当前所处的状态与监听的动作进行状态转换,简称MESI一致性协议。读写操作具体可分成4种类型(LR-本内核读取本cache,LW-本内核写本cache,RR-其它内核读其对应的cache,RW-其它内核写其对应的cache)状态转换过程如下: 1、当数据所在cache line处于I状态并发生LR时,如果其它内核cache line中没有该数据则从内存加载,然后该cache line状态变成E;如果其它内核cache line中有该数据并处于状态M时,令其写入到内存后然后本内核从内存中加载,两个cache line都处于S状态;如果其它内核cache line中有该数据且已处于状态S或者E时,本cache line从内存中加载然后都变成S状态。

如何实现LRU缓存淘汰算法(极客时间)

。_饼干妹妹 提交于 2019-12-14 01:32:33
1.如何分别用链表和数组实现LRU缓冲淘汰策略? 1)什么是缓存? 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。 2)为什么使用缓存?即缓存的特点 缓存的大小是有限的,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?就需要用到缓存淘汰策略。 3)什么是缓存淘汰策略? 指的是当缓存被用满时清理数据的优先顺序。 4)有哪些缓存淘汰策略? 常见的3种包括先进先出策略FIFO(First In,First Out)、最少使用策略LFU(Least Frenquently Used)、最近最少使用策略LRU(Least Recently Used)。 5)链表实现LRU缓存淘汰策略 当访问的数据没有存储在缓存的链表中时,直接将数据插入链表表头,时间复杂度为O(1);当访问的数据存在于存储的链表中时,将该数据对应的节点,插入到链表表头,时间复杂度为O(n)。如果缓存被占满,则从链表尾部的数据开始清理,时间复杂度为O(1)。 6)数组实现LRU缓存淘汰策略 方式一 :首位置保存最新访问数据,末尾位置优先清理 当访问的数据未存在于缓存的数组中时,直接将数据插入数组第一个元素位置,此时数组所有元素需要向后移动1个位置,时间复杂度为O(n);当访问的数据存在于缓存的数组中时

linux性能调优总结

断了今生、忘了曾经 提交于 2019-12-12 14:42:08
系统性能一直是个热门话题。做运维这几年也一直在搞性能调优,写这个文章也算是对工作的总结。 讲调优第一步是,要讲为什么要调优?也就是系统分析,分析还需要有指标,做好性能监控的情况下,看到确实需要调优才能进行。不能为了调优而 “调优“ 那不是调优,那是破坏。 性能分析的目的 找出系统性能瓶颈 为以后的优化提供方案或者参考 达到良好利用资源的目的。硬件资源和软件配置。 影响性能的因素 想确定有哪些因素,首先确定你的应用是什么类型的? 例如: cpu密集型 例如web服务器像nginx node.js需要CPU进行批处理和数学计算都属于此类型 io密集型 例如数据库常见的mysql,大量消耗内存和存储系统,对CPU和网络要求不高,这种应用使用CPU来发起IO请求,然后进入sleep状态。 确定了应用类型就开始分析有哪些情况能影响性能: 大量的网页请求会填满运行队列、大量的上下文切换,中断 大量的磁盘些请求 网卡大量的吞吐 以及内存耗尽等。。 归结起来就是4个方面 cpu memory i/o network 系统检测的工具 我们知道了这四大块影响着我们的性能,那我们有什么工具进行检测呢? 系统调优.png-341.3kB 上图时某国外大神总结的。 我个人在工作中常用到的有: htop vmstat iotop sar strace iftop ss lsof ethtool mtr等