Erlang进程如何并发访问邮箱

6

有很多关于如何使用Erlang邮箱的信息,但很少有文章或文档描述Erlang在VM内部如何同时访问邮箱。

据我所知,Erlang VM必须进行锁定或CAS操作以确保消息的完整性。是否有一种复杂的方法在Erlang背后的幕布中?


3
您知道每个 Erlang 进程只有一个邮箱吗?这大大减少了对全局锁的需求。 - rvirding
2个回答

7

通过“邮箱”,我假设你指的是进程邮箱,即插入消息的邮箱。有趣的问题!

关于Erlang进程消息队列的锁定特性,这里有一些讨论here:

只是好奇:当前在发送消息时有一些锁。 有人尝试过实现无锁链接列表吗: http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf

或者我看错了地方,erts_smp_proc_lock已经使用这样的东西了?

消息队列已经有了这个功能,有点像。拥有邮箱的进程有一个“内部邮箱”,他对其拥有锁,而所有的发件人都竞争一个“外部邮箱”。因此,当许多进程发送消息到该进程时,“外部邮箱”队列尾端的锁争用会很大。然而,邮箱所有者并不关心它。

你可能会发现阅读BEAM进程的实现很有启示性。
简短回答:是的,锁定是在消息队列上完成的,但它很复杂,并且经过优化以减少调度程序线程之间的争用。

1
如果我没记错的话,他们已经将向邮箱添加消息的操作减少到了两次写入。不知道他们是否仍然需要实际的锁定。 - rvirding

3

有几个锁可以处理进程结构。最重要的是关于发送消息的MSGQ锁和MAIN锁。当它处于操作状态时,MAIN锁会锁定结构的字段,其中一个字段是输出队列。MSGQ锁覆盖了传入消息的链表。

因此,为了发送消息,我们需要获取收件人的MSGQ锁,并从我们的队列(由MAIN保护)复制消息到另一个进程的传入消息队列中。

请注意,此发送操作的异步性。进程不会相互阻塞!(大部分时间;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接