共享'消息的本质是什么?在Erlang?

时间:2016-03-31 15:49:31

标签: erlang

我是Erlang的新手,对hybrid memory model非常感兴趣。我有几个问题。

  1. 什么是message? Erlang是否将自身的序列化对象或对象传递给共享内存堆?
  2. 邮件是不可变的吗?
  3. 留言有地址吗?其他线程是否可以访问不属于它们的消息?
  4. garbage collector如何知道哪些邮件永远不会被使用,可以删除?

1 个答案:

答案 0 :(得分:6)

我建议你阅读Joe Armstrong's Phd,在那里他详细解释了在撰写第一个Erlang实现时必须做出的各种设计决策的原因。

第25页解释了消息传递:

  

2.4.5消息传递

     

消息传递遵循以下规则:

     
      
  1. 假设消息传递是原子的,这意味着消息要么全部传递,要么根本不传递。
  2.   
  3. 假定在一对进程之间传递消息是有意义的,这意味着如果发送和接收一系列消息   在任何一对进程之间,然后将收到消息   他们被发送的订单相同。
  4.   
  5. 消息不应包含指向所包含数据结构的指针   在进程中 - 它们应该只包含常量和/或Pids。
  6.   

回答上述问题的答案:

Erlang是一种函数式语言,它与对象无关。您可以在进程之间传递的唯一复合数据结构是tuples, maps and lists。 Erlang中没有共享状态,因此消息在进程之间复制。该副本实际上可以通过BEAM(Erlang虚拟机)将指针传递给共享内存片段来实现,但它是从Erlang本身隐藏的优化。并且在Erlang中也没有指针,因此无法访问一个进程'来自另一个过程的记忆'代码(甚至是故意的)。

所有数据结构与垃圾收集器相同 - 如果进程未引用数据,则可以从内存中删除它。当消息到达时,它会保留在进程收件箱中,因此它被引用。当它从收件箱中取出时,它会以与任何其他变量相同的方式由流程代码处理 - 如果它不再使用,则会被删除。