Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Erlang 执行窗口时间_Erlang_Elixir - Fatal编程技术网

Erlang 执行窗口时间

Erlang 执行窗口时间,erlang,elixir,Erlang,Elixir,我在《elixir in action》一书中读到一篇关于进程和调度程序的文章,我有一些问题: 每个进程都有一个小的执行窗口,这意味着什么 执行窗口大约有2000个函数调用 什么是隐式产生执行的流程 假设您有10000个Erlang/Elixir进程正在运行。为了简单起见,也可以说您的计算机只有一个进程和一个内核。处理器一次只能做一件事,因此在任何给定时刻只能执行单个进程 假设其中一个进程有一个长时间运行的任务。如果Erlang VM无法中断该进程,那么其他每个进程都必须等待该进程完成其任务。

我在《elixir in action》一书中读到一篇关于进程和调度程序的文章,我有一些问题:

  • 每个进程都有一个小的执行窗口,这意味着什么
  • 执行窗口大约有2000个函数调用
  • 什么是隐式产生执行的流程

假设您有10000个Erlang/Elixir进程正在运行。为了简单起见,也可以说您的计算机只有一个进程和一个内核。处理器一次只能做一件事,因此在任何给定时刻只能执行单个进程

假设其中一个进程有一个长时间运行的任务。如果Erlang VM无法中断该进程,那么其他每个进程都必须等待该进程完成其任务。当您试图处理数以万计的请求时,这无法很好地扩展

谢天谢地,ErlangVM并不是那么幼稚。当一个进程启动时,它将被减少2000次(函数调用)。每次进程调用一个函数时,它的减少计数都会减少1。一旦它的减少计数达到零,进程就被中断(它隐式地产生执行),它必须等待轮到它

因为Erlang/Elixir没有循环,所以必须递归地遍历大型数据结构。这意味着,与大多数循环成为系统瓶颈的语言不同,每次迭代都会消耗掉流程的一个缩减,流程无法执行

此答案的其余部分超出了问题的范围,但为了完整性而包括在内。

假设现在有一个4核处理器。VM将启动4个调度器(每个核心1个),而不是只有1个调度器。如果有足够多的进程在运行,第一个调度器无法在合理的时间内处理负载,那么第二个调度器将控制多余的进程,与第一个调度器并行执行这些进程

如果这两个调度器不能在合理的时间内处理负载,第三个调度器将承担部分负载。这将一直持续到所有处理器都被充分利用为止

此外,虚拟机足够智能,不会在空闲的进程上浪费时间,即只是等待消息


JLouis在上发表了一篇优秀的博客文章。我建议您阅读。

非常感谢您的回答。什么是死刑?中断的过程会发生什么?以后还要继续吗?hog执行将耗尽所有CPU周期。对于中断的进程,它将在将来某个时间再次运行。调度程序将遍历每个进程并在其上花费时间,然后对任何仍处于活动状态的进程重新启动。是的,当调度程序说再次轮到被中断的进程时,它们将恢复工作。这对hog意味着什么?这意味着不共享。