编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

35 | 并发中的编译技术(三):Erlang语言厉害在哪里?

Actor模型
并发中的编译技术

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
在前面两讲,我们讨论了各门语言支持的并发计算的模型。线程比进程更加轻量级,上下文切换成本更低;协程则比线程更加轻量级,在一台计算机中可以轻易启动几十万、上百万个并发任务。
但不论是线程模型、还是协程模型,当涉及到多个线程访问共享数据的时候,都会出现竞争问题,从而需要用到锁。锁会让其他需要访问该数据的线程等待,从而导致系统整体处理能力的降低。
并且,编程人员还要特别注意,避免出现死锁。比如,线程 A 持有了锁 x,并且想要获得锁 y;而线程 B 持有了锁 y,想要获得锁 x,结果这两个线程就会互相等待,谁也进行不下去。像数据库这样的系统,检测和消除死锁是一项重要的功能,以防止互相等待的线程越来越多,对数据库操作不响应,并最终崩溃掉。
既然使用锁这么麻烦,那在并发计算中,能否不使用锁呢?这就出现了 Actor 模型。那么,什么是 Actor 模型?为什么它可以不用锁就实现并发?这个并发模型有什么特点?需要编译技术做什么配合?
今天这一讲,我们就从这几个问题出发,一起学习并理解 Actor 模型。借此,我们也可以把用编译技术支持不同的并发模型的机制,理解得更深刻。
首先,我们看一下什么是 Actor 模型。

什么是 Actor 模型?

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Erlang语言以其独特的Actor模型在并发编程领域展现出强大的能力。Actor模型通过消息传递实现并发,避免了共享内存的竞争和锁机制的复杂性。文章介绍了Actor模型的工作原理,以及在实际场景中的应用。通过与面向对象编程的关联,读者可以更好地理解Actor模型的特点和优势。同时,文章也指出了采用Actor模型可能面临的数据复制和内存占用增加、异步编程模式等挑战。总的来说,Actor模型在并发编程中具有独特的优势,尤其适用于分布式云端应用的开发。 支持Actor模型的最有名的语言是Erlang。Erlang是爱立信公司发明的,它的正式版本是在1987年发布,其核心设计者是乔 · 阿姆斯特朗(Joe Armstrong),最早是用于开发电信领域的软件系统。在Erlang中,每个Actor叫作一个进程(Process)。Erlang有两个显著的优点:首先,对并发的支持非常好,所以它也被叫做面向并发的编程语言(COP)。第二,用Erlang可以编写高可靠性的软件,可以达到9个9。这两个优点都与Actor模式有关。由Actor构成的系统像一个生命体,每个Actor像一个细胞。细胞可以有新陈代谢,而生命体却一直存在。可以说,用Erlang编写的基于Actor模式的软件,非常好地体现了复杂系统的精髓。 除了Erlang以外,Scala语言也提供了对Actor的支持,它是通过Akka库实现的,运行在JVM上。微软的一个Orleans项目在.NET平台上支持Actor模式,并进一步做了一些有趣的创新。 在上一讲研究过协程的实现机制以后,我们现在再分析Actor的实现机制时,其实就应该会把握要点了。Erlang的运行机制,是基于一个寄存器机解释执行。这使得调度器可以在合适的时机,去停下某个Actor的运行,调度其他Actor过来运行。Erlang做抢占式调度的机制是对Reduction做计数,Reduction可以看作是占时不长的一小块工作量。如果某个Actor运行了比较多的Reduction,那就可以对它做调度,从而提供了软实时的能力。 Erlang的最底层,所有的I/O都是用事件驱动的方式来实现的。系统收到了一块数据,就调用应用来处理,整个过程都是非阻塞的。 基于Erlang,我们学习了Actor的运行时机制的两个重要特征:一是并发调度机制,二是内存管理机制。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 顾仲贤
    小骄傲一下,本人在WhatsApp工作,目前所有的Infra还是用Erlang搭建的微服务,很稳定。当初被Facebook收购时,只有不到30个engineer(Infra就更少了)来maintain1.4B的月活,这就是Erlang的厉害之处吧。

    作者回复: 有些有个性的公司,会故意使用比较小众的语言,来过滤出比较牛的工程师。我还知道有个公司用ocaml做开发,这样招聘到的就是真正喜欢函数式编程的工程师。 Erlang是如此。Erlang如果理解了它的精髓,翻过学习墙以后,会让工程师更省事。比如,函数式编程,消除了很多由于状态管理不善导致的问题等。算总账下来,使用Erlang这种语言更划算。 就像学技术,把编译原理、算法这些看似难的知识学会,其实总体来说更“划算”!

    2020-09-04
    14
  • gkkrjj
    这些技术之前都没接触过 是不是技术栈太浅了?

    作者回复: Erlang确实比较小众,不能怪你。 不过,很多技术没有被大众广泛使用,不代表它没有价值。我们现在复兴的一些技术,比如函数式编程,其实都有很久的历史了,只不过突然又遇到了让它能够体现出优势的时代需求。

    2020-11-13
    2
  • myrfy
    在仪器仪表领域很流行的labview虚拟仪器开发环境中,labview的运行时感觉就是一个actor模型,每个图标节点之间通过连线表示的通道传递数据

    作者回复: 感谢分享领域经验!学到了!

    2020-09-02
    2
  • minghu6
    这个东西在函数式编程风格的语言里很常见
    2021-06-20
  • walnut
    actor的消息队列也需要锁保护吧?
    2021-01-26
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部