Erlang系统中,进程之间的通信是通过消息传递来完成的。消息使用Pid ! Message的形式发送,通过receive语句获取。每个Erlang进程都有用来存储传入消息的信箱。当一个消息发送的时候,它会从发送进程中拷贝到接收进程的信箱,并以它们到达的时间次序存储。消息的传递是异步的,一个发送进程不会在发送消息后被暂停。
上面提到发送消息时,会在两个进程之间存在消息复制,为什么需要复制呢?这就跟进程的堆内存有关。虽然在Erlang的文档(heap_type)中说明堆内存有三种类型:private,shared,hybrid,但是在实际的代码中,只有两种private和hybrid(参见[$R15B_OTP_SRC/erts/emulator/beam/erl_bif_info.c --> system_info_1]),不过hybrid的虚拟机是编译不出来的(参见[$R15B_OTP_SRC/erts/Makefile.in:# Until
hybrid is nofrag, don't build it.),也就是说Erlang目前的堆内存只有一种:private。
private类型的堆内存是跟shared类型相对的:shared是指所有线程共享同一块内存(比如Java),多个线程对同一块内存的访问需要锁保护;而private类型的堆内存是指每个进程独享一块内存,对于内存的访问不需要锁保护。
在Erlang的private堆内存架构下,发送消息需要做三件事件:
1)
计算消息的大小,并在接收进程的内存空间中给消息分配内存;
2)
将消息的内容拷贝到接收进程的堆内存中;
3)
最后将消息的地址添加到接收进程的消息队列。
从上面的步骤可以看出,拷贝消息的代码是O(n),n是消息的长度,也就是说消息越长,花费越大。所以在使用Erlang时,要避免大数据量的大消息传递。
在shared堆内存架构下,发送消息只需要O(1)(只传递消息地址),那为什么Erlang要默认选择private类型的堆内存呢?其实这跟后面要讲到的Erlang的GC相关:private的优势就是GC的延迟很低,可以很快的完成(因为只保存一个进程的数据,GC扫描时的数据量很小)。
在SMP环境下,实际上每个进程有两个消息队列。进程发送消息时,实际上消息是添加到目标进程的公有队列(通过锁来保证互斥访问);而目标进程在消费消息时,实际上是在自己的私有消息队列上处理的,从而减小锁带来的访问开销。但是,如果目标进程在自己的私有消息队列上无法匹配到消息,那么公有队列中的消息将被添加到私有队列。
下图是比较直观的说明了消息发送前后的进程数据的对比(其中PCB中包括进程的消息队列,指向堆中的具体消息)。
- 大小: 38.7 KB
分享到:
相关推荐
使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用...
erlang并发编程实战源代码erlang并发编程实战源代码
Erlang OTP并发编程实战高清非扫描版,基于一个simple cache深入浅出讲解erlang otp的使用。
erlang并发编程 .pdf
erlang并发编程,erlang之父Joe Armstrong得原著之一。
erlang otp学习文档 学习还不错的
gcm-erlang, 用于Google云消息传递的Erlang应用程序 gcm 软件提供了一个用于 Google Cloud Messaging的Erlang客户机。,你可以对 gcm-erlang做什么:你可以以使用 gcm-erlang:启动几个代表由不同 GCM API keys 定义...
二十多年来,在传统电信领域高并发、高可靠、高容错的严酷环境下,Erlang语言和OTP平台被锻炼得坚如磐石,浓郁的函数式特质更是恰到好处地弥补了传统命令式语言在并发编程上的固有缺陷,大大降低了构筑并发、容错、...
erlang并发编程中文翻译(cpie-cn).zip
书是讲述下一代编程语言Erlang ...本书将帮助读者在消息传递的基础上构建分布式的并发系统,免去锁与互斥技术的羁绊,使程序在多核CPU 上高效运行。本书讲述的各种设计方法和行为将成为设计容错与分布式系统中的利器。.
erlang文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 ...erlang 消息传递机制 文章地址:http://blog.csdn.net/mycwq/article/details/43115733
Erlang OTP并发编程实战(中文版).pdf,不可多得的好书。
《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...
erlang 入门书籍,与erlang程序设计相互认证着看,很不错
歧管:快速批消息在ErlangElixir的节点之间传递
● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang具有多种基本的...
[Manning Publications] Erlang OTP 并发编程实战 (英文版) [Manning Publications] Erlang and OTP in Action (E-Book) ☆ 出版信息:☆ [作者信息] Martin Logan, Eric Merritt, Richard Carlsson [出版机构] ...
Erlang/OTP并发编程实战 英文
erlang的timer和实现机制 Erlang程序设计