-
五级流水线CPU优化:一级cache设计
2019-03-01 09:50:57采用一级cache设计对五级流水线CPU进行优化,Cache的工作原理是基于程序访问的局部性。根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分... -
一级Cache与二级Cache的主要区别是什么
2018-05-22 17:07:27一般来说我们买CPU时都会重视L2的大小,而没有几个在L1上做文章L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM...缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。
总体来说,现在CPU的L1缓存的大小差别不大,主要差的就是L2,而L2的增加会使性能大幅度的提升,但是相对来说成本增加的更大。一般来说我们买CPU时都会重视L2的大小,而没有几个在L1上做文章
L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般服务器CPU的L1缓存的容量通常在32—4096KB。
L2 CACHE=二级缓存
它是处理器内部的一些缓冲存储器,其作用跟内存一样。 它是怎么出现的呢? 要上溯到上个世纪80年代,由于处理器的运行速度越来越快,慢慢地,处理器需要从内存中读取数据的速度需求就越来越高了。然而内存的速度提升速度却很缓慢,而能高速读写数据的内存价格又非常高昂,不能大量采用。从性能价格比的角度出发,英特尔等处理器设计生产公司想到一个办法,就是用少量的高速内存和大量的低速内存结合使用,共同为处理器提供数据。这样就兼顾了性能和使用成本的最优。而那些高速的内存因为是处于CPU和内存之间的位置,又是临时存放数据的地方,所以就叫做缓冲存储器了,简称“缓存”。它的作用就像仓库中临时堆放货物的地方一样,货物从运输车辆上放下时临时堆放在缓存区中,然后再搬到内部存储区中长时间存放。货物在这段区域中存放的时间很短,就是一个临时货场。 最初缓存只有一级,后来处理器速度又提升了,一级缓存不够用了,于是就添加了二级缓存。二级缓存是比一级缓存速度更慢,容量更大的内存,主要就是做一级缓存和内存之间数据临时交换的地方用。现在,为了适应速度更快的处理器P4EE,已经出现了三级缓存了,它的容量更大,速度相对二级缓存也要慢一些,但是比内存可快多了。 缓存的出现使得CPU处理器的运行效率得到了大幅度的提升,这个区域中存放的都是CPU频繁要使用的数据,所以缓存越大处理器效率就越高,同时由于缓存的物理结构比内存复杂很多,所以其成本也很高。
大量使用二级缓存带来的结果是处理器运行效率的提升和成本价格的大幅度不等比提升。举个例子,服务器上用的至强处理器和普通的P4处理器其内核基本上是一样的,就是二级缓存不同。至强的二级缓存是2MB~16MB,P4的二级缓存是512KB,于是最便宜的至强也比最贵的P4贵,原因就在二级缓存不同。 -
Hibernate的一级Cache
2010-06-03 14:21:00Hibernate Cache有很多值得学习的地方,这里我们主要介绍一级Cache,包括介绍Session实现了第一级Hibernate Cache,它属于事务级数据缓冲等方面。 Hibernate实现了良好的Cache机制,可以借助...这里介绍Hibernate Cache,Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。
Hibernate Cache有很多值得学习的地方,这里我们主要介绍一级Cache,包括介绍Session实现了第一级Hibernate Cache,它属于事务级数据缓冲等方面。
Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。Hibernate中的Cache可分为两层:一级Cache和二级Cache.
一级Cache:
Session实现了第一级Hibernate Cache,它属于事务级数据缓冲。一旦事务结束,这个Cache也随之失效。一个Session的生命周期对应一个数据库事务或一个程序事务。
Session-cache保证了一个Session中两次请求同一个对象时,取得的对象是同一个JAVA实例,有时它可以避免不必要的数据冲突。另外,它还能为另一些重要的性能提供保证:
1:在对一个对象进行自我循环引用时, 不至于产生堆栈溢出。
2:当数据库事务结束时,对于同一个数据库行,不会产生数据冲突,因为对于数据库中的一行,最多只有一个对象来表示它。
3:一个事务中可能会有很多个处理单元,在每一个处理单元中做的操作都会立即被另外的处理单元得知。
我们不用刻意去打开Session-cache,它总是被打开并且不能被关闭。当使用save(),update()或saveOrUpdate()来保存数据更改,或通过load(),find(),list()等方法来得到对象时,对象就会被加入到Session-cache.
如果要同步很多数据对象,就需要有效地管理Cache,可以用Session的evict()方法从一级Cache中移除对象。如下:
- Session session = HibernateUtil.currentSession();
- Transaction tx = session.beginTransaction();
- for(int i = 0 ; i <100000 ; i++)
- {
- Student stu = new Student();
- session.save(stu);
- }
- tx.commit();
session.close();在保存50000个或更多对象时,程序可能会抛出OutOfMemoryException异常,因为Hibernate Cache在一级缓存了新加入的所有对象。内存溢出。要解决这全问题就需要把JDBC批处理数量设置为一个合理的数值(一般是10~20)。在Hibernate Cache的配置文件中可以加入以下属性
- <property name="hibernate.jdbc.batch_size"> 20 </property>
然后我们在程序中一定时刻就提交并更新Session的Hibernate Cache:
- Session session = HibernateUtil.currentSession();
- Transaction tx = session.beginTransaction();
- for(int i = 0 ; i <100000 ; i++)
- {
- Student stu = new Student();
- session.save(stu);
- if(i%20 == 0)//每保存完20个对象后,进行如下操作
- {
- session.flush();//这个会提交更新
- session.clear();//清除Cache,释放内存
- }
- }
-
一级cache做大为什么会需要多个流水级
2020-08-17 09:35:30 -
基于4*4Torus结构的一级Cache的一致性协议的提案
2014-02-02 16:59:41摘要:在带有一级Cache的多处理器系统中,由于不同处理器Cache对内存存储块的共享会产生一致性问题,并且随着多核处理器规模扩大愈加复杂,因此设计有效且高效一级Cache的一致性协议是很重要的。本文借鉴Token的思想...摘要:在带有一级Cache的多处理器系统中,由于不同处理器Cache对内存存储块的共享会产生一致性问题,并且随着多核处理器规模扩大愈加复杂,因此设计有效且高效一级Cache的一致性协议是很重要的。本文借鉴Token的思想,对目录表法加以改动提出了一种基于4*4Torus结构的Cache一致性协议。
1.引言
在共享内存的多处理器系统中,Cache结构可以将共享存储空间的数据缓存在本地,加速处理器获取数据的过程,但是由此也会带来严重的数据不一致现象。为了保证多处理器并行工作的正确性,高效的Cache一致性协议是必须的。
目前在多处理器系统中,较为典型的Cache一致性协议主要有监听法、目录表发、Token协议和Hammer协议[1]。这四种协议在不同情况下各有不同的优势,同时也存在比较明显的缺陷。因此,研究人员在此基础上提出了多种改进型协议。
2.Cache一致性协议概述
监听法通过共享总线向片内所有处理器进行消息广播,并需要时刻监听总线事务来更新本地数据的一致性状态,较为通用的有MESI和MOESI协议。但是监听法依赖于总线的完全顺序性,在处理器单元数较多时总线争用较为严重,且无法直接应用于无序互联结构,如Torus结构;且请求时需要向全体处理器单元广播消息,导致总线上通信量较大。
目录协议对共享存储器中的数据块设置目录项以跟踪、记录其状态信息,只需对需要的节点进行点对点通信而不需要广播消息。根据目录项的位置,可以分为集中式目录表法(Tang方法)和分散式目录表法[2,3]。依据目录项存储内容,可以分为全映射法、有限目录法和链式目录法。目录表法会增大Cache缺失延迟,并额外占用存储空间。有研究人员提出了一种使用两级目录的Cache一致性协议以减少额外存储[4,5],但在4*4Torus网中,使用两级目录并不能减少目录项占用的存储空间。
Token协议将一致性协议分为正确性框架和性能策略两层。正确性框架中的Token计数策略通过令牌的持有保证执行的安全性,持续性请求避免现象的发生。而在性能策略层可以选择高性能的协议来提升效率[6]。
3. 系统结构和基本思想说明
本文基于4*4的Torus结构,借鉴Token的计数机制,对分散的全映射的目录表法的做了一些变动,提出了一种Cache一致性协议。
本文所提出的Cache一致性协议所适用的多处理器系统结构如图2-1所示:使用4*4Torus结构作为互连结构连接16个处理器单元,每个处理器单元包含相连的处理器内核、一级Cache和通信接口。同时,互连结构与分散共享的内存(具有一致的地址空间)相连,该内存即为Home Memory。
图2-1
同时,需要对内存数据存储方式进行改动,为数据块添加特定标记位,具体见图2-2。数据块的前两bit用作状态标签,有00、01、10三种状态。接下来16bit用于存储对应16个处理器Cache的共享信息,如果对应的Cache保存有可用副本则设置为1,否则设置为0。最后在数据区存放数据。
图2-2
之所以使用全映射目录而不是采用有限目录或者链式目录,因为对于16个处理器的系统,有限目录法和链式目录都无法减少目录项所额外消耗的内存空间,同时全映射法又可以很好的找到对应的Cache。且使用分散共享的Memory和分散式目录项可以有效减少目录查询所造成的时间延迟。
4、协议内容详述
协议共使用三种状态:
Invalid(00):该数据块不可用;
Owner(01):该数据块是系统中唯一一个可用数据块,其他副本皆不可用,且与内存中数据不一致。
Share(10):该数据块可用且系统中可能存在与该数据块相同的可用副本,且与内存中的数据一致。
在内存中,每个数据块标志位初始值为10(Share),且只可能存在Share和Invalid两种状态。
当本地CPU写时,如果Cache未命中,或者命中后数据块标志位为Invalid,则向Home Memory发出写请求。Home接收到写请求后,查找该数据块的标志位。如果该数据块的状态为Share,则直接向请求CPU返回数据、共享副本的数量值(Num),然后向其他共享者发送无效化消息,其他Cache将各自的副本置无效化后向请求者发送ACK,当请求者接受到Num个ACK后,将数据块的状态置为Owner,开始进行写操作。具体流程可见图3-1。如果该数据块的状态为Invalid,则检查目录项,向拥有者转发写请求信息,之后Owner将所有权转移给请求者。具体流程可见图3-2。如果Cache命中且状态为Owner,直接进行写操作即可。如果Cache命中,且状态为Share,则检查目录项,向其他所有共享者以及Home Memory发送无效化信息,获得ACK之后置为Owner状态,之后进行写操作,具体流程可见图3-3。
图3-1
图3-2
图3-3
当本地CPU读时,如果Cache未命中,或者命中后标志位为Invalid,则向HomeMemory发出读请求。Home接收到读请求后,查找该数据块的标志位。如果该数据块的状态为Share,则直接向请求者返回数据,置请求者状态为Owner,开始进行写操作,同时向其他共享者发送新共享消息以修改目录项。具体流程可见图3-4。如果该数据块的状态为Invalid,则检查目录项,向拥有者转发读请求信息,之后Owner将状态设置为Share,将数据发送给请求者,同时更新Home Memory。请求者接受到数据后即可进行读操作,具体流程可见图3-5。如果Cache命中且状态为Owner,直接进行读操作即可。如果Cache命中,且状态为Share,直接进行读操作即可。
图3-4
图3-5
在整个协议中,整体的状态迁移过程可以用图3-6来说明。其中,RW和RR分别代表其他处理器写操作和其他处理器读操作;LR和LW分别代表本地处理器读操作和本地处理器写操作。
图3-6
综上所述,该协议的处理流程、状态转换和通信方式彼此是统一、自洽的,可以通过正常的状态转移和通信保证Cache的一致性。
5、协议评价和总结
本文所提出的Cache一致性协议针对4*4Torus的互连结构,以分散式全映射目录表法为基础,并借用了Token协议中Token计数机制,即当需要进行写操作而本身Cache的状态不为Owner时,需要获得所有其他拥有者的无效化应答,才可以进行写操作。
同时,本文所提出的一致性协议在维护Cache数据块一致性的同时,也保证有效数据块中目录项的一致性,同时借助本文协议中所设计的处理流程,对于所有可遇状况中的一半可以在第二步获取到所需要数据,少于基础目录表法的三步,同时使用分散目录表法减少了目录查询延迟。因此本文所提出的方法的数据缺失延迟多于监听法,但少于基础目录表法。当然,本协议可以直接用于Torus等无序结构,而监听协议不可以。
当然,本方法会占用一定的存储空间,若一个数据块存放的数据量为16Byte,那么该方法造成的额外内存消耗为12.3%左右,是可以接受的,但是如果处理器的数目增加,会导致占用量迅速上升,也就是说该方法的扩展度有限。
当然,本文提出的一致性协议并没有经过仿真实验,并且可能存在一些瑕疵,具体的效果有待验证。
参考文献:
[1]黄安文,张民选.多核处理器 Cache 一致性协议关键技术研究[J]. 计算机工程与科学, 2009, 31(A01): 104-108.
[2] Tang C K. Cache system design in the tightly coupledmultiprocessor system[C]//Proceedings of the June 7-10, 1976, national computerconference and exposition. ACM, 1976: 749-753.
[3] Censier L M, Feautrier P. A new solution to coherenceproblems in multicache systems[J]. Computers, IEEE Transactions on, 1978,100(12): 1112-1118.
[4] 王钰. 可缩放性Cache一致性协议分析[J]. 电光与控制, 1999 (2): 44-48.
[5]潘国腾, 窦强, 谢伦国. 基于目录的Cache 一致性协议的可扩展性研究[J]. 计算机工程与科学, 2008, 30(6): 131-133.
[6] 周川. 众核处理器中动态可重构 Cache 一致性协议的研究与实现[D]. 上海交通大学, 2013.
-
9.4.2 二级Cache
2010-12-16 16:09:00二级Cache是SessionFactory范围内的缓存,所有的Session共享同一个二级Cache。在二级Cache中保存持久性实例的散装形式的数据。二级Cache的内部是如何实现的并不重要,重要的是采用哪种正确的缓存策略,以及采用哪种... -
L1 Cache(一级缓存)
2020-05-29 10:58:19CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度... -
mybatis一级缓存(session cache)引发的问题
2016-05-14 12:06:21mybatis一级缓存(session cache)引发的问题 -
Mybatis一级缓存介绍(LocalCache)
2020-12-01 10:36:06Mybatis一级缓存介绍(LocalCache) 1缓存的创建 1.1 createCacheKey创建的执行流程 1.2源码分析 在执行BaseExecutor.query的方法中首先判断ResultHandler是否为空,ResultHandler对返回的结果处理,无返回接口为空... -
android中图片的三级cache策略(内存 文件 网络) 一
2019-01-17 15:58:44android中图片的三级cache策略(内存 文件 网络) 一 -
Hibernate 一级缓存(First-level cache)和二级缓存(second-level cache) 介绍
2016-08-26 13:59:15Hibernate 一级缓存(First-level cache)和二级缓存(second-level cache) 介绍分别是什么?First-level cache: First-level cache always Associates with the Session object. Hibernate uses this cache by default... -
spring cache实现一二级缓存
2020-07-08 15:05:30spring cache 抽象了cache,具体的实现可以随意组合。由于...线面是spring整合caffeine缓存实现一二级缓存。 自定义缓存实现 public class MapCaffeCache implements Cache { // private Concu -
java项目集成J2Cache(一级缓存ehCache,二级缓存redis)
2019-01-10 11:01:00本文主要记录java项目集成J2Cache并以ehcache作为一级缓存,redis作为二级缓存的配置过程。(以下内容仅个人观点) 首先介绍下已有项目情况,已有项目为ssm框架,已集成ehcache功能即目前项目后台已使用ehcache缓存... -
国内一个款不错的二级缓存框架J2Cache
2019-03-04 22:38:32阅读文本大概需要5分钟。 看图说话缓存技术在软件开发中已经无处不在,今天分享一款国内开源的相当不错的缓存框架J2Cache 。J2Cache 是 OSChina 目前... -
Mybatis Cache(一级缓存、二级缓存)
2017-10-19 10:54:431. 一级缓存 一级缓存是SqlSession级别的缓存。一个sqlSession对象,维护一个缓存 (HashMap), 不同的sqlSession之间的缓存互相独立。 当一个sqlSession结束后,对应的一级缓存就失效了。 ... -
Mybatis源码分析之Cache一级缓存原理(四)
2019-06-27 10:11:52目录 一:什么是一级缓存 二:如何执行缓存 三:一级缓存生命周期 ...它的缓存分为一级缓存和二级缓存,本文我们主要分析下一级缓存。 先看一个例子,代码还是之前(第一篇)的的demo publicstaticv... -
Hibernate的1级、2级Cache管理及EhCache的使用
2016-03-11 06:50:11Hibernate的1级、2级Cache管理及EhCache的使用 Cache就是缓存,它往往是提高系统性能的最重要手段,对数据起到一个蓄水池和缓冲的作用。Cache对于大量依赖数据读取操作的系统而言尤其重要。在大并发量的情况下,... -
单片机与DSP中的32位DSP两级cache的结构设计
2020-11-16 21:58:47在DSP中引入二级Cache存储器结构,在较小的硬件开销下提高了DSP的工作速度。结合高性能低功耗DSP cache设计这个项目,对两级cache的结构和算法做了探讨。 2 cache总体设计 传统的存储器主要由Dram组成,它的... -
android中图片的三级cache策略(内存、文件、网络) 一
2013-06-08 11:24:141. 简介 现在android应用中不可避免的要使用图片,有些图片...在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响。当然,我想,向百度美拍这样的应用,必然也有其 -
论文研究-基于GEMS的三级Cache一致性协议的设计和实现 .pdf
2019-08-17 11:06:07基于GEMS的三级Cache一致性协议的设计和实现,武越川,李艳华,分析了cache一致性协议的工作机理,定义了cache在不同事件驱动下的状态转换过程和相关的操作,在MOESI基础上设计了一个三级独立Cache一� -
Hibernate缓存机制----二级Cache
2013-04-11 10:24:42二级Cache是SessionFactory范围内的缓存,所有的Session共享同一个二级Cache。在二级Cache中保存持久性实例的散装形式的数据。二级Cache的内部是如何实现的并不重要,重要的是采用哪种正确的缓存策略,以及采用哪种...
-
Shell 一键安装命令
-
使用vue搭建微信H5公众号项目
-
超迷你TYPE-C锂电池充电模块
-
2020人工智能医疗投融资报告.pdf
-
【Dgraph】Java调用
-
canvas实战之酷炫背景动画(一)
-
剑指Offer打卡day16—— AcWing 36. 合并两个排序的链表
-
ansible命令应用
-
MySQL高可用方案MHA的部署和原理
-
如何拥有系统化开发能力(第三部分).pdf
-
git core.autocrlf配置说明
-
title如何优化
-
json handle.zip
-
工信部下架 10 款侵害用户权益 App: 因未按要求完成整改 看看你有没有中枪!!
-
SuperIO_Demo.rar
-
element 在rules中的pattern中写正则表达式
-
【剑指offer】面试题13 - 机器人的运动范围
-
零基础一小时极简以太坊智能合约开发环境搭建并开发部署
-
IOC(Inversion of Control)
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离