Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures Erlang在其收件箱中使用什么数据结构?_Data Structures_Erlang - Fatal编程技术网

Data structures Erlang在其收件箱中使用什么数据结构?

Data structures Erlang在其收件箱中使用什么数据结构?,data-structures,erlang,Data Structures,Erlang,Erlang使用消息传递在进程之间进行通信。它如何处理并发传入的消息?所使用的数据结构是什么?您可以从签出erl_消息原语及其声明文件中获得一些信息 您可能也会发现这些线程非常有用(,),尽管我认为您的问题更多的是关于正在使用的数据结构 ERTS结构 erlang运行时系统(erts)为消息传递()的调度分配一个分段(链接)堆。可以找到崩塌碎裂结构 但是,每个进程也有一个非常简单的fifo队列结构,它们将消息从堆复制到该队列中以使用它们。队列的底层是一个链表,有一些机制可以绕过堆直接使用进程队列

Erlang使用消息传递在进程之间进行通信。它如何处理并发传入的消息?所使用的数据结构是什么?

您可以从签出erl_消息原语及其声明文件中获得一些信息

您可能也会发现这些线程非常有用(,),尽管我认为您的问题更多的是关于正在使用的数据结构

ERTS结构

erlang运行时系统(erts)为消息传递()的调度分配一个分段(链接)堆。可以找到崩塌碎裂结构

但是,每个进程也有一个非常简单的fifo队列结构,它们将消息从堆复制到该队列中以使用它们。队列的底层是一个链表,有一些机制可以绕过堆直接使用进程队列。有关那个家伙的更多信息,请参阅

最后,每个进程还具有一个堆栈(也实现为一个列表),其中放置接收中没有匹配模式的消息。这是一种存储可能很重要的消息的方法,但在收到另一条不同的消息之前,流程无法处理(匹配)。这就是erlang拥有如此强大的“热交换”机制的部分原因

并发消息传递语义


在较高级别上,erts接收消息并将其放入堆中(除非明确告知不要),每个进程负责选择要复制到其自己的进程队列中的消息。据我所知,队列中当前的消息将在再次从堆中复制之前进行处理,但可能存在更多细微差别。

处理收件箱由两个列表组成

主要的是一个fifo,其中存储所有传入消息,等待进程按照接收消息的确切顺序检查它们。第二个是堆栈,用于存储与给定接收语句中的任何子句都不匹配的消息

当进程执行receive语句时,它将尝试按照声明的顺序对receive的每个子句“模式匹配”第一条消息,直到出现第一个匹配为止

  • 如果未找到匹配项,则将消息从fifo中删除并堆叠在第二个列表上,然后进程与下一条消息一起迭代(请注意,由于fifo为空或已达到其“减少配额”,进程执行可能同时暂停)

  • 如果找到匹配项,则从fifo中删除消息,并将堆叠的消息按原始顺序恢复到fifo中

请注意,模式匹配过程包括将任何感兴趣的内容复制到过程变量中,例如,如果
{request,write,Value,{}->…
成功,这意味着检查的消息是一个4元素元组,其第一和第二元素分别是原子
request
write
,其第三个元素成功地与变量值进行了模式匹配:这意味着如果先前未绑定该值,则该值将绑定到此元素,或者该值与该元素匹配,最后丢弃第四个元素。此操作完成后,无法检索原始消息