执行窗口时间

zer*_*ing 7 erlang elixir

我已经阅读了关于流程和调度程序的elixir一书中的一篇文章,并提出了一些问题:

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

Cod*_*oll 15

假设您运行了10,000个Erlang/Elixir进程.为简单起见,我们还要说您的计算机只有一个单核进程.处理器一次只能做一件事,因此在任何给定时刻只能执行一个进程.

假设其中一个进程有一个长期运行的任务.如果Erlang VM无法中断进程,则每个其他进程都必须等到该进程完成其任务.当您尝试处理数以万计的请求时,这不能很好地扩展.

值得庆幸的是,Erlang VM并不是那么天真.当一个进程旋转时,它会减少2,000次(函数调用).每次进程调用一个函数时,它的减少计数减少1.一旦减少计数达到零,进程就会被中断(它会隐式地产生执行),并且它必须等待轮到它.

因为Erlang/Elixir没有循环,所以必须以递归方式迭代大型数据结构.这意味着,与大多数循环成为系统瓶颈的语言不同,每次迭代都会耗尽其中一个进程的缩减,并且进程无法执行.

这个答案的其余部分超出了问题的范围,但包括完整性.

现在让我们说你有一个4核的处理器.VM将启动4个调度程序(每个核心1个),而不是只有1个调度程序.如果有足够的进程在运行,第一个调度程序无法在合理的时间内处理负载,则第二个调度程序将控制多余的进程,并与第一个调度程序并行执行.

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

此外,VM非常智能,不会浪费时间在空闲的进程上 - 即只是等待消息.

JLouis有一篇关于Erlang如何进行调度的优秀博客文章.我建议阅读它.