我是Erlang的新手,对hybrid memory model
非常感兴趣。我有几个问题。
message
? Erlang是否将自身的序列化对象或对象传递给共享内存堆? garbage collector
如何知道哪些邮件永远不会被使用,可以删除? 答案 0 :(得分:6)
我建议你阅读Joe Armstrong's Phd,在那里他详细解释了在撰写第一个Erlang实现时必须做出的各种设计决策的原因。
第25页解释了消息传递:
2.4.5消息传递
消息传递遵循以下规则:
- 假设消息传递是原子的,这意味着消息要么全部传递,要么根本不传递。
- 假定在一对进程之间传递消息是有意义的,这意味着如果发送和接收一系列消息 在任何一对进程之间,然后将收到消息 他们被发送的订单相同。
- 消息不应包含指向所包含数据结构的指针 在进程中 - 它们应该只包含常量和/或Pids。
醇>
回答上述问题的答案:
Erlang是一种函数式语言,它与对象无关。您可以在进程之间传递的唯一复合数据结构是tuples, maps and lists。 Erlang中没有共享状态,因此消息在进程之间复制。该副本实际上可以通过BEAM(Erlang虚拟机)将指针传递给共享内存片段来实现,但它是从Erlang本身隐藏的优化。并且在Erlang中也没有指针,因此无法访问一个进程'来自另一个过程的记忆'代码(甚至是故意的)。
所有数据结构与垃圾收集器相同 - 如果进程未引用数据,则可以从内存中删除它。当消息到达时,它会保留在进程收件箱中,因此它被引用。当它从收件箱中取出时,它会以与任何其他变量相同的方式由流程代码处理 - 如果它不再使用,则会被删除。