首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang原子是如何工作的?

Erlang原子是如何工作的?
EN

Stack Overflow用户
提问于 2016-03-15 23:08:21
回答 2查看 1.8K关注 0票数 11

为了寻找关于细节的文档,我没有找到更多的细节:

  • 有一个(erlang运行时实例-)原子表。
  • 原子字符串文字只存储一次。
  • 原子只占一个单词。

对我来说,这给我留下了很多不清楚的东西。

  1. 原子字值是否总是相同的,独立于序列模块加载到运行时实例?如果模块A和B都定义/引用了一些原子,那么原子的值是否会随着会话的不同而改变,这取决于首先加载A还是B?
  2. 当匹配模块中的原子时,是否存在某种“原子字面值到原子值”的分辨率?模块是否有自己的模块-本地原子值查找表,在模块的加载时间被填充?
  3. 在分布式场景中,两个erlang运行时实例相互通信。有没有什么“同步原子表”的动作在进行?还是原子被串行化为字符串文字,而不是字?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-16 01:29:34

Atom只是VM维护的ID。ID的表示是底层体系结构的机器整数,例如32位系统上的4字节和64位系统上的8字节。请参阅LYSE book中的用法。

同一个正在运行的VM中的同一个原子总是映射到相同的ID (整数)。例如,以下元组:

代码语言:javascript
复制
{apple, pear, cherry, apple}

可以作为以下元组存储在实际的Erlang内存中:

代码语言:javascript
复制
{1, 2, 3, 1}

所有原子都存储在一个从不垃圾收集的大表中,也就是说,一旦在运行的VM中创建了一个原子,它就会一直保存在表中,直到VM被关闭。

回答你的问题:

1 . No.在VM运行之间,原子的ID将发生变化。如果关闭VM并重新加载上面的元组,系统可能会得到以下ID:

代码语言:javascript
复制
{50, 51, 52, 50}

取决于加载之前其他原子的创建情况。原子只能活到VM那么长。

2 . No.每个VM只有一个原子表。加载模块时,模块中的所有文字原子都映射到它们的is。如果那个表中还没有一个特定的原子,那么它就会被插入,并一直呆在那里直到VM重新启动。

3 . No.每个VM都有原子的表,它们是分开的。考虑一种情况,当两个VM同时启动,但他们不知道对方。在每个VM中创建的原子在表中可能有不同的in。如果在某个时间点,一个节点了解另一个节点,不同的原子将具有不同的If。它们不能很容易地同步或合并。但是原子也不只是简单地作为文本表示发送到另一个节点。它们被“压缩”到缓存的一种形式,并将它们一起发送到标题中。请参阅通信协议描述中的distribution header。基本上,标头包含后面使用的原子以及它们的ID和文本表示形式。然后,每个术语通过标头中指定的ID引用原子,而不是每次传递相同的文本。

票数 18
EN

Stack Overflow用户

发布于 2016-03-18 11:04:39

要想在不进入实现的情况下获得真正的基础,原子是一个具有名称的字面“事物”。它的价值永远是它自己,它知道自己的名字。当你想要标签时,你通常会使用它,比如原子okerror。原子是唯一的,在系统中只有一个原子foo,而且每次我提到foo时,我都是指这个相同的唯一foo,不管它们是在同一个模块中,还是来自同一个过程。总是只有一个foo

一点点的实现。原子存储在一个全局原子表中,当您创建一个新的原子时,如果它还没有被插入到表中。这使得比较原子的速度非常快,因为您只需要检查两个原子是否引用原子表中相同的槽。

虽然VM的单独实例节点具有独立的原子表,但对分布式erlang中的节点之间的通信进行了优化,因此通常不需要在节点之间发送实际的原子名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36023947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档