3

我想知道 erlang 的 VM 是如何抢占正在运行的代码和上下文堆栈的。如何用 c 之类的语言完成它?

4

2 回答 2

2

诀窍是 Erlang 运行时可以控制 VM,因此它可以完全在用户空间中跟踪它已经执行了多少 VM 指令(或者,更好的是,估计或表示这些指令所需的实际物理计算- 又名 Erlang VM 用语中的“减少”)并且 - 如果该数字超过某个阈值 - 立即交换进程指针/结构/任何内容并恢复执行循环。

想想这样的事情(一种伪C,可能实际上是C,也可能不是C,但我不知道,因为我不是C程序员,但你问你如何在C中进行所以我会尽力而为):

void proc_execute(Proc* proc)
{
    /* I don't recall if Erlang's VM supports different
       reduction limits for different processes, but if it
       did, it'd be a rather intuitive way to define process
       priorities, i.e. making sure higher-priority processes
       get more reductions to spend */
    int rds = proc->max_reductions;

    for (; rds > 0; rds--) {
        /* Different virtual instructions might execute different numbers of
           physical instructions, so vm_execute_next_instruction will return
           however many reductions are left after executing that virtual
           instruction. */
        rds = vm_execute_next_instruction(proc, rds);
        if (proc->exited) break;
    }
}

void vm_loop(Scheduler* sched)
{
    Proc *proc;

    for (;;) {
        proc = sched_next_in_queue(sched);
        /* we'll assume that the proc will be null if the
           scheduler doesn't have any processes left in its
           list */
        if (!proc) break;
        proc_execute(proc);
    }
}

Proc* sched_next_in_queue(Scheduler* sched)
{
    if (!sched->current_proc->exited) {
        /* If the process hasn't exited yet, readd it to the
           end of the queue so we can resume running it
           later */
        shift(sched->queue, sched->current_proc);
    }
    sched->current_proc = pop(sched->queue);
    return sched->current_proc;
}

这显然是相当简化的(特别是排除/省略了很多重要的东西,比如如何实现 VM 指令以及如何传递消息),但希望它说明了(如果我理解正确的话,至少)Erlang 的抢占式调度程序和进程模型在基本层面上工作。

于 2019-08-27T07:53:00.280 回答
1

Erlang 的所有代码都将编译为 Erlang 的 VM 的操作代码。Erlang 的 VM 由 Erlang 的 VM 启动时创建的 OS 线程执行 Erlang 的操作代码。

Erlang 的代码在由 Erlang 的 VM 控制的虚拟 CPU 上运行。而 Erlang 的 VM 将 IO 视为虚拟 CPU 的中断。因此,Erlang 的 VM 实现了一台机器和一个调度器,就像操作系统一样。由于操作代码和非阻塞 IO,我们可以使用 C 语言在 Erlang 的 VM 中实现抢占。

于 2018-03-03T07:22:20.167 回答