Data structures Erlang在其收件箱中使用什么数据结构?
Erlang使用消息传递在进程之间进行通信。它如何处理并发传入的消息?所使用的数据结构是什么?您可以从签出erl_消息原语及其声明文件中获得一些信息 您可能也会发现这些线程非常有用(,),尽管我认为您的问题更多的是关于正在使用的数据结构 ERTS结构 erlang运行时系统(erts)为消息传递()的调度分配一个分段(链接)堆。可以找到崩塌碎裂结构 但是,每个进程也有一个非常简单的fifo队列结构,它们将消息从堆复制到该队列中以使用它们。队列的底层是一个链表,有一些机制可以绕过堆直接使用进程队列。有关那个家伙的更多信息,请参阅 最后,每个进程还具有一个堆栈(也实现为一个列表),其中放置接收中没有匹配模式的消息。这是一种存储可能很重要的消息的方法,但在收到另一条不同的消息之前,流程无法处理(匹配)。这就是erlang拥有如此强大的“热交换”机制的部分原因 并发消息传递语义Data structures Erlang在其收件箱中使用什么数据结构?,data-structures,erlang,Data Structures,Erlang,Erlang使用消息传递在进程之间进行通信。它如何处理并发传入的消息?所使用的数据结构是什么?您可以从签出erl_消息原语及其声明文件中获得一些信息 您可能也会发现这些线程非常有用(,),尽管我认为您的问题更多的是关于正在使用的数据结构 ERTS结构 erlang运行时系统(erts)为消息传递()的调度分配一个分段(链接)堆。可以找到崩塌碎裂结构 但是,每个进程也有一个非常简单的fifo队列结构,它们将消息从堆复制到该队列中以使用它们。队列的底层是一个链表,有一些机制可以绕过堆直接使用进程队列
在较高级别上,erts接收消息并将其放入堆中(除非明确告知不要),每个进程负责选择要复制到其自己的进程队列中的消息。据我所知,队列中当前的消息将在再次从堆中复制之前进行处理,但可能存在更多细微差别。处理收件箱由两个列表组成 主要的是一个fifo,其中存储所有传入消息,等待进程按照接收消息的确切顺序检查它们。第二个是堆栈,用于存储与给定接收语句中的任何子句都不匹配的消息 当进程执行receive语句时,它将尝试按照声明的顺序对receive的每个子句“模式匹配”第一条消息,直到出现第一个匹配为止
- 如果未找到匹配项,则将消息从fifo中删除并堆叠在第二个列表上,然后进程与下一条消息一起迭代(请注意,由于fifo为空或已达到其“减少配额”,进程执行可能同时暂停)
- 如果找到匹配项,则从fifo中删除消息,并将堆叠的消息按原始顺序恢复到fifo中
{request,write,Value,{}->…
成功,这意味着检查的消息是一个4元素元组,其第一和第二元素分别是原子request
和write
,其第三个元素成功地与变量值进行了模式匹配:这意味着如果先前未绑定该值,则该值将绑定到此元素,或者该值与该元素匹配,最后丢弃第四个元素。此操作完成后,无法检索原始消息