第三课:进程 (Process)

从第二课的讨论中,我们已经了解:

  • 在 user processes 与 kernel 之间切换
  • kernel 可以切换不同的用户进程,实现并发
  • 保护 user processes 之间,以及 user processes 与 kernel 之间互不干扰

但你可能会有很多疑问:

  • OS 如何表示进程?
  • OS 如何选取下一个运行的进程?
  • OS 在切换进程时,如何记录进程的运行时信息?
  • kernel 的 stack、heap 是怎样的?
  • 大量切换进程,同时记录它们的运行时信息,会不会浪费内存?

本节我们就将进入这些细节中了解 OS 中的进程。

Process Control Block (PCB)

在 Kernel 中用于表示用户进程的数据结构叫作 PCB。PCB 包含进程的重要信息,如:

  • 进程状态 (running, ready, blocked, ...)
  • 寄存器状态
  • Process Id (PID)、用户、优先级……
  • 执行时间……
  • 内存空间、地址转化信息……

Kernel Scheduler

Kernel Scheduler 将这些 PCB 组织起来,利用一些 scheduling algorithms 来选择下一个运行的进程,这个过程可以用如下代码概括:

while (true) {
    if (readyProcesses(PCBs)) {
        nextPCB = selectProcess(PCBs);
        run(nextPCB);
    } else {
        run_idle_process();
    }
}

代码中的 selectProcess,就隐藏着五花八门的调度策略。但不论是哪种调度策略,都需要考虑公平与效率,这在现实生活中也是如此。

Safe Kernel Mode Transfers

实现 user mode 到 kernel mode 的安全转变,需要许多细节来保证。

  • kernel 拥有自己的 kernel stack,kernel stack 与 user stack 不可以有公用的部分
  • 转变的过程必须完全可控,包括用户进程运行时环境的保存,system call 的参数移动(从 user space 到 kernel space)、参数检查以及运行结果从 kernel space 返回到 user space 的过程。

转变的例子如下图所示:

(图1)before

(图2)after

results matching ""

    No results matching ""