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

南京手机网站开发网站建设需要哪些岗位

南京手机网站开发,网站建设需要哪些岗位,系统开发报价,网站开发培训培训班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.zqtcl.cn/news/957714/

相关文章:

  • php网站开发工程师招聘网自己做小程序要钱吗
  • 两学一做考试网站空间网
  • 齐诺网站建设东莞网站建设做网站集团网站群
  • 网站运营策略如何做软件网站开发培训
  • 数据库型网站wordpress上传工具
  • 太原建站公司模板宁波seo公司哪家好
  • 电商网站都是用什么做的承接电商网站建设
  • c2c网站代表有哪些怎样制作个人网站
  • wordpress linux 建站安丘市建设局官方网站
  • 谁给个好网站硬件开发是什么
  • 海外网站加速器免费长春做网站优化哪家好
  • 建立网站需要多长钱电脑网页设计培训
  • 给网站划分栏目邢台做网站优化费用
  • 网群企业网站管理系统红塔区住房和城乡建设局网站
  • 濮阳网站建设在哪做沈阳百度网站的优点
  • 网站上如何做问卷调查温州建设局官方网站
  • 做一件代发哪个网站好具有品牌的福州网站建设
  • 邢台移动端网站建设犀牛建模教程
  • 华池网站建设广西柳州市
  • 泰安网站建设推荐软件商店电脑版官方下载
  • 站长平台网站报价单模板表格
  • 织梦做的网站老是被黑杭州网站设计询问蓝韵网络
  • wordpress手机版如何设置福鼎整站优化
  • 网站建设小程序定制开发北京东宏建设网站
  • 网站制作还花钱网站图怎么做
  • 免费搭网站wordpress minty
  • 海沧建设网站多少国外调色网站
  • 中企动力建站怎么样网站建设与设计的心得体会
  • 打开网站出现directoryj2ee做网站
  • 如何建设一个视频网站西安个人做网站