Concurrency 幕后的Erlang进程是什么?

Concurrency 幕后的Erlang进程是什么?,concurrency,multithreading,erlang,fiber,Concurrency,Multithreading,Erlang,Fiber,我对Erlang的了解非常有限,但据我所知,它可以以非常低的成本生成“进程” 所以我想知道,幕后的“过程”是什么 它们是纤维吗?线程?延续?它们是 另请参见我的问题。基本上它们是线程;)为它们提供一个地址空间。另外,从Erlang文档: Erlang进程是轻量级的 (动态增长和收缩)使用 内存占用小,创建速度快 以及终止和调度 开销很低 资料来源: 您可能还想看看这个: 在谈到Erlang进程时,它说: Erlang进程是轻量级的 线程。一开始很便宜 摧毁和摧毁,并且很快就会被摧毁 在引擎盖下

我对Erlang的了解非常有限,但据我所知,它可以以非常低的成本生成“进程”

所以我想知道,幕后的“过程”是什么

它们是纤维吗?线程?延续?

它们是


另请参见我的问题。

基本上它们是线程;)为它们提供一个地址空间。

另外,从Erlang文档:

Erlang进程是轻量级的 (动态增长和收缩)使用 内存占用小,创建速度快 以及终止和调度 开销很低

资料来源:

您可能还想看看这个:

在谈到Erlang进程时,它说:

Erlang进程是轻量级的 线程。一开始很便宜 摧毁和摧毁,并且很快就会被摧毁 在引擎盖下切换 它们只是函数。典型的 在现代计算机上运行的Erlang系统 台式计算机可以在 数万个这样的过程。 每两周切换一次进程 十几个函数调用 切换粒度较小,但节省了 正常情况下的大量时间 浪费在上下文切换上


我还没有找到确切的来源,但据我所知:

  • 有一个调度程序(例如,一个或多个调度程序) 协作)确定在哪个操作系统上启动哪个erlang进程 线

  • 这些进程有一个可扩展的堆栈(可能是 每个函数分配堆栈(如果需要),这样它们就不会消耗 内存太多,除非他们需要

  • 它们将根据它们是否是调度程序而返回给调度程序 等待数据或已执行足够长的时间 (可能有些函数中的前导代码会检查需要多长时间 已经过去)。与线程不同,它们不会被抢占

  • 每个进程从不同的页或从一个 不同的分配器,因此无法共享内存(在 操作系统进程避免共享内存的类似方式)

  • 假定每个erlang进程都有单独的分配器或页面也会有助于 垃圾收集,如果进程结束,则 无需进行任何垃圾收集即可返回页面:


不,它们不是。线程太重,无法实现Erlang进程。(顺便说一句,我没有投反对票)那么它们完全是通过分时共享一个线程来模拟的?抱歉,这听起来很可笑,在计算机有多个核心的时候,我们效率低下;)Erlang SMP是每个CPU核心一个线程。Erlang VM为每个进程提供一个独立的地址空间、ipc和分时。光纤使用协同多任务:当一根光纤到达一个良好的停止点时,它明确地产生控制,允许另一根光纤在同一个纤芯上运行。Erlang进程更像绿色线程:而且,线程效率非常低。每一个都需要一个单独的固定大小的堆栈,例如,通常只有几MB。这意味着机器中每几GB的RAM只有1024个线程,或者您可以进行交换,这会变得非常低效。您可以在几GB内运行数千个Erlang进程。相关:相关:那么这与光纤有什么区别?例如,Ruby光纤不能在不同的内核/CPU上同时运行(据我所知,如果我错了,请纠正我),而Erlang非常擅长于此。这不是Ruby的一个更大的限制吗?您可以在win32中从/在线程中创建光纤。因此,让它们在多核上运行应该不会有任何问题吧?我想如果线程是抢占式的,你可以在多核上运行光纤。我也在读下面的内容()。看起来很有趣。在顶部也有很好的解释