What is “Process”?
process 是对 running program 的 abstraction. 当一个 process 在运行的时候,他可以读取/修改什么东西呢?也即,我们希望查询这个 process 的 machine state.
- address space (memory). process 既然本质是运行着的程序,显然,它应该可以读取 in-memory instruction 和读写的 data.
- registers. 寄存器也很关键,不仅暂存了 process 的中间运算结果,也包含特殊的 registers. 例如 program counter 保存了下一条 instruction 的 address, stack pointer, frame pointer
- I/O information.
Process API
process 作为 OS 里进行分配资源的最小独立单位,必不可少需要 os 提供接口获取 process 的状态,例如
- creation. 当我们想要启动一个应用程序的时候,os 就需要创建进程,为即将运行的进程分配资源.
- destroy. 手动销毁进程,比如说 process 进入死循环了,为了即使释放资源,就需要手动杀死进程.
- wait.
- misc control. 例如 suspend process 以等待其他进程完成计算并复用其计算结果.
- status. 有时会需要关心 process 的状态,例如监控其是否正常运行等.
Process Creation

Process States
下图是一个简化版的 process state transition:
- Running. 表明 process 正在独占 processor.
- Ready. process 可以继续运行,但是 OS 没有选择让这个 process 去运行
- Blocked. 当 process 正在进行 IO 操作(或者不需要很多计算资源的操作),process 会被 os 先 de-schedule,进入 blocked 状态;直到 IO 操作完成(或者收到 signal),重新进入 Ready 状态准备继续运行.
有的 os 还会有其他状态:
- Zombie (Final). 这个状态通常用于描述 process 已经执行完毕,但是分配的资源还没有完全释放的状态. 例如父进程执行完毕但是子进程还没.
- Initial. 进程刚刚创建时的状态.
graph LR A(Running) --> E(Zombie) D(Initial) --> B A -->|I/O start| C(Blocked) C -->|I/O done| B(Ready) A -->|De-scheduled| B B -->|Scheduled| A
数据结构
根据分析,os 必然需要数据结构维护处于各个 state 的 processes. 我们可以使用类似于 Process List 的结构维护所有 process.
那么我们怎么储存 process 呢?我们其实只需要记录 process 的一些 machine state 即可. 记录这个 state 的数据结构叫做 Process Control Block (PCB). PCB 也会包含 process 所使用的 registers 信息. 我们以 xv6 里的 PCB 为例
1 | // the registers xv6 will save and restore |