先穿渔网袜从珠穆朗玛峰上滚下来哭求CSDN的大大们看一下CSDN博客插件不能自动上传图片和排版的问题。人肉上传图片和排版真地很痛苦呐!
不知道长达半年的疯狂加班是否损害了自己的心理健康。回顾过去几个月,似乎除了工作嘛都没干。人仿佛颓了,觉得时光了无意义地飞逝,过去半年的泰半记忆好像盛夏阳光里的冰块,蒸发得不剩一丝水汽。幸好不是全无亮点,比如看到好朋友幸福无比地结婚。中学好友到家里盘桓月余,也是一大快事。Steve McConnell在Rapid Development里的案例分析里提到death march之后程序员往往大批离开。想不到这次亲自体会了一把,人生又完整了一点。过去几周一系列戏剧性的事件让我仔细思考了一下激励团队士气的问题,也算小小的收获。
跑题了。本来想说什么来着?对了,图灵奖和模型检验。2007年的图灵奖授予Edmund M. Clarke, E. Allen Emerson, and Joseph Sifakis,表彰他们在模型验证方面做出的开创性贡献。前段时间白天忙项目,晚上改简和历准备面试,也就没有心情八卦。刘江老师在他的博客里做了详细介绍,在这里推荐一下。关于几位大牛,俺没有什么补充的,就八卦一下他们的研究方向:模型检验。
模型检验是计算机科学理论与实践结合的经典范例,背后也有一段跌宕起伏、绝处逢生的历史。八卦这段历史前,我们得知道什么是模型验证,以及为什么它为什么重要到能得图灵奖。在CS理论里,一个模型就是一个数学结构,比如有向图,或者状态机。我们往往希望知道一个结构是否符合一定的性质。这些性质可以用逻辑公式表达。比如下面的有向图G(V, E)里,V代表所有节点的集合,{A, B, C, D, E}, 而E代表所有路径的集合{(A, B), (B, C), (D, C), (B, D), (D, B), (E, D), (B, E)}。如果如果我们想验证G里没有从A到C的直接路径,但有经过一个节点的间接路径,就可以验证下面这个公式在G里面为真。
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter" />
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0" />
<v:f eqn="sum @0 1 0" />
<v:f eqn="sum 0 0 @1" />
<v:f eqn="prod @2 1 2" />
<v:f eqn="prod @3 21600 pixelWidth" />
<v:f eqn="prod @3 21600 pixelHeight" />
<v:f eqn="sum @0 0 1" />
<v:f eqn="prod @6 1 2" />
<v:f eqn="prod @7 21600 pixelWidth" />
<v:f eqn="sum @8 21600 0" />
<v:f eqn="prod @7 21600 pixelHeight" />
<v:f eqn="sum @10 21600 0" />
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
<o:lock v:ext="edit" aspectratio="t" />
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="\neg (A, C) \not \in E \;\wedge\; \exists v \in V((A, \:v) \in E \;\wedge\; (v, \:C) \in E)"
style='width:276pt;height:17.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.forkosh.dreamhost.com/mimetex.cgi?\neg%20(A,%20C)%20\not%20\in%20E%20\;\wedge\;%20\exists%20v%20\in%20V((A,%20\:v)%20\in%20E%20\;\wedge\;%20(v,%20\:C)%20\in%20E)" />
</v:shape></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">这项公式显然为真,因为</span>G<span lang="ZH-CN" style="FONT-FAMILY: 宋体">里有路径</span>A->B->C<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,但没有路径</span>A->C<span lang="ZH-CN" style="FONT-FAMILY: 宋体">。</span><o:p></o:p></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">而所谓模型验证,就是自动检验一个结构是否符合给定的一套公式。由于我们通常用有限状态并行系统来描述硬件或软件设计,所以当我们谈到模型检验,通常指验证有限状态并行系统的自动方法。</span></p>
<p class="MsoNormal"><o:p> <a href="http://www.faculty.ucr.edu/.../nettext/Figure7_11.jpg"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/g9yuayon/Snap2.jpg" /></a></o:p></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">当然了,在俺这样的俗人看来,天下花哨的技术千千万,俺们不懂的理论万万千。如果这套方法不能解决实际问题,也不过是牛人们书斋里自娱自乐的工具。有什么必要了解呢?</span><span lang="ZH-CN"> </span><span lang="ZH-CN" style="FONT-FAMILY: 宋体">幸好,我们搭建的系统总可以抽象成某种模型。</span>Intel CPU<span lang="ZH-CN" style="FONT-FAMILY: 宋体">指令解码器的模型是有限状态自动机。操作系统的驱动程序也可以抽象为有限自动状态机。因此,我们可以用模型检验的方法确定软硬件的设计或实现是否符合需求,正确运行。正是因为模型验证老大们的卓绝努力,模型验证在工业界逐渐枝繁叶茂。</span>Intel<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,</span>Motorola<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,</span>NASA<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,</span>IBM<span lang="ZH-CN" style="FONT-FAMILY: 宋体">这些设计高性能硬件的公司都雇佣大票模型验证的专家验证他们的硬件设计。微软研究院也有一流的模型验证团队。他们开发的</span><a href="http://research.microsoft.com/slam/">SLAM</a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">在侦测驱动程序错误方面颇有斩获。</span>Cadence<span lang="ZH-CN" style="FONT-FAMILY: 宋体">出品的</span>VLSI CAD<span lang="ZH-CN" style="FONT-FAMILY: 宋体">软件里也加入了模型验证模块。更重要的是,模型验证的研究切合几个世纪以来我们不懈追求的高远目标:自动实现人类的推理过程。当年笛卡尔发明解析几何后,就意识到几何证明能被机械自动处理。莱布尼兹更指定了长达</span><strong><span lang="ZH-CN" style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">三个世纪</span></strong><span lang="ZH-CN" style="FONT-FAMILY: 宋体">的计划,设计一种特征语言</span>(lingua characteristica)<span lang="ZH-CN" style="FONT-FAMILY: 宋体">和相应的计算系统</span>(calculus ratiocinator)<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,用来支持对所有数学,甚至所有人类思维方式的自动化处理。端的是雄心万丈啊。程序员们终生追求的,不也是自动化这坨目标么?电脑解放左脑。电路取代人肉。既然计算代数能搞定级数求和、多元积分,</span><!--[if gte vml 1]><v:shape
id="_x0000_i1027" type="#_x0000_t75" style='width:36.75pt;height:15pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image004.png"
o:title="" />
</v:shape><span lang="ZH-CN" style="FONT-FAMILY: 宋体">Tex能灭掉琐碎的排版,内存管理能让我们不再手工确定内存和虚拟内存的分配,编译器能免去大量底层代码的优化,数据挖掘能告诉</span>Seven Eleven<span lang="ZH-CN" style="FONT-FAMILY: 宋体">要把尿布和啤酒放在同一货架,机器学习能比执业有年的医生更准确地根据脑部扫描侦测老年痴呆,我们又为什么必须花上大量时间手工确定程序没有死锁,没有资源泄露,或者没有与需求冲突的地方呢?</span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">在自动验证程序正确性之前,得先知道如何证明程序的正确性。好比我们得先知道怎么下象棋,才能编写象棋的</span>AI<span lang="ZH-CN" style="FONT-FAMILY: 宋体">。最早研究程序正确性的先驱是被英国政府折磨得</span><a href="http://en.wikipedia.org/wiki/Alan_Turing#Prosecution_for_homosexual_acts_and_Turing.27s_death"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">慷慨赴死</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">的</span><a href="http://www.turing.org.uk/turing/">Alan Turing</a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">。既然</span><a href="http://blog.csdn.net/g9yuayon/archive/2007/03/10/1525865.aspx"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">发明了图灵机</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">,又</span><a href="http://blog.csdn.net/pongba/archive/2006/03/11/621723.aspx"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">证明了停机定理</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">,难免想利用自己的理论机器来证明程序的正确性。于是</span>1949<span lang="ZH-CN" style="FONT-FAMILY: 宋体">年,</span>ENIAC<span lang="ZH-CN" style="FONT-FAMILY: 宋体">诞生</span>3<span lang="ZH-CN" style="FONT-FAMILY: 宋体">年后,论文</span><a href="http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/mags/an/&toc=comp/mags/an/1984/02/a2toc.xml&DOI=10.1109/MAHC.1984.10017">An Early Program Proof</a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">问世乐(这篇文章原名叫</span>Checking a Large Routine<span lang="ZH-CN" style="FONT-FAMILY: 宋体">,后来在</span>1984<span lang="ZH-CN" style="FONT-FAMILY: 宋体">年再版时改了题目)。图灵在里面提出了被</span>Dijkstra<span lang="ZH-CN" style="FONT-FAMILY: 宋体">和</span>Tony Hoare<span lang="ZH-CN" style="FONT-FAMILY: 宋体">发扬光大的断言(</span>assertion<span lang="ZH-CN" style="FONT-FAMILY: 宋体">)方法:可以通过证明程序里一系列断言的正确性来证明一个程序的正确性。现在插播一条广告:美国加强版谭浩强,</span>Programming Windows<span lang="ZH-CN" style="FONT-FAMILY: 宋体">和</span>Code<span lang="ZH-CN" style="FONT-FAMILY: 宋体">的作者</span>Charles Pezold<span lang="ZH-CN" style="FONT-FAMILY: 宋体">爷爷,</span><a href="http://www.charlespetzold.com/blog/2008/02/Mr-Turings-Computing-Machine.html"><span lang="ZH-CN" style="FONT-FAMILY: 宋体">马上要出版酝酿了将近</span>10<span lang="ZH-CN" style="FONT-FAMILY: 宋体">年的新书</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">,</span><a href="http://www.amazon.com/Annotated-Turing-Charles-Petzold/dp/0470229055">The Annotated Turing</a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">乐。</span>Amazon<span lang="ZH-CN" style="FONT-FAMILY: 宋体">上的推出日期是今年</span>6<span lang="ZH-CN" style="FONT-FAMILY: 宋体">月</span>10<span lang="ZH-CN" style="FONT-FAMILY: 宋体">号。</span>Pezold<span lang="ZH-CN" style="FONT-FAMILY: 宋体">从详尽注释图灵</span><a href="http://www.abelard.org/turpap2/tp2-ie.asp">1936<span lang="ZH-CN" style="FONT-FAMILY: 宋体">年划时代的论文</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">入手,引导我们这样的普通程序员深入理解图灵机的前世今生。有兴趣的老大欢迎预购。</span></p>
<p class="MsoNormal">Tony Hoare<span lang="ZH-CN" style="FONT-FAMILY: 宋体">进一步提出了现在离散数学入门课必教的</span><a href="http://en.wikipedia.org/wiki/Hoare_logic"><span style="COLOR: windowtext; TEXT-DECORATION: none">Hoare Logic</span></a><span lang="ZH-CN" style="FONT-FAMILY: 宋体">。比如证明循环正确的套路:</span><span lang="EN"><!--[endif]-->
简单解释一下:
-
这种式子叫Tableau。如果分数线上的式子成立,则推断分数线下的式子也成立。
- {P . B} S {P}即Hoare三段式(Hoare Triple),意思是如果条件P和B在程序S执行前为真,且程序S运行中止,那么条件P在S结束运行后依然为真。
- {P} while B do S done {×B . P}的意思是如果P在执行while循环前成立,且循环while B do S done能退出,那么循环退出后B不再为真,而P依然为真。这里的P有坨专门称呼:循环不变量,loop invariant。B也有个诨名,循环护卫,loop guard。
-
从这个式子可以看出,要证明一段循环的结果正确,我们只需找出循环不变量P,然后再证明两件事:这段循环可以结束,也就是loop guard能从真值最终变为假,而不变量P一直为真。
不过,验证程序的思想并没有兴盛起来。原因挺简单:用基于演绎的方法从基本的定理出发证明整个程序也忒难了。仅仅是找到合适的不变量就足以让我等凡人抓狂。Dijkstra一辈子都呼吁编程应像推导数学定理一样严谨,否则遗患无穷。可总不能要求人人都是戴爷爷级别的牛人吧?何况就算戴爷爷,只怕也难证明几千行的驱动程序没有死锁。一直到70年代,程序证明在工业界也没有什么真正的影响。当然这不是说系统验证这门学科失去活力。事实上当时Tony Hoare,E.W., Dijkstra,E.A. Ashcroft, David Gries,Robert Floyd等一票大牛们在形式理论上突飞猛进,深入研究了程序的公理化证明,并行程序的断言证明,程序的推导和不可确定性等一系列课题。自动定理证明也做得有声有色。这些东西为日后花样繁多的自动程序验证奠定了基础。
眼见实践方面山穷水尽,以色列的Amir Pnueli 从澡盆里跳出来了:解决问题之道不在完美方案,而在确定可以解决的问题,以及合适的切入角度。有时候放弃是福。好比当年Multics的老大硬要用几十页汇编自动解决context switching时的PC-losering问题,结果搞得代码维护异常困难。但Dennis Ritche为了实现的简单,干脆放弃自动维护,把这个问题交给程序员。以后的故事就是历史乐。验证任意系统的正确性太难,就验证状态有限的reactive系统嘛。各式硬件和嵌入系统可都是reactive系统。好像用有限状态机也能完善地描述。既然验证整个程序太难,就验证程序的某些特性嘛。大家都觉得测试比证明省钱,我们就专挑测试搞不定的方面嘛。关键数据会溢出么?浮点计算会出错么?安全协议有漏洞么?关键数据会被破坏么?每条进程都能在规定时间内被执行么?这些好像应用面挺广,也能用逻辑公式相对容易地描述。测试单写多读的玩具并行程序当然比证明简单。但是发现1962年让Mariner I Space Probe坠毁大西洋的计算错误呢?1986年让Therac-25过量辐射X射线致死病人的错误呢?1995年导致Intel大规模回收芯片的浮点错误呢?1996年导致阿里亚娜5号火箭坠毁的整数溢出错误呢?
系统的状态随时间而变,更不必说并发系统的状态同程序执行的时机紧密相连。当我们开始研究程序的行为,而不仅是程序的输入输出时,就不可避免同时间打交道。因此,我们需要一套全新的工具,不仅能简洁地描述系统的时态,还不用陷入对具体时间的琐碎处理。目光锐利的Pnuelli看上了时序逻辑。于是1977年,开创性的论文,Temporal Logics of Programs(程序的时序逻辑),问世乐。Pnuelli在论文里提出用时序逻辑证明程序的正确性。时序逻辑历史悠久,亚里士多德就对一阶二元谓词逻辑做过不少研究。它的关键思想是把时间看作一系列离散的状态。状态间的传递等同于时间的延续。Pnuelli提出的是线性时序逻辑(Linear Temporal Logic, LTL)。LTL在一阶命题逻辑的基础上引入了几坨与时间有关的操作符。
抛开命题逻辑的黑话,我们每天都用到命题逻辑,无非就是把逻辑陈述用逻辑操作符连接起来。下面的例子是一坨命题表达式:×(i > 0 . i < 10) 其中i>0和i<10是陈述(statement),符号×是操作符逻辑非,相当于C里的!,中间的.是逻辑与的操作符,相当于C里的&&。命题逻辑的局限在于它导出的真相一成不变。比如在华为这个世界里(黑话叫model或者domain或者world,看你怎么归类了),陈述“加班就是好”永远是对的,不管是项目吃紧的时候,还是项目符合进度的时候,哪怕有人累死,有人宁愿跳楼也不跳槽,有人写出2000行的函数,有人连熬几十小时后回家睡觉也算旷工,这个陈述都为真。那我们要表达“总有某个时候,加班不好”就没辄了。为了解决这个问题,LTL就在命题逻辑的基础上加入了时序操作符:
- G:表示永远为真。比如G(i < 0)表示i在任意时间都小于0。
- F:表示最终为真。比如F(i < 0)表示i在某个时间一定小于0(但现在不一定小于0)。
- X:表示下一个时刻为真。比如X(i < 0)表示时钟跳到下一个时刻,i就必须小于0。
- U:表示直到某刻前一直为真。比如(i < 0) U (j < 0)表示i一直小于0,直到j变得小于0。
- R:表示到了某刻才为真。比如(i < 0) R (j < 0)表示j 一直小于0,直到某个时刻i变得小于0。
其实{G, F, X}中任取一个,{U,R}中任取一个,就足以构成完备的LTL操作符。有兴趣的老大可以自行证明。有了这些操作符,我们就可以方便地描述系统的时态性质了。这里列举几个LTL模式库里的例子(是滴,LTL Properties Specification Patterns, 谁说搞理论的老大们不与时俱进来着?
例1:
当系统发出打开网络连接的请求后,如果遇到网络错误,必须弹出一段错误信息。我们用OpeningNetworkConnection表示网络连接的请求已经发出,用NetworkError表示网络错误被返回,而ErrorMessage表示弹出错误信息。
公式是:G(OpenNetworkConnection->G(NetworkError-> F(ErrorMessage)))
我们从内向外分析:
-
NetworkError -> F(ErrorMessage)表示如果NetworError为真,那么ErrorMessage最终一定会为真。也就是说网络错误发生后,一定会在未来某个时候出现错误信息。
-
G(NetworkError -> F(ErrorMessage))则表示1.陈述的性质在任何时候都要成立。
-
OpenNetworkConnection –> G(NetworkError-> F(ErrorMessage))进一步说明,当网络连接打开后,我们可以肯定2.的陈述总是为真。
-
最后,G(OpenNetworkConnection->G(NetworkError-> F(ErrorMessage)))说明3.里的陈述在任何时刻都为真。
例2:
很多系统里都需要调度任务。对任意任务,我们要求把任务加入调度表前,不应该从调度表里取消该任务。我们用register表示加入任务,用unregister表示取消任务,那么公式可以写作F(register) -> (!unregister U register),意思是如果任务最终被加入调度表,我们可以推知该任务从未在加入调度表前被取消过。
虽说时序逻辑让Pnuelli得了1996年的图灵奖,工业界仍然波澜不惊。这大概是因为用时序逻辑证明程序性质依然属于从基本定理出发的演绎,难度依然太大,代价依然高昂。证明之于程序员,好比汇编之于DBA。申明式编程才是王道。我们希望给出系统的设计或实现,描述一些性质,剩下的便交给程序,让程序判断系统是否满足这些性质。如果不满足,则给出反例,以便排错。而这,正是模型验证做的事。
我们已经知道系统的性质可以用时序逻辑描述。现在还缺的,就是合适的模型,以及相配的算法。
分享到:
相关推荐
Uppaal是一款强大的工具,主要用于实时系统的形式验证,它结合了模型检查和仿真技术。在这个模型中,我们关注的是"Uppaal的GossipGirl模型",这是一个基于布尔逻辑实现的例子。Gossip Girl,通常指的是一种社会现象...
【标题】"基于PHP的仿秀色猎奇八卦门户网.zip"揭示了这个项目的核心是构建一个使用PHP语言开发的在线平台,旨在模仿秀色猎奇八卦门户网站的功能和用户体验。PHP是一种广泛使用的开源服务器端脚本语言,特别适合于Web...
在本实例中,我们关注的是一个基于PHP编程语言开发的项目源码——"PHP实例开发源码——php仿秀色猎奇八卦门户网"。这个项目可能是为了教学目的或者实战练习而创建的,旨在模拟类似秀色猎奇八卦门户网这样的网站功能...
SharePoint对象模型的Fluent API语法。 简化的API使用(REST,CSOM,SOAP)。 SharePoint感知的嵌入式功能(重试,标头预设,错误处理)。 支持的SharePoint版本 SharePoint Online(SPO) 本地(2019/2016/2013...
在训练模型时,通常会采用交叉验证、网格搜索等技术来优化超参数,提高模型性能。评估指标则可能包括准确率、召回率、F1分数等,以全面衡量模型在各个类别的表现。此外,为了避免过拟合,可以使用正则化、dropout、...
在研究论文的其他部分,应该还会有对算法的详细描述、数学模型的建立、理论证明、仿真模拟以及实验结果的展示和分析。这些内容将帮助读者更深入地理解算法在实际应用中的性能表现和效果,从而评估其在实际工程应用中...
- **官方排名对比**:将基于所选指标得出的排名与官方网站的排名进行比较,验证模型的有效性和准确性。 #### 三、理想制作团队构建 **1. 数据来源** - **数据获取**:利用网络爬虫技术从互联网上搜集数据,如点击...
这些资料可能涵盖了数学公式、物理模型、模拟结果等,用于描述和验证"TimeWaveZero"理论的核心概念。如果能够解读这些文件,我们可以更深入地了解这个理论是如何运作的,以及它是如何通过《易经》的64卦来表达和推演...
每个模型类通常对应数据库中的一个表,类的属性映射到表的列,而类的方法则处理数据的验证、计算和其他业务规则。 **视图(View)** 视图是用户看到和与之交互的界面部分。在Ruby on Rails中,视图通常由HTML、CSS...
例如,通过训练文本分类模型来识别热点话题相关的文本,或者使用主题模型(如LDA)来提取潜在的主题。国外的研究在这方面起步较早,技术较为成熟;而国内虽然起步稍晚,但近年来取得了显著的进步,尤其是在中文语料...
4. **事件驱动编程**:易语言采用事件驱动编程模型,用户与界面交互的每个动作(如点击按钮)都会触发相应的事件,事件处理函数负责执行相关的业务逻辑。 5. **错误处理**:为了提高软件的稳定性,易语言算命器应该...
3. **分类模块**:论坛通常会按话题类型进行分类,如技术讨论、娱乐八卦等,方便用户查找和发布相关内容。 4. **搜索模块**:提供关键词搜索功能,让用户快速找到感兴趣的主题和帖子。 5. **权限模块**:根据用户...
它采用了一种混合的Gossip和Topic-based PubSub模型,确保了消息的高效、可靠传播,并具备防止恶意攻击的能力。 在Gossipsub中,节点通过libp2p库互相连接,形成一个网络。libp2p是一个模块化、可插拔的库,用于...
3. **模型验证**:确保请求和响应的数据结构符合预定义的规范。 **二、SpringBoot集成Swagger2** 要在SpringBoot项目中使用Swagger2,首先需要添加相关依赖。在`pom.xml`文件中引入Swagger2的依赖: ```xml ...
【物理学思想史和方法论】 物理学思想的历史可以追溯到古代,那时的探索者...随着科学的进步,这些古老的智慧逐渐被更精确的实验验证和数学模型所取代,但它们的影响仍然深深地烙印在现代科学的思维方式和理论体系中。
SWIM 是一种用于分布式系统中的组成员协议,它使用弱一致性模型,并且具有高度的可扩展性,能够处理数百个对等点。"Kompics" 是一个组件化并发系统编程框架,用 Java 语言编写,用于构建分布式系统。"通过 NAT 工作...