LF模式是个坑,ZeroIce中间件让你体会这个痛

LF模式是个坑,一个小小的失误就可能使你的网络处理瘫痪,Ice就很好地展现了出来,换句话说,Ice中间件或是LF模式就是一个坑,如果你一不小心。

LF模式的官方论文中,论述了此模式用于高性能网络并发模式,使用的是系统的隐式队列,也就是Reactor复用多路IO,(如果是select的话,还是会将事件收集到一个显式队列),每次只有一条线程可以有一次机会成为leader访问这个队列,从队列取出事件后放弃leader,同时唤醒另一线程(如果还有follower线程的话);注意这时的线程既不是leader也不是follower,它就可以处理事件,一般就是同步非阻塞读写,然后处理这个请求(通常来说就是dispatchFromThisThread)。当上面的工作结束就,才会作为follower等待成为leader,如果没有leader的话就会马上成为leader。在这种模式中,称为LF模式有点误导,因为实际上是三种状态,LPF,Leader,Process,Follower,状态机为 L->P->F->L->...。Follower状态的线程阻塞等待着Leader离开Leader状态去Process,从而唤醒可能的Follower状态的线程。被唤醒的Follower线程状态变为Leader,成为线程池中唯一当前有权操作队列的线程,要么阻塞在空队列,要么取出队列一个事件离开Leader状态去Process。线程池线程当Process完事件后才会状态变为Follower,或者阻塞等待Leader的唤醒,或者自动成为Leader。状态机就为 L(block on event queue)->P->F->(block on followers queue)->L ...。在这种模式下的线程池中,最多只有一个线程在Leader状态,并且只有这个Leader线程可以阻塞在IO事件队列,其它线程要么在Process状态处理事件,要么就是在Follower状态等待成为下一个Leader。当没有IO事件的时候,就只有一个线程在Leader状态阻塞在IO事件队列,其它线程都结事了事件的处理,并在Follower状态阻塞等待Leader线程释放信号。

通常用来衬托LF模式的,就是sync/async模式,并且都会举例Manager-Workers线程池。Manager负责将队列的事件指派到空闲Worker线程进行处理。Worker线程被唤醒处理完事件后再次阻塞等待Manager唤醒。当没有事件的时候,Manager阻塞在事件队列,Worker线程阻塞等待Manager线程唤醒。这种线程池有一个固定线程去阻塞在事件队列。并且每次Manager唤醒Worker都要通过堆来传递事件。(Manager从事件队列取出一个事件写入到堆内存,Worker从堆内存读到自己的栈,然后处理栈上的这个事件;而Leader从事件队列将一个事件读到自己的栈,再就唤醒其它Follower,然后处理栈上的这个事件。)当Manager线程不负责Reactor复用多路IO的情况,在空闲时发生了一次IO事件必须跨线程写入Manager线程的事件队列,并唤醒Manager线程,然后Manager线程唤醒Worker线程去处理事件。而LF模式线程池,Leader从系统的多路IO复用分离函数中返回,唤醒一个Follower,然后自己去处理事件。这样一比较就是Manager-Workers线程池进行了两次线程唤醒,而LF模式线程池只有一个线程唤醒(这里必须要公正,Leader是之前就被唤醒经历消耗了一次切换),事件在Manager-Workers线程池需要多次拷贝。

那么为什么LF模式不心就会踩坑,而Ice的设计就让体会这个坑。

