有很多关于如何使用erlang邮箱的信息,但很少找到纸张或文档描述如何在VM内部同时实现erlang实际访问邮箱。
据我了解,Erlang VM必须执行锁定或CAS操作以确保消息完整性。在erlang帷幕背后是否有任何复杂的方法
答案 0 :(得分:6)
通过邮箱我假设你的意思是进程邮箱,插入一条消息。有趣的问题!
关于Erlang进程消息队列的锁定特性,有一些对话here:
只是好奇心:目前在发送消息时存在某种锁定。 有没有人试图实现无锁链表: http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf
或者我只是看错了地方,erts_smp_proc_lock已经存在 用这样的东西?
消息队列已经有了这种情况。拥有的过程 消息框有一个“内盒”,他有一个锁定和“外部 “所有发件人都在竞争。所以锁争用就在了 许多进程发送到“外部框”时队列的尾部 那个过程。邮箱所有者不关心它。
您可能会发现阅读BEAM process说明的实现。
简短回答:是的,锁定是在消息队列上完成的,但它很复杂并且经过优化可以减少调度程序线程之间的争用。
答案 1 :(得分:3)
有几个锁处理进程结构。关于发送消息最重要的是MSGQ锁定和MAIN锁定。 MAIN锁是在操作时锁定结构字段的锁 - 其中一个字段是传出队列。 MSGQ锁包含传入消息的链接列表。
因此,要发送消息,我们需要获取收件人MSGQ锁定并将消息从我们的队列(由MAIN保护)复制到另一个进程的传入消息队列。
注意这个发送操作的同步异常。进程不会互相阻塞! (大部分时间;)