为了寻找关于细节的文档,我没有找到更多的细节:
对我来说,这给我留下了很多不清楚的东西。
发布于 2016-03-16 01:29:34
Atom只是VM维护的ID。ID的表示是底层体系结构的机器整数,例如32位系统上的4字节和64位系统上的8字节。请参阅LYSE book中的用法。
同一个正在运行的VM中的同一个原子总是映射到相同的ID (整数)。例如,以下元组:
{apple, pear, cherry, apple}可以作为以下元组存储在实际的Erlang内存中:
{1, 2, 3, 1}所有原子都存储在一个从不垃圾收集的大表中,也就是说,一旦在运行的VM中创建了一个原子,它就会一直保存在表中,直到VM被关闭。
回答你的问题:
1 . No.在VM运行之间,原子的ID将发生变化。如果关闭VM并重新加载上面的元组,系统可能会得到以下ID:
{50, 51, 52, 50}取决于加载之前其他原子的创建情况。原子只能活到VM那么长。
2 . No.每个VM只有一个原子表。加载模块时,模块中的所有文字原子都映射到它们的is。如果那个表中还没有一个特定的原子,那么它就会被插入,并一直呆在那里直到VM重新启动。
3 . No.每个VM都有原子的表,它们是分开的。考虑一种情况,当两个VM同时启动,但他们不知道对方。在每个VM中创建的原子在表中可能有不同的in。如果在某个时间点,一个节点了解另一个节点,不同的原子将具有不同的If。它们不能很容易地同步或合并。但是原子也不只是简单地作为文本表示发送到另一个节点。它们被“压缩”到缓存的一种形式,并将它们一起发送到标题中。请参阅通信协议描述中的distribution header。基本上,标头包含后面使用的原子以及它们的ID和文本表示形式。然后,每个术语通过标头中指定的ID引用原子,而不是每次传递相同的文本。
发布于 2016-03-18 11:04:39
要想在不进入实现的情况下获得真正的基础,原子是一个具有名称的字面“事物”。它的价值永远是它自己,它知道自己的名字。当你想要标签时,你通常会使用它,比如原子ok和error。原子是唯一的,在系统中只有一个原子foo,而且每次我提到foo时,我都是指这个相同的唯一foo,不管它们是在同一个模块中,还是来自同一个过程。总是只有一个foo。
一点点的实现。原子存储在一个全局原子表中,当您创建一个新的原子时,如果它还没有被插入到表中。这使得比较原子的速度非常快,因为您只需要检查两个原子是否引用原子表中相同的槽。
虽然VM的单独实例节点具有独立的原子表,但对分布式erlang中的节点之间的通信进行了优化,因此通常不需要在节点之间发送实际的原子名称。
https://stackoverflow.com/questions/36023947
复制相似问题