学习 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. [ 转]C++ 虚函数表解析

    http://blog.csdn.net/haoel/article/details/1948051 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子 ...

  2. Ruby on Rails 路由解析

    为了更好的阅读体验.欢迎訪问 作者博客原文 Route是什么 Rails中URL的约定严格基于RESTful风格的.client的请求事实上是在操作一些资源.同一资源的不同的请求动作(GET, POS ...

  3. ReactNative Navigator

    https://facebook.github.io/react-native/docs/navigator.html Navigator实现了页面之间的跳转. Demo描述:打开即进入“课程”页面, ...

  4. 深入理解Java 8 Lambda

    - 转载:blog1, blog2 以上两篇博客是对lambda表达式的深入理解,用于后续加深理解. 如下先从零开始理解lambda, 1. 接触lambda表达式是从python,javascrip ...

  5. 用汇编的角度剖析c++的virtual

    多态是c++的关键技术,背后的机制就是有一个虚函数表,那么这个虚函数表是如何存在的,又是如何工作的呢? 当然不用的编译器会有不同的实现机制,本文只剖析vs2015的实现. 单串继承 首先看一段简单的代 ...

  6. oracle函数中lead,lag,over,partition by 的使用

    lead,lag函数的分析 http://blog.csdn.net/mazongqiang/article/details/7621328 举例如下: SQL> select *  from ...

  7. Codeforces 309C Memory for Arrays 二进制模拟进位

    题目链接:点击打开链接 题意: 给定n个箱子m个物品 以下n个数字表示箱子的容量 以下m个数字b1-bm 表示物品体积为2^bi大 问最多有多少个物品能够放入箱子. 思路: 贪心,先放小的,小的不能放 ...

  8. 【Selenium + Python】之如何获取最新的报告以及os.path.getmtime与os.path.getctime的区别

    import os def new_file(test_dir): #列举test_dir目录下的所有文件(名),结果以列表形式返回. lists=os.listdir(test_dir) #sort ...

  9. erlang中通过ip和子网掩码,计算地址范围 【二进制和十进制的转换】

    在程序中,难免用的二进制和十进制之间的转换.遇到一个场景,通过ip和子网掩码,计算地址范围. 而地址范围为:网络地址+1—— 广播地址 -1 .  网络地址即ip和子网掩码的与的位运算.广播地址为:网 ...

  10. Kali安装OCI8 for metasploit Oracle login

    ps:安装了好久,最好才发现很简单,步骤记录下吧 遇到oracle爆破登录的时候OCI8报错,如下图 安装oracle 前面关于oracle client的安装就看官方文档吧 http://dev.m ...