当前位置: 首页 > news >正文

9.9网站怎么做三明企业网站建设

9.9网站怎么做,三明企业网站建设,网站首页的作用,什么网站可以做图赚钱吗1 引言 原子#xff08;atom#xff09;本意是“不能被进一步分割的最小粒子”#xff0c;而原子操作#xff08;atomic operation#xff09;意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和…1    引言 原子atom本意是“不能被进一步分割的最小粒子”而原子操作atomic operation意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。   2    术语定义 术语名称英文解释缓存行Cache line缓存的最小操作单位比较并交换Compare and SwapCAS操作需要输入两个数值一个旧值期望操作前的值和一个新值在操作期间先比较下在旧值有没有发生变化如果没有发生变化才交换成新值发生了变化则不交换。CPU流水线CPU pipelineCPU流水线的工作方式就象工业生产上的装配流水线在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线然后将一条X86指令分成5~6步后再由这些电路单元分别执行这样就能实现在一个CPU时钟周期完成一条指令因此提高CPU的运算速度。内存顺序冲突Memory order violation内存顺序冲突一般是由假共享引起假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效当出现这个内存顺序冲突时CPU必须清空流水线。3    处理器如何实现原子操作 32位IA-32处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。 3.1   处理器自动保证基本内存操作的原子性   首先处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存当中读取或者写入一个字节是原子的意思是当一个处理器读取一个字节时其他处理器不能访问这个字节的内存地址。奔腾6和最新的处理器能自动保证单处理器对同一个缓存行里进行16/32/64位的操作是原子的但是复杂的内存操作处理器不能自动保证其原子性比如跨总线宽度跨多个缓存行跨页表的访问。但是处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。 3.2   使用总线锁保证原子性   第一个机制是通过总线锁保证原子性。如果多个处理器同时对共享变量进行读改写i就是经典的读改写操作操作那么共享变量就会被多个处理器同时进行操作这样读改写操作就不是原子的操作完之后共享变量的值会和期望的不一致举个例子如果i1,我们进行两次i操作我们期望的结果是3但是有可能结果是2。如下图 例1 原因是有可能多个处理器同时从各自的缓存中读取变量i分别进行加一操作然后分别写入系统内存当中。那么想要保证读改写共享变量的操作是原子的就必须保证CPU1读改写共享变量的时候CPU2不能操作缓存了该共享变量内存地址的缓存。 处理器使用总线锁就是来解决这个问题时所谓总线锁就是使用处理器提供的一个LOCK信号当一个处理器在总线上输出此信号时其他处理器的请求将被阻塞住,那么该处理器可以独占使用共享内存。 3.3 使用缓存锁保证原子性 第二个机制是通过缓存锁定保证原子性。在同一时刻我们只需保证对某个内存地址的操作是原子性即可但总线锁定把CPU和内存之间通信锁住了这使得锁定期间其他处理器不能操作其他内存地址的数据所以总线锁定的开销比较大最近的处理器在某些场合下使用缓存锁定代替总线锁定来进行优化。 频繁使用的内存会缓存在处理器的L1L2和L3高速缓存里那么原子操作就可以直接在处理器内部缓存中进行并不需要声明总线锁在奔腾6和最近的处理器中可以使用“缓存锁定”的方式来实现复杂的原子性。所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定当它执行锁操作回写内存时处理器不在总线上声言LOCK信号而是修改内部的内存地址并允许它的缓存一致性机制来保证操作的原子性因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效在例1中当CPU1修改缓存行中的i时使用缓存锁定那么CPU2就不能同时缓存了i的缓存行。 但是有两种情况下处理器不会使用缓存锁定。 第一种情况是当操作的数据不能被缓存在处理器内部或操作的数据跨多个缓存行cache line则处理器会调用总线锁定。 第二种情况是有些处理器不支持缓存锁定。对于Inter486和奔腾处理器,就算锁定的内存区域在处理器的缓存行中也会调用总线锁定。 以上两个机制我们可以通过Inter处理器提供了很多LOCK前缀的指令来实现。比如位测试和修改指令BTSBTRBTC交换指令XADDCMPXCHG和其他一些操作数和逻辑指令比如ADD加OR或等被这些指令操作的内存区域就会加锁导致其他处理器不能同时访问它。 4    JAVA如何实现原子操作 在java中可以通过锁和循环CAS的方式来实现原子操作。 4.1 使用循环CAS实现原子操作 JVM中的CAS操作正是利用了上一节中提到的处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止以下代码实现了一个基于CAS线程安全的计数器方法safeCount和一个非线程安全的计数器count。 package com.dxz.cas;import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class Counter {private AtomicInteger atomicI new AtomicInteger(0);private int i 0;public static void main(String[] args) {final Counter cas new Counter();ListThread ts new ArrayListThread(600);long start System.currentTimeMillis();for (int j 0; j 100; j) {Thread t new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 10000; i) {cas.count();cas.safeCount();}}});ts.add(t);}for (Thread t : ts) {t.start();}// 等待所有线程执行完成for (Thread t : ts) {try {t.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(cas.i);System.out.println(cas.atomicI.get());System.out.println(use time: (System.currentTimeMillis() - start));}/*** 非线程安全计数器*/private void count() {i;}/*** 使用CAS实现线程安全计数器*/private void safeCount() {for (;;) {int i atomicI.get();boolean suc atomicI.compareAndSet(i, i);if (suc) {break;}}} } 结果 995672 1000000 use time:57 从Java1.5开始JDK的并发包里提供了一些类来支持原子操作如AtomicBoolean用原子方式更新的 boolean 值AtomicInteger用原子方式更新的 int 值AtomicLong用原子方式更新的 long 值这些原子包装类还提供了有用的工具方法比如以原子的方式将当前值自增1和自减1。 在Java并发包中有一些并发框架也使用了自旋CAS的方式来实现原子操作比如LinkedTransferQueue类的Xfer方法。CAS虽然很高效的解决原子操作但是CAS仍然存在三大问题。ABA问题循环时间长开销大和只能保证一个共享变量的原子操作。 ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化如果没有发生变化则更新但是如果一个值原来是A变成了B又变成了A那么使用CAS进行检查时会发现它的值没有发生变化但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号每次变量更新的时候把版本号加一那么ABA 就会变成1A-2B3A。从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用并且当前标志是否等于预期标志如果全部相等则以原子方式将该引用和该标志的值设置为给定的更新值。 public boolean compareAndSet(V expectedReference,//预期引用V newReference,//更新后的引用int expectedStamp, //预期标志int newStamp //更新后的标志 ) 循环时间长开销大。自旋CAS如果长时间不成功会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升pause指令有两个作用第一它可以延迟流水线执行指令de-pipeline,使CPU不会消耗过多的执行资源延迟的时间取决于具体实现的版本在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突memory order violation而引起CPU流水线被清空CPU pipeline flush从而提高CPU的执行效率。只能保证一个共享变量的原子操作。当对一个共享变量执行操作时我们可以使用循环CAS的方式来保证原子操作但是对多个共享变量操作时循环CAS就无法保证操作的原子性这个时候就可以用锁或者有一个取巧的办法就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i2,ja合并一下ij2a然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性你可以把多个变量放在一个对象里来进行CAS操作。4.2 使用锁机制实现原子操作 锁机制保证了只有获得锁的线程能够操作锁定的内存区域。JVM内部实现了很多种锁机制有偏向锁轻量级锁和互斥锁有意思的是除了偏向锁JVM实现锁的方式都用到的循环CAS当一个线程想进入同步块的时候使用循环CAS的方式来获取锁当它退出同步块的时候使用循环CAS释放锁。详细说明可以参见文章Java SE1.6中的Synchronized。 5      参考资料 Java SE1.6中的SynchronizedIntel 64和IA-32架构软件开发人员手册深入分析Volatile的实现原理转自http://ifeve.com/atomic-operation/
http://www.pierceye.com/news/66472/

