人类的悲欢并不相通,我只觉得他们吵闹。

——鲁迅《而已集·小杂感》。

本章讨论操作系统提供的基本的抽象—— 进程。进程的非正式定义非常简单:进程就是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令(也可能 是一些静态数据)。是操作系统让这些字节运行起来,让程序发挥作用。

操作系统通过虚拟化CPU来实现有许多个CPU的假象,实现了在操作系统之上同时运行多个程序。为了实现多个程序“同时运行”,操作系统让一个进程只运行一个时间片,然后迅速切换到其他进程。

这被称为时分共享机制,即通过允许资源由一个实体使用一小段时间,然后又另一个实体使用一小段时间,如此往复,便实现了资源的共享。与之对应的还有空分共享机制,例如磁盘可以将不同的块分给不同的文件。

操作系统需要一些低级机制高级策略来更好的实现资源的虚拟化:

  • 低级机制:可以理解为操作系统解决“怎么做”的手段,例如,操作系统怎么实现上下文切换?
  • 高级策略:可以理解为操作系统解决“选择谁”的手段,例如,操作系统当前应该执行哪个程序?

4.1 抽象:进程

进程:操作系统为正在运行的程序提供的抽象。简单理解为,进程就是正在运行的程序。

程序在运行时可以读取或者更新的内容被称为程序的机器状态。部分机器状态的组成:

  • 部分特殊寄存器,例如程序计数器PC、栈指针、帧指针
  • IO设备

4.2 进程API

  • 创建:创建一个新的进程的接口
  • 销毁:强制销毁进程的接口
  • 等待:等待接口,如等待进程停止
  • 其他控制:对进程的其他控制,例如暂停
  • 状态:获取进程的状态信息,例如运行时长等

4.3 进程创建:更多细节

创建进程时操作系统需要做很多工作:

  1. 操作系统运行进程首先把程序代码和所有静态数据加载到内存中,也就是程序的地址空间里面。

  2. 接着操作系统为程序的运行时栈分配一些内存,比如参数初始化栈,填充main()函数的参数

  3. 为程序的堆分配内存

  4. 进行一些其他的初始化,比如执行IO设备设置

  5. 启动程序,在入口处运行,即main()OS将CPU的控制权交给进程,从而程序开始运行。

4.4 程序状态

程序在给定时间可能处于不同的状态state:

  • 运行:进程在处理器上运行
  • 就绪:进程已经准备好运行,但此时操作系统没让它运行
  • 阻塞:例如,一个在运行的进程发起了IO操作,他会被阻塞,让出处理器,其他处于就绪的进程可以被选择运行。

4.5 数据结构

操作系统是一个程序,和其他程序一样,它也有一些关键的数据结构来跟踪程序的相关信息。例如,进程列表、阻塞进程状态信息等等。