`
jzhihui
  • 浏览: 268134 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang并发机制 – 消息传递

阅读更多

Erlang系统中,进程之间的通信是通过消息传递来完成的。消息使用Pid ! Message的形式发送,通过receive语句获取。每个Erlang进程都有用来存储传入消息的信箱。当一个消息发送的时候,它会从发送进程中拷贝到接收进程的信箱,并以它们到达的时间次序存储。消息的传递是异步的,一个发送进程不会在发送消息后被暂停。

 

         上面提到发送消息时,会在两个进程之间存在消息复制,为什么需要复制呢?这就跟进程的堆内存有关。虽然在Erlang文档heap_type)中说明堆内存有三种类型:privatesharedhybrid,但是在实际的代码中,只有两种privatehybrid(参见[$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类型的堆内存是指每个进程独享一块内存,对于内存的访问不需要锁保护。

        

Erlangprivate堆内存架构下,发送消息需要做三件事件:

         1) 计算消息的大小,并在接收进程的内存空间中给消息分配内存;

         2) 将消息的内容拷贝到接收进程的堆内存中;

         3) 最后将消息的地址添加到接收进程的消息队列。

从上面的步骤可以看出,拷贝消息的代码是O(n)n是消息的长度,也就是说消息越长,花费越大。所以在使用Erlang时,要避免大数据量的大消息传递。

shared堆内存架构下,发送消息只需要O(1)(只传递消息地址),那为什么Erlang要默认选择private类型的堆内存呢?其实这跟后面要讲到的ErlangGC相关:private的优势就是GC的延迟很低,可以很快的完成(因为只保存一个进程的数据,GC扫描时的数据量很小)。

         SMP环境下,实际上每个进程有两个消息队列。进程发送消息时,实际上消息是添加到目标进程的公有队列(通过锁来保证互斥访问);而目标进程在消费消息时,实际上是在自己的私有消息队列上处理的,从而减小锁带来的访问开销。但是,如果目标进程在自己的私有消息队列上无法匹配到消息,那么公有队列中的消息将被添加到私有队列。

         下图是比较直观的说明了消息发送前后的进程数据的对比(其中PCB中包括进程的消息队列,指向堆中的具体消息)。

  • 大小: 38.7 KB
1
0
分享到:
评论
2 楼 jzhihui 2013-04-11  
AsIMovedon 写道
不错。最后一张图after send后为什么多出了一块三角形数据?


原来的消息共享子内容,发送到P2后不再共享
1 楼 AsIMovedon 2013-04-10  
不错。最后一张图after send后为什么多出了一块三角形数据?

相关推荐

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用...

    erlang并发编程 .pdf

    Erlang中的进程间通信模型简单而高效,通过消息传递来实现。同时,Erlang也支持客户端-服务端模型以及进程组的概念,允许开发者更灵活地组织和管理并发进程。 在分布式编程方面,Erlang提供了一套完整的分布式机制...

    erlang并发编程

    6. 分布式特性:Erlang的并发机制不仅限于单个节点,它也支持跨节点的并发。通过分布式Erlang,可以在多个物理机器上运行的节点间透明地进行进程通信,这对于构建可扩展的分布式系统非常有用。 7. OTP(Open ...

    erlang并发编程实战源代码

    erlang并发编程实战源代码erlang并发编程实战源代码

    erlang并发编程中文翻译(cpie-cn).zip

    Erlang的并发模型基于进程(processes),这些进程之间通过轻量级的消息传递进行通信,这种模型与传统的线程模型相比,提供了更好的隔离性和容错性。 1. 进程:在Erlang中,进程是独立执行的实体,每个进程都有自己...

    Erlang脚本在并发编程中的应用及其代码实现

    Erlang是一种专为并发和分布式系统设计的编程语言,它以轻量级进程、消息传递和强大的模式匹配机制而闻名。Erlang脚本在并发编程中的应用广泛,从简单的多进程通信到复杂的分布式系统构建,Erlang都能提供高效的解决...

    Erlang OTP并发编程实战(中文版)

    **Erlang OTP并发编程实战** 是一本专为开发者深入理解Erlang OTP并发机制而设计的实战指南。OTP(Open Telecom Platform)是Erlang编程语言的核心组件,提供了强大的并发处理能力和分布式系统构建框架。这本书以...

    Erlang并发编程 part1

    erlang并发编程,erlang之父Joe Armstrong得原著之一。

    ERLANGOTP并发编程实战清晰中文版

    erlang otp学习文档 学习还不错的

    gcm-erlang, 用于Google云消息传递的Erlang应用程序.zip

    gcm-erlang, 用于Google云消息传递的Erlang应用程序 gcm 软件提供了一个用于 Google Cloud Messaging的Erlang客户机。,你可以对 gcm-erlang做什么:你可以以使用 gcm-erlang:启动几个代表由不同 GCM API keys 定义...

    Erlang OTP并发编程实战 附书源码

    其并发模型基于轻量级进程(Lightweight Processes, LWP),这些进程间的通信通过消息传递实现,提供了天然的并行性和隔离性。OTP则是一套用于构建高效、可靠和可扩展的Erlang应用程序的框架和库。它包含了一组设计...

    erlang编程 Introducing Erlang

    Erlang的一大亮点是其内置的并发机制。它使用轻量级进程(Lightweight Processes, LWP)来实现并发,每个进程有自己的消息队列,通过消息传递进行通信。这种模型降低了同步的复杂性,提高了系统的可扩展性和容错性。...

    Erlang编程

    - 通过Erlang的并发模型和消息传递机制,可以模拟现实世界中的交互模式。 3. **Erlang的特性**: - **进程模型**:Erlang的进程不是传统操作系统中的进程,它更轻量级,一个Erlang虚拟机可以同时运行数千个进程。...

    歧管:快速批消息在ErlangElixir的节点之间传递

    在分布式系统设计中,消息传递是关键组成部分,特别是在Erlang和Elixir这样的并发和分布式编程语言中。本文将深入探讨“歧管”(Manifold)这一概念,它旨在优化Erlang和Elixir节点之间的批量消息传递,提高性能。 ...

    erlang的timer和实现机制

    Erlang的轻量级进程模型和消息传递机制为实现高效、可靠的定时器提供了基础。由于进程间的通信是异步的,因此定时器不会阻塞当前进程,提高了系统的整体性能。 在学习Erlang的timer模块时,还需要了解如何处理并发...

    erlang资源

    1. **并发模型**:Erlang的并发基于轻量级进程(Lightweight Processes, LSPs),这些进程间的通信通过消息传递实现,这与传统的线程模型不同,具有更好的隔离性和容错性。 2. ** OTP(Open Telecom Platform)**:...

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang ...本书将帮助读者在消息传递的基础上构建分布式的并发系统,免去锁与互斥技术的羁绊,使程序在多核CPU 上高效运行。本书讲述的各种设计方法和行为将成为设计容错与分布式系统中的利器。.

Global site tag (gtag.js) - Google Analytics