学习 skynet 时初次接触到 ActorModel 模型,始终觉得有必要从宏观上了解 ActorModel 的概念,所以以维基上这篇文章为参考,把文章中的部分内容翻译成中文,好让自己体会一下 ActorModel 一些概念。再次说明,请原谅我蛋疼的翻译。

ActorModel

在计算机科学中,actor 模型是并发计算中的一种数学模型,它把 "actors" 作为并发计算的通用原语:响应它接收到的消息,一个 actor 自己可以决定自己的事务,可以创建更多的 actors ,发送更多的消息,决定如何响应下一条接收到的消息。actor 模型在1973年被提出。actor 模型既被作为理念来实现并行计算的框架,也被作为并发系统实现的理论基础。

历史

根据 Carl Hewitt ,ActorModel 不像其他计算模型,它启蒙于物理(包括广义相对论和量子力学)。ActorModel 同时也受到一些编程语言的影响:Lisp ,Simula ,Smalltalk 的早些版本,以及 capability-based systems 和 packet switching 。由许多机器组成的大规模并行计算前景促进了 ActorModel 的发展。之后,通过多核架构实现的大规模并发的到来复兴了 ActorModel 。维基这一段下面接着介绍了哪些牛人做了关于 ActorModel 的事情。

基本概念

ActorModel 的哲学是一切皆 actor 。这和面向对象的哲学 "一起皆 object " 类似,而两者的不同之处是面向对象程序是顺序执行的,ActorModel 程序是天然并发执行的。

actor 是一个计算实体,actors 可以并发的处理他们接收到的消息:

  • 发送消息给其他的 actors 。
  • 创建其他的 actors 。
  • 决定如何响应接收到的消息。

以上这些行为并没有特地的执行循序,有可能并发执行。

解耦消息的发送者是 ActorModel 的基本前提,这样可以进行并发通信和控制通信协议。

消息的接收者通过 address(地址) 标识,有时叫 "mailing address" 。因此一个 actor 只能和它拥有地址的 actor 进行通信,地址可以从它接收到的消息获得,也可以是它创建一个 actor 获得了此 actor 的地址。

ActorModel 的特征是 actors 之间固有的并发计算、动态创建 actors 、消息中标识发送者地址以及 actors 之间仅仅通过无序的异步消息进行通信。

消息传递机制

消息传递机制是 ActorModel 很主要的一部分。

Unbounded nondeterminism controversy

毫无疑问,第一个并发程序是中断程序。中断程序的执行需要来自外部的信号(来自键盘的按键、来自网络的数据包等等)。因此当信号到达时,计算机会被中断转而去执行中断程序。

在20世纪60年代早期,中断被用来模拟多个程序在一个处理器上的并发执行。带有共享内存的并发引出了并发控制问题。起初,这个问题被猜测是单台电脑上的相互互斥问题之一。之后在1971年和1973年之间,Edsger Dijkstra 提出了 semaphores 。Tony Hoare 和 Per Brinch Hansen 提出了 monitors 用来解决相互互斥问题。然而这些解决方案都没有提供程序语言上访问共享资源的支持。这种支持之后几年也被完成。

维基下面说明了 bounded nondeterminism 理论和 unbounded nondeterminism 理论。好多专业词汇,不懂翻译,所以就看看就好了。

Direct communication and asynchrony

ActorModel 不一定要缓存消息。没有消息的缓存在 ActorModel 发展时期引发了很多误解,到现在还是一个争论的话题。一些研究者认为消息应该缓存,而且消息应该像 IP 报文那样简单的发送,没有必要与接收者进行同步的握手(假设 A 要给 B 发送消息,这句话应该是指 A 直接发送消息给 B 就好,没有必要先发送握手消息到 B 告诉它我要给你发送消息,然后 B 返回告知 A 可以发送,最后 A 才发送真正的消息给 B )。

Actor creation plus addresses in messages means variable topology

虽然 ActorModel 的发展逐渐允许消息本身带有地址。

有时需要发送消息到接收者并等待接收者返回结果。要想接收者能返回结果,可以让发送者在消息中带有发送者的地址,这样接收者便能返回结果。

actor 的创建以及消息中带有地址意味着 actors 之间有着变化的拓扑,就像 Simula 编程语言中,对象之间有着变化的拓扑。

