【问题标题】:Process in idle mode空闲模式下的进程
【发布时间】:2016-03-07 10:53:48
【问题描述】:

当一个进程在等待接收消息时,它处于空闲状态,不会浪费 CPU 时间。这是什么意思?

我有一个递归的loop 函数:

def start do
    spawn(&loop/0)
end

defp loop do
    receive do
        {:run_query, caller, query_def} ->
            send(caller, {:query_result, run_query(query_def)})
    end

    loop
end 

CPU 总是忙于上面的进程还是允许其他进程执行它们的任务?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    这很容易测试,我在笔记本电脑上启动了(类似的)代码并用 ps 观察了进程:

    $ ps -o %cpu,comm
     %CPU COMM
      0.0 /opt/boxen/homebrew/Cellar/erlang/18.0.3/lib/erlang/erts-7.0.3/bin/beam.smp
    

    进程会被 Beam 置于睡眠状态(不要将进程与操作系统进程混淆,它们是不同的东西),只有在收到消息时才会唤醒。

    【讨论】:

    • 休眠是什么意思,进程会被保存到内存中直到有get调用?
    • 换句话说,它不会占用不必要的 CPU 周期,并允许其他 Erlang 进程运行。虚拟机足够聪明,不会将时间浪费在什么都不做的进程上。
    • 那么当 Erlang VM 计划生成新进程时,该进程有一个小的时间窗口来执行或者它是如何工作的?
    • “执行被暂停,可能是无限期的,直到消息到达匹配其中一个模式并具有真正的保护序列。” erlang.org/doc/reference_manual/expressions.html#id80146
    • 这可能使用futex system calls 或类似的东西来实现
    【解决方案2】:

    当您生成新进程时,基本上会发生什么 VM 将创建新的 Erlang 进程并将其推入队列,调度程序将运行该进程,但如果其中一个进程未接收任何消息或未进行任何计算,则其处于空闲状态意味着它不会占用 cpu 的任何时间,但进程仍然会消耗内存,给定进程可能有多种状态,甚至还有休眠模式,在这种情况下,进程处于睡眠模式,VM 将收回资源并唤醒一旦有该给定进程的消息,该进程。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 2019-08-27
      • 1970-01-01
      • 2012-02-21
      • 2021-01-21
      • 2011-10-19
      • 1970-01-01
      • 2011-03-17
      • 2015-01-03
      相关资源
      最近更新 更多