有很多关于如何使用Erlang邮箱的信息,但很少有文章或文档描述Erlang在VM内部如何同时访问邮箱。
据我所知,Erlang VM必须进行锁定或CAS操作以确保消息的完整性。是否有一种复杂的方法在Erlang背后的幕布中?
有很多关于如何使用Erlang邮箱的信息,但很少有文章或文档描述Erlang在VM内部如何同时访问邮箱。
据我所知,Erlang VM必须进行锁定或CAS操作以确保消息的完整性。是否有一种复杂的方法在Erlang背后的幕布中?
通过“邮箱”,我假设你指的是进程邮箱,即插入消息的邮箱。有趣的问题!
关于Erlang进程消息队列的锁定特性,这里有一些讨论here:
你可能会发现阅读BEAM进程的实现很有启示性。只是好奇:当前在发送消息时有一些锁。 有人尝试过实现无锁链接列表吗: http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf
或者我看错了地方,erts_smp_proc_lock已经使用这样的东西了?
消息队列已经有了这个功能,有点像。拥有邮箱的进程有一个“内部邮箱”,他对其拥有锁,而所有的发件人都竞争一个“外部邮箱”。因此,当许多进程发送消息到该进程时,“外部邮箱”队列尾端的锁争用会很大。然而,邮箱所有者并不关心它。
有几个锁可以处理进程结构。最重要的是关于发送消息的MSGQ锁和MAIN锁。当它处于操作状态时,MAIN锁会锁定结构的字段,其中一个字段是输出队列。MSGQ锁覆盖了传入消息的链表。
因此,为了发送消息,我们需要获取收件人的MSGQ锁,并从我们的队列(由MAIN保护)复制消息到另一个进程的传入消息队列中。
请注意,此发送操作的异步性。进程不会相互阻塞!(大部分时间;)