最后

在 skynet 中,一个服务就是一个 actor ,每个服务自身都有一个消息队列。对于同一个服务消息是顺序执行的,对于不同的服务消息是并发执行的。每个服务都有一个唯一的 id 标识自己,通过这个 id 就可以给这个服务发送消息。skynet 是的运行是靠消息驱动的,worker 线程不断的从消息队列中取出消息然后调用相应服务的 callback 函数处理消息。详情参考 skynet 源码。

ActorModel 概念翻译的更多相关文章

  1. OVN架构翻译

    概述 ovn-controller是OVN在虚拟机上的agent,北向连接OVN的南向数据库,学习OVN的配置和状态,并使用虚拟机的状态来填充PN表以及Binding表的Chassis列:南向连接op ...

  2. C#的变迁史 - C# 1.0篇

    C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ...

  3. 说说lambda表达式与表达式树(未完)

    Lambda表达式可以转换成为代码(委托)或者数据(表达式树).若将其赋值给委托,则Lambda表达式将转换为IL代码:如果赋值给 Expression<TDelegate>,则构造出一颗 ...

  4. 领域驱动设计(DDD)实现之路

    2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱动设计(DDD)已经是8年后的事 ...

  5. Speex manul中文版

    Speex manul中文版   在VOIP的音频算法中,回音处理已经成为一个关系通话质量的主要问题. 回声的产生在IP网络主要有两种:1.声学回声2.电路回声 声学回声主要又分成以下几种:a ) 直 ...

  6. 领域驱动设计(DDD)

    领域驱动设计(DDD)实现之路 2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱 ...

  7. Vue.js 实战总结

    最近在某个项目中用到了Vue.js,从上手做开发到项目发布,一步步踩了不少坑.本文试图总结过去一个多月使用Vue.js中的一些经验,也算是一点心得体会吧,拿出来与大家分享,欢迎多多交流. Vue.js ...

  8. OpenGL教程(3)——第一个三角形

    我们已经学会了创建窗口,这一讲,我们将学习如何使用现代OpenGL画一个三角形.在开始写代码之前,我们需要先了解一些OpenGL概念.本文会很长,请大家做好心理准备~ 注:以下OpenGL概念翻译自h ...

  9. 基于Neutron的Kubernetes SDN实践经验之谈

    首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景. CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范.参数规 ...

随机推荐

  1. GroupBox与Panel控件

    1.GroupBox控件常常用于逻辑地组合一组控件,如RadioButton 及 CheckBox控件,显示一个框架,其上有一个标题. 2.Panel 可以包含多个控件,以便将这些控件编为一组,以便方 ...

  2. HDU 2255 奔小康赚大钱 KM裸题

    #include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; ...

  3. 《C专家编程》数组和指针并不同--多维数组

    <C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...

  4. 如何创建RESTFul Web服务

    想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的. 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定 ...

  5. caffe2--------ImportError: No module named past.builtins

    whale@sea:~/anaconda2/lib/python2.7/site-packages$ python Python 2.7.14 |Anaconda custom (64-bit)| ( ...

  6. 简单的js表单验证框架

    /** * 通常在我们的HTML页面表单中有大量的数据验证工作, * 免不了要写很多验证表单的js代码,这是一项非常繁琐 * 枯燥的工作.很多程序员也会经常遗漏这项工作.当然 * 一些JavaEE框架 ...

  7. servletRequest 常用操作

    package request; import java.io.IOException;import javax.servlet.ServletException;import javax.servl ...

  8. SkipList跳表(一)基本原理

    一直听说跳表这个数据结构,说要学一下的,懒癌犯了,是该治治了 为什么选择跳表 目前经常使用的平衡数据结构有:B树.红黑树,AVL树,Splay Tree(这个树好像还没有听说过),Treep(也没有听 ...

  9. 【转】【Pycharm大全】

    感谢:陈俊岭的程序员之路 [Pycharm大全]:http://blog.csdn.net/u013088062/article/details/50388329

  10. 查看SELinux状态并关闭SELinux

    SELinux(Security-Enhanced Linux)是Linux上最杰出的新安全子系统.在linux内核级别上提供了一个灵活的强制访问控制系统(MAC),这个强制访问控制系统是建立在自由访 ...