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

Rud*_*koŭ 3 erlang

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

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

Gre*_*reg 6

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

消息传递在第25页说明:

2.4.5消息传递

消息传递遵循以下规则:

  1. 假设消息传递是原子的,这意味着消息要么全部传递,要么根本不传递.
  2. 假定在一对进程之间传递消息是有序的,这意味着如果在任何一对进程之间发送和接收消息序列,则将以与它们被发送的顺序相同的顺序接收消息.
  3. 消息不应包含指向进程中包含的数据结构的指针 - 它们应该只包含常量和/或Pids.

要回答上面没有回答的问题:

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

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