相关文章:

  • 上海大型网站开发公司怎么用html做移动网站吗
  • 网站建设美工招聘河北省住房和城乡建设厅的网站
  • 计算机网络网站建设的实训总结问卷调查网站
  • 上海频道网站建设公司深圳网站建设哪个平台好
  • 企业网站系统建设淄博建设公司网站
  • 给我一个网站wordpress如何修改后台网址
  • 网站免费软件推荐百度云手机app下载
  • 台州网站建设哪家便宜企业网站开发价钱低
  • 有链接的网站怎么做wordpress第三方收款
  • 网站空间购买注意事项wordpress4.94主题上传不显示
  • 水处理网站源码网络彩票建立网站
  • 网站推广分为哪几个部分wordpress模板编辑
  • 南昌网站建设模板技术公司怎样防止网站被黑
  • 网站建设设计作业2023年中国500强企业
  • 服务器不稳定 如何让百度重新收录网站长沙网络营销平台排行
  • 张掖艺能网站建设如何在百度上添加自己的店铺
  • 唐山seo网站建设这样自己做网站
  • 查看网站是否被k零基础网络工程师培训
  • 网站开发外包方案网站做关键词排行一个月多少钱
  • 建设网站怎么建设分类google search
  • 地产网站方案简单的手机网址大全
  • 绵阳远腾建设网站湖北建设科技中心网站首页
  • 网站友链查询接口保洁网站模板
  • 电子商务网站建设需要做好哪些准备6网站备案依据
  • 腾讯 网站建设湖南专业网站建设
  • 网站开发代理招商软件开发项目经验
  • 有没有悬赏做ppt的网站网站建设 项目文档
  • 凡客诚品官方网站首页Wordpress 新建模块
  • 北京网站建设 标准型 新翼wordpress 获取当前文章栏目链接
  • 张家港市网站制作网站优化过度被k