问题在于如果LF模式线程池的线程进行Process阻塞等待IO响应,而所有的线程都在Process过程中阻塞等待IO响应,更重要这些被等待的IO应用在这个线程池的Reactor,就会再也没有线程成为Leader去多路IO分离函数中读取IO事件。这时候这个LF线程池就会瘫痪不工作。Ice中间件会让你深深体会这种痛。Ice采用ActiveObject模式进行OBR对象代理请求。控制线程调用proxy请求返回一个future,阻塞等待future。Communicator的clientThreadPool负责Reactor,收到请求的response后就向future发信号,从而唤醒这个response对应的future阻塞住的控制线程。这种情况下使用ORB对象代理请求的线程与网络Reactor线程池独立,负责Reactor的LF线程池不会被其它逻辑影响。但是在LF线程池中进行ORB对象代理请求呢?问题就来了。你的LF线程池随时都可能瘫痪掉,只要你不小心。极端地,LF线程池只有一个线程,这个线程在Process事件时,进行了ORB对象代理请求,阻塞等待future。Good Job!! 这个线程池中唯一的线程就永远不会再有机会成为Leader去取出远端的response的IO事件,去唤醒这个阻塞住线程的future了。这还不容易解决,都说是线程池,那会只有一个线程的呢。我们让这个LF线程池添加到两个线程,第一个线程取出事件唤醒第二个线程,然后自己处理事件时,进行了ORB对象代理请求,阻塞等待future;第二个线程成为Leader阻塞在多路IO分离函数,并在远端response到来时,从分离函数返回,得以唤醒了阻塞第一个线程的future。但是很不幸,第二个线程在等待到response到来之前,收到其它IO事件,而处理这个事件却进行了ORB对象代理请求,阻塞等待future。汗,LF线程池都被阻塞在future,future又等待IO事件。再往下演绎,不论LF线程池有多少线程,只要你的处理逻辑中进行了同步阻塞的ORB对象代理请求,都会使你的Ice网络处理瘫痪,瘫痪的原因是LF线程池瘫痪了。Ice的Server端线程池默认就在当前线程进行请求的dispatch,如果你在实现你的服务的时候必须依赖其它ORB对象代理请求时,你就要小心了,你可能因为这样而阻塞掉所有Communicator的Server端LF线程池,至使网络Reactor瘫痪。如果你使用了bidirection connection来提供callback的饲服,要是你在callback的实现中依赖了其它ORB对象代理请求时,你同样也要小心了,你可能因为这样而阻塞掉所有Communicator的Client端LF线程池,至使网络Reactor瘫痪。Ice为了避免,会默认为每个连接加上一个计时器,让连接自动断开。但是我们还是有应用场合希望连接长九不断开,关闭这种机制,这时就要小心了。再者就是,即使你所有的ORB对象请求代理都用异步方式(ami,amd)进行编程,但是悲剧的是你无法干涉到你依赖的其它人函数没有进行同步阻塞的ORB对象代理请求。

转载于:https://www.cnblogs.com/bbqzsl/p/7462606.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html表格统计表,jQuery操作表格(table)的常用方法、技巧汇总

