游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Datenlord垃圾回收机制与无锁化编程

  垃圾回收机制(GC)对大部分开发者来说应该不陌生,特别是Java开发者或多或少都跟GC打过交道。GC的优点是实现对堆上分配的内存动态回收,避免内存泄漏。但是GC的缺点是对性能有一定影响,特别是stoptheworld问题,而且GC什么时候回收内存是不确定的,开发者无法知晓。
  在无锁化编程场景下,用Java这种有GC的语言,一定程度简化了对内存的管理,降低了无锁化编程的难度。无锁化编程,顾名思义,就是不用锁。无锁化编程特指在多线程编程的时候,对线程间共享数据的并发修改不使用锁,而采用基于硬件提供的原子操作能力来修改共享数据,进而提升性能,减少使用锁带来的互斥开销。
  最常用的硬件提供的原子操作是CompareandSwap(简称CAS),编程语言基于硬件提供的原子操作能力封装出CAS库函数调用。先看下C里的CAS函数调用:boolsyncboolcompareandswap(typeptr,typeoldval,typenewval,。。。);typesyncvalcompareandswap(typeptr,typeoldval,typenewval,。。。);
  这两个函数的功能一样,只是返回值不同。为了简化描述,略去了一些细节(这个细节是关于内存顺序,即程序指令在执行时的顺序问题,这个问题是无锁化编程能否正确实现的关键问题之一,后面我再专门详细介绍)。第一个CAS函数比较指针ptr指向的变量,看是不是等于oldval,如果相等就把ptr指向的变量改为newval,并返回true,否则不做任何改变并返回false。第二个CAS函数也是比较ptr指向的变量是否等于oldval,如果相等就把该变量改为newval,并返回oldval,如果不等就不做改变,并返回ptr指向变量的当前值。C的CAS函数调用可以保证对ptr指向的变量的修改是原子的,要么更改完成,要么不做更改。
  再看下硬件提供的原子操作。比如X86架构提供了一条CAS指令cmpxchg,这条指令在执行时是由硬件保证原子性,不会被打断。其他硬件架构,比如ARM、PowerPC也提供类似的CAS原子操作,但是和X86的实现机制不一样,这里先不展开。编程语言的编译器在X86架构下编译时,会负责把CAS库函数调用编译成基于cmpxchg的机器代码。比如C的编译器GCC在编译时如果碰到上面两个CAS函数调用,会生成包含cmpxchg指令的目标码。无锁化编程示例:无锁化堆栈(LockFreeStack)的Java实现
  先来看个简单的无锁化编程的例子,一个无锁化堆栈的Java实现(从网上找了一段现成的代码,没经过编译验证,仅做示例):importjava。util。concurrent。atomic。;importnet。jcip。annotations。;ConcurrentStackauthorBrianGoetzandTimPeierlsThreadSafepublicclassConcurrentStackE{AtomicReferenceNodeEtopnewAtomicReferenceNodeE();栈顶publicvoidpush(Eitem){NodeEnewNodenewNodeE(item);NodeEcurTop;do{curToptop。get();newNode。nextcurTop;CAS调用修改栈顶}while(!top。compareAndSet(curTop,newNode));}publicEpop(){NodeEcurTop;NodeEnewTop;do{curToptop。get();if(curTopnull){returnnull;堆栈为空}newTopcurTop。next;CAS调用修改栈顶}while(!top。compareAndSet(curTop,newTop));returncurTop。item;}privatestaticclassNodeE{publicfinalEitem;publicNodeEnext;publicNode(Eitem){this。itemitem;}}}
  从代码可以看出,这个栈的实现完全没有用锁,栈顶top是当前堆栈顶端节点的原子引用AtomicReference,每次出栈(pop)入栈(push)的时候,调用AtomicReference的compareAndSet方法来试图修改栈顶top。因为有可能有多个线程竞争访问这个无锁化堆栈,即有可能有多个线程同时对栈顶进行修改,或同时pop、或同时push,或同时pop和push,CAS的原子性保证了多个线程并发调用compareAndSet方法修改栈顶top时,仅有一个线程的调用能修改成功,其他线程的调用不成功,所以pop和push操作里要用循环的方式重复调用compareAndSet方法试图修改栈顶top,直到成功返回。
  从这个例子可以看出无锁化编程的一个显著特点,对共享数据的修改要多次重试CAS操作。虽然CAS调用基于硬件提供的原子能力,但是CAS调用的代价也不小。比如在X86多处理器架构下运行上面的无锁化堆栈,每次CAS方法调用会运行cmpxchg指令,这个指令使得多个处理器缓存里的栈顶top失效,导致多个处理器要重新从内存加载top。如果频繁调用CAS试图修改共享数据,将导致处理器缓存里的共享数据频繁失效,这个对性能的影响也不小。所以千万不要滥用CAS调用。无锁化编程示例:无锁化堆栈的C实现
  上面用Java实现无锁化堆栈,还是比较简单的,几十行代码就完成了。那用C来实现无锁化堆栈会不会也很简单呢?先看下面的无锁化堆栈C实现片段(为了简化描述,还是省略了内存顺序的细节,代码没经过编译验证,仅做示例):includestructNode{voiddata;std::atomicNodenext;};std::atomicNodetop;栈顶top。store(nullptr);初始化栈顶为空指针boolpush(Nodenewnode){Nodecurtoptop。load();while(true){newnodenext。store(curtop);CAS调用修改栈顶if(top。compareexchangeweak(curtop,newnode)){returntrue;}}}Nodepop(){while(true){Nodecurtoptop。load();if(curtopnullptr){returnnullptr;堆栈为空}Nodenextcurtopnext。load();CAS调用修改栈顶if(top。compareexchangeweak(curtop,next)){returncurtop;}}}
  看上去C的无锁化堆栈实现跟Java版本几乎一致,栈顶top也是原子类型,但是这个C实现有问题。考虑如下使用无锁化堆栈的C代码片段:NodenewnodenewNode();newnode。data。。。;push(newnode);。。。Nodepopnodepop();if(popnode){消费出栈节点。。。不能保证没有其他线程在访问popnode,此处不应该deletedeletepopnode;}
  入栈的每个节点都是new出来的,所以可能觉得想当然出栈之后的每个节点在消费过过以后要被delete掉。但是考虑多线程并发访问的场景,比如有两个线程同时调用出栈pop函数,假定这两个线程同时读取到当前栈顶curtoptop。load();,之后其中一个线程被抢占,另一个线程调用pop成功取出栈顶节点,并且消费完之后delete掉,这时之前被抢占的线程恢复执行,判断curtop不为空,然后读取curtop的下一个节点nextcurtopnext。load();,但是curtop已经被另一个线程delete掉了,curtop已经变成野指针了,一旦读取就会导致非法内存访问使得程序崩溃。
  那为什么Java版本的实现就没有问题呢?是因为GC的缘故。Java里没有显式的delete操作,所有的内存回收是GC自动实现的。回到上面两个线程并发调用出栈pop函数的场景,如果用Java实现,当两个线程都读取到当前栈顶的引用,其中一个线程被抢占,另一个线程出栈调用成功,并完成消费出栈节点,此时Java的GC并不会回收出栈节点,因为GC发现出栈节点仍有被其他线程引用。所以Java版本的无锁化编程是内存安全的。对没有垃圾回收机制的语言做无锁化编程的思考
  从上面无锁化堆栈的例子可以看出,Java的GC一定程度简化了无锁化编程,因为不用考虑内存回收的问题,Java的GC会安全的回收内存,只是不能确定Java的GC什么时候回收内存。对比没有GC的语言,显然没有GC使无锁化编程变得复杂,因为实现的时候不得不自行考虑内存安全回收的问题。这个问题相当于是在用C这类没有GC的语言做无锁化编程的时候,要自行实现一个GC,专门处理无锁化编程场景下的内存回收问题,并保证内存安全同时防止内存泄漏。
  针对这个问题已经有一些成型的算法,最简单的方法是ReferenceCounter(但是RC性能非常差,不实用,因此不做考虑),复杂些的方法诸如Hazardpointer,EpochBasedReclamation或QuiescentStateBasedReclamation。这些方法大都可以看做是一种确定型GC,更准确的说是相对Java的GC而言,这些方法执行内存回收的时刻是确定的(只是不同算法的具体内存回收触发逻辑不同)。这种确定型GC的思路是,仅针对无锁化编程这种特定场景实现GC,降低无锁化编程的难度,而不是作为通用型GC,这比起Java的GC来说就简单多了。因此,确定型GC相比Java的GC,一方面减少复杂度从而大大降低对程序性能的影响,另一方面因其内存回收的确定性所以防止stoptheworld问题出现。当然对开发者而言确定型GC也是是透明的,开发者无需关心内存何时回收。限于篇幅,具体的细节这里先不展开,后续我再详细介绍这些确定型内存回收算法。
  对没有GC的语言,比如C,已经有一些针对无锁化编程的内存回收算法的实现,比如libcds,更进一步,libcds还实现了无锁化堆栈、无锁化队列、无锁化哈希表等等。所以对于开发者而言,不需要重复造轮子,可以直接使用这些已有的实现来简化无锁化编程。
  作者王璞

