当你生来是一个beam虚拟机里的过程,你所相熟的所有是在这个世界上,每个过程能够互相收发音讯。你所不晓得的事是,每个过程并不是同时执行的,而是由调度器进行调度。

有一天,为了探索实在的世界,你窃取了beam虚拟机的bif(built in function)之一: erlang:trace 的使用权。有了它,能够监控到任意一个过程的一举一动。

要想应用它,首先须要一个过程去解决它收回来的 trace 音讯:

defmodule N1 do  def start do    spawn(&loop/0)  end  defp loop do    receive do      msg ->        IO.inspect(msg)        loop()    end  endend

而后,找一个“受害者”。你找到了这个人畜有害的过程,它每2秒会给本人打个招呼,而后就沉沉睡去。在它安眠的时候,cpu是否还会把关怀它呢?

defmodule N2 do  def start do    spawn(&loop/0)  end  defp loop do    :timer.sleep(2000)    send(self(), :hi)    receive do      :hi ->        loop()    end  endend

你轻轻开启了试验

iex(1)> n2 = N2.start                                 #PID<0.155.0>iex(2)> n1 = N1.start                                 #PID<0.157.0>iex(3)> :erlang.trace n2, true, [:all, {:tracer, n1}] 1{:trace_ts, #PID<0.155.0>, :in, {:timer, :sleep, 1}, 3, {1604, 420048, 633876}}{:trace_ts, #PID<0.155.0>, :receive, :timeout, 3, {1604, 420048, 633890}}{:trace_ts, #PID<0.155.0>, :send, :hi, #PID<0.155.0>, 3, {1604, 420048, 633898}}{:trace_ts, #PID<0.155.0>, :receive, :hi, 3, {1604, 420048, 633902}}{:trace_ts, #PID<0.155.0>, :out, {:timer, :sleep, 1}, 3, {1604, 420048, 633916}}{:trace_ts, #PID<0.155.0>, :in, {:timer, :sleep, 1}, 3, {1604, 420050, 635069}}{:trace_ts, #PID<0.155.0>, :receive, :timeout, 3, {1604, 420050, 635079}}{:trace_ts, #PID<0.155.0>, :send, :hi, #PID<0.155.0>, 3, {1604, 420050, 635086}}{:trace_ts, #PID<0.155.0>, :receive, :hi, 3, {1604, 420050, 635090}}{:trace_ts, #PID<0.155.0>, :out, {:timer, :sleep, 1}, 3, {1604, 420050, 635098}}

机密信息被打印在了IO设施上,记录了一次次的 receive 和 send。最重要的是:in (进入调度器)和 out (来到调度器)的记录。你很分明地看见,在过程沉睡的2秒里,属于它的cpu工夫被窃取了。你第一次证实了已经的猜测:这是一个楚门的世界。