以下列出13个jQuery操作table常用到的功能:1.鼠标移动行变色$(#table1 tr).hover(function(){$(this).children(td).addClass(hover)}, function(){$(this).children(td).removeClass(hover)});方法二:$("#table1 tr:gt(0)").hover(function()…

收藏!中国卫星互联网产业发展白皮书

来源:网络传播杂志卫星互联网概念卫星互联网是基于卫星通信的互联网,通过发射一定数量的卫星形成规模组网,从而辐射全球,构建具备实时信息处理的大卫星系统,是一种能够完成向地面和空中终端提供宽带互联网接入等通信服…

数学在计算机科学上的应用文献,数学计算机论文,关于计算机在数学教学中的应用相关参考文献资料-免费论文范文...

导读:本文关于数学计算机论文范文,可以做为相关论文参考文献,与写作提纲思路参考。(新疆喀什地区塔什库尔干塔吉克自治县县中学数学教师 新疆喀什 845250)摘 要:人们在进入信息时代之后,计算机被广泛的应用在各个领域之中,教学中恰当的运用计算机,使很多知识都能清晰的展示在学…

输入流IS和输出流OS学习总结

1、我们编写的程序,除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界,比如我们编写的程序想读取一个文本文件, 又或者是我们想将程序的一些数据写到一个文件中,这时我们就…

Attention最新进展

来自 | 知乎 作者|sisiyou链接 | https://zhuanlan.zhihu.com/p/130388873编辑 | 深度学习这件小事公众号本文主要总结了最新的关于attention的应用文章。Attention-based Dropout Layer for Weakly Supervised Object Localization(CVPR19&#xff09…

SQL Server 2012从零开始学pdf

下载地址:网盘下载内容介绍编辑《SQL Server 2012从零开始学》面向sql server 2012初学者,以及广大数据库设计爱好者。全书内容注重实用,涉及面广,通俗易懂地介绍了sql server 2012数据库应用与开发的相关基础知识,提供…

苹果html抓包,苹果被开发者“抓包”违反了自己定的规则

原标题:苹果被开发者“抓包”违反了自己定的规则【PConline资讯】消息:苹果在本周的发布会上推出了AppleNews订阅服务,虽然咱们是用不到,但这项服务最近b被开发者抓到了“小辫子”,因为它违反了苹果自己定的规则。根据…

前沿科技 | 中科院科学家在视觉学习行为的神经机制研究中取得进展

来源:中国科学院6月3日,《自然-通讯》(Nature Communications)期刊在线发表了题为《眶额叶皮层通过调节初级视皮层的反应增益促进视觉偶联学习》的研究论文,该研究由中国科学院科学家团队——脑科学与智能技术卓越创新…

Selenium-几种操作

元素定位之后就要对它进行操作了,常见的集中操作如下: click()  点击元素  eg.输入内容后,点击操作 send_keys("内容")  模拟按键输入  eg:百度输入框,输入内容 clear()  清除元素的内容  eg:清除百度输入框的内容 submit()  提交表单  eg:driver.fi…

桌面图标设计里的计算机是灰色的,小技巧教您如何将Windows 10上的桌面图标设置中的回收站为灰色!...

如果Windows10的桌面图标设置窗口中的回收站选项显示为灰色,则可以查看本逐步指南以解决问题。这将帮助您取回“桌面图标设置”面板中的“回收站”选项,以便您可以在桌面上显示或隐藏回收站。如果错误或任何恶意软件,广告软件等将其禁用&…

人工智能算法的可解释性方法研究

来源:数学与人工智能摘要以深度学习为代表的人工智能技术在信息领域的应用,极大地提高了信息的利用效率和挖掘价值,深刻的影响了各领域的业务形态,同时也引发了监管部门和用户对这一新技术运用中出现的 “算法黑箱”问题关切和疑虑…

asp:dropdownlist如何去掉三角箭头_一棵悬崖三角枫的培养过程

更多精彩,请点击上方思齐盆景关注!▲2010年4月上图是2010年春天购买的三角枫素材。这棵三角枫过渡流畅,曲度自然。入手后开始培养枝条。▲2012年3月转眼间两年过去了,枝条的培养略见成效。翻盆时打算按照上图的角度种植&#xff0…

征服用计算机弹法,征服WIN7

与Windows XP以及Vista系统相比,WIN7自上市以来便备受好评。速度更快的内核、更加时尚的外观、更强大的功能……一切都标志着微软视窗系统的又一次全新升级。如今,新购置电脑的朋友基本都已经用上了预装的WIN7,但面对功能如此强大的操作系统&…

表单项介绍

1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title></title>6 </head>7 <body>8 <!-- 9 表单的作用就是用来将用户信息提交给服务器的10 …

云联惠身份认证需要多长时间_欧盟REACH认证需要多长时间【周期、费用、有效期】...

一、欧盟reach认证REACH是欧盟关于化学品注册&#xff0c;评估&#xff0c;授权和限制的法规&#xff0c;它于2007年6月1日生效&#xff0c;并用一个系统取代了许多欧洲指令和法规。二、申请REACH认证需要多长时间一般情况下&#xff0c;申请REACH认证需要5个工作日&#xff0c…

Nature Neuroscience|群际冲突的脑间同步机制

本文来源&#xff1a;”认知神经科学与学习国家重点实验室”官网编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7马燚娜课题组在《Nature Neuroscience》发表论文揭示群际冲突的脑间同步机制图片来源&#xff1a;《乌合之众——大众心理研究》插图个人一旦成为群体的一员&#…

计算机叫醒服务英语,关于酒店叫醒服务的英文口语

关于酒店叫醒服务的英文口语发布时间&#xff1a;2020-03-08春困秋乏夏打盹&#xff0c;睡不醒的冬三月……起床困难户小学妹今天要和大家聊聊使用酒店叫醒服务时会用到的实用口语。叫醒服务通常会用Morning call Service或是Wake-up call来表示&#xff0c;如果第二天有重要的…

一些常用的meta标签及其作用

声明文档使用的字符编码 <meta charsetutf-8>优先使用 IE 最新版本和 Chrome <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"/><meta name"wap-font-scale" content"no"> 页面描述 <meta name&q…

scala语言的底层是java实现的_2020了,每个程序员都该学习的 5 种开发语言

我曾在某处读到过&#xff08;可能在《代码大全》&#xff0c;但我不敢确定&#xff09;&#xff0c;程序员应该每年学习一门新的编程语言。但如果做不到&#xff0c;我建议&#xff0c;你至少学习以下 5 种开发语言&#xff0c;以便你在职业生涯有很好的表现。每个公司都喜爱精…

热议:大脑功能磁共振数据不可靠?杜克大学教授对自己15年的工作提出质疑...

来源&#xff1a;brainnews作者&#xff1a;brainnew创作团队杜克大学的研究人员对功能磁共振数据进行了重新测评&#xff0c;对自己15年的工作提出了质疑。脑部图像显示了不同的两天完成3个任务所对应的功能磁共振成像。图中&#xff0c;暖色显示一组人激活级别的一致性&#…