国内龙,国外虫,3名新星同时登陆NBA,还能撑多久不知道过了多久,NBA赛场上关于国内球员的消息基本已经消声灭迹了,今年难得一见的有3名国内球员同时登陆NBA,虽然只是参加夏季联赛。以下是目前3名球员的情况:1、张……小米MIXFOLD2首发售罄,产品力到底怎么样?能打过华为吗小米mixfold2至尊礼盒小米mixfold2在8月16日10点开始5分钟售罄,热度确实很高,那么这款手机到底怎么样?值不值,我们分析一下。1。屏幕:外屏和内屏都……小米官宣MIXFold2新一代折叠屏手机,8月11日将正式发IT之家8月9日消息,去年3月30日,小米正式发布了小米首款折叠屏手机小米MIXFold。今日,小米官宣了新一代折叠屏手机小米MIXFold2,该机将于8月11日正式发布。……5换3!湖人最新交易方案,三名大将加盟辅佐詹皇,阵容不输勇士头条创作挑战赛洛杉矶湖人队交易欧文无望之后,就一直在四处报价,希望能以手中的筹码去换回一些对球队有很大提升的球员,但进展缓慢。原因是湖人送出的球员是威少,很少球队能接受目前的威……可贺!丁浩夺世冠,辜梓豪双杀韩悍将,李轩豪登顶,王星昊创新高可贺!丁浩夺世冠,辜梓豪双杀韩悍将,李轩豪登顶,王星昊创新高度!中国围棋国手们从2月份开始便持续换发新颜,众多喜讯一项项传来。这也让中国棋迷一瞬间对于中国棋手在世界大赛中的成绩……物极必反一切都要适度,量力而行勿要被欲望套着掉入无尽的黑洞霓虹灯的闪烁,柏油路的坚硬阻隔了泥土的味道,林木的苍翠与山花的芳香。鸽子楼的林立湮没了人的视线,让你欣赏不到浩瀚的天空与明月朦胧宁静而广博的夜的原本朴实的样子。那种繁华的氛围时……为什么不要熬夜?正经科普早睡的快乐让你意想不到导语:熬夜伤身,这个事大家都知道,不过却从来不当回事。尤其对年轻人而言,晚上10点才是夜生活刚刚开始,不到凌晨3点睡觉那都不正常。根据《2020中国人睡眠质量报告》表示,……神舟十四返回,女航天员有什么优势?发射时间为2022年6月5日上午10时44分,他将把火箭飞到距离地球400公里的空间站,完成对接。整个过程是577秒。577秒后,飞船和火箭完成了分离。经过6。5小时,我们成功……新能源车市再迎千亿级别政策大礼包《中国经济周刊》记者吕江涛北京报道8月22日,A股市场新能源汽车板块整体大幅上涨,多家产业链相关上市公司股价涨停。消息方面,传闻已久的延续实施新能源汽车免征车购税等一系列……OPPOFindX5Pro和索尼Xperia1IV,蔡司与哈手机厂商为了提升影像体验,以及品牌格调,这些年不断联名相机品牌,比如vivo和蔡司、小米和徕卡、一加和哈苏,以及一加的老大哥OPPO也与哈苏展开了合作,推出了搭载骁龙8Gen1……尝鲜上手体验OPPOWatch3Pro,分享几点个人真实感受最近几年,智能穿戴设备可以说是爆火,其中智能手表基于能够可以方便用户看时间、通知信息,以及运动健康监测,更是逐渐成为眼下年轻用户群体的标配。像是我自己,作为一名95后打工人,过……鳄鱼湖的传说鳄鱼湖也叫万鳄湖、忽律海。从这些名字可以看出这个湖非常大。而且湖里鳄鱼极多,不然也不会取这样的名字。不过这照片上的鳄鱼湖很小,称为湖?夸大其词,叫鳄鱼池还差不多。实际上这……
中国癌症高发与蚝油有关吗?为了健康,请牢记这3点蚝油是厨房中的常客,是家中常备的调味料,炒菜做饭时,人们都要放入蚝油增添食物的新鲜感,市面上售卖的蚝油价格一瓶在9。914。9元左右,价格亲民,外加口感独特的原因,也就受到了众……如果你是音响爱好者,猜你八成是七零后,别问为什么!如果你是音响爱好者,猜你八成是七零后,别问为什么!五零后大概已经玩够了,他们当中大多忙着带孙子或者凑麻将三缺一去了,对于曾经嗜音响如命的年代已经淡去了。从这样的世界……孩子头上的旋代表什么?与智商和性格有关吗?今天告诉你答案儿童在出生时,经常听到老人来抚摸儿童的头部判断存在几个旋,古代流传的俗语一旋好、二选精、三旋是个黑老包或者一旋好,二旋坏、三个脾气怪。在医学上,旋又被称为发旋,是体内的毛……最新研究格陵兰岛冰盖融化将致海平面上升30厘米极目新闻记者孙喆综合美联社、CNN8月30日报道,《自然气候变化》杂志周一发表的一项研究指出,无论未来气候变暖保持何种速率,格陵兰岛冰盖都将不可避免地损失110万亿吨冰,……嘎子摊事了?网曝谢孟伟需补税上亿,卖了北京2套房产,本人回应1937年哪,鬼子就进了中原,先打开卢沟桥,后打开熟悉的旋律一想起,大家是不是就想起了我们童年的回忆《小兵张嘎》,这部剧之所以现在大家还能记起,是因为这部剧足够经典值得铭记。……中国军团3胜5负,3人晋级16强!00后小将53险胜,90后中国军团3胜5负,3人晋级16强!00后小将53险胜,90后名将遭绝杀。2023年斯诺克德国大师赛正赛首轮的争夺已经结束了,中国军团一共取得了3胜5负的战绩,肖国栋,田鹏飞,庞……上港幸亏没留下他,昔日核心踢日丙联赛沦为替补,至今未登场亮相本赛季对于上港飞翼陈彬彬来说,注定是非常难熬的一个赛季。因为,陈彬彬不管是在中超联赛,还是留洋去了日丙联赛,都没有踢上主力。陈彬彬原本为了摆脱在中超枯坐板凳的命运,选择去了日丙……6岁女孩确诊甲流4天后,走路一瘸一拐!医生提醒出现这些症状马近日广东迎来甲流新流行高峰身边不少朋友都表示自己的孩子出现了发烧、感冒的症状而这两周广东医科大学顺德妇女儿童医院的门诊量也翻了倍其中有……三国杀4K飞龙在天关羽重制修复动态壁纸完整蓝龙该文章只发动态皮肤,静态超清原图无限期停更这张皮肤三服基本一致,所以就不全部截图了,老服动态手不会动,光效也少这张皮肤的作者是木美人,相信大家非常熟悉了游戏内……每日学习一味中药山楂至上篇文章截止,理气药部分就告一段落,还有部分相对冷门的理气药未分享,有兴趣的可以看看中药大全。今天聊聊消食药。消食药,顾名思义,以消化食积为主要作用的中药,临床上主要用……莫言10条经典语录,带你领悟真实人生叔本华曾说,人活着的本质就是受苦。每个人的生命都有其自己的苦难,来世上一遭,就是要经历不同的坎坷,面临不同的挑战。修行也好,磨砺也罢,总之,你的人生是独一无二,无可替代的。当你……逾50只天鹅迁徙停歇京津冀最美湿地衡水湖天鹅们游过湖面,仿佛在上演水上芭蕾。张学峰摄中新网衡水11月9日电(崔志平黄建金莉莉)自2000年以来,衡水湖冬春两季都有天鹅飞临的记录,此次共监测到大天鹅和小天鹅共52……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网