《Operating System:Three Easy Pieces》阅读笔记<二>——抽象进程

143 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

抽象进程

描述进程

操作系统的终极目标即是使程序更加简单易用,为了达成这一目的,我们需要对程序本身进行抽象。进程(process) 就是运行程序的主要操作系统抽象,在任何时候,进程都可以用它的三个状态来描述。

  • 地址空间中的内存内容

  • CPU寄存器的内容(程序计数器、堆栈指针、帧栈指针)

  • 关于IO的信息(已打开的文件)

进程创建

一个进程的创建需要做很多事情,首先它要把代码和静态数据加载到内存,然后初始化堆区(由代码主动分配的内存区域),再初始化IO相关的任务(标准流)。通过这些操作后,操作系统为程序的执行创建好了条件。

进程状态

进程可以处于多种不同的状态之一,包括Running、Ready和Blocked。不同的事件(例如,被调度或被取消调度,或等待 I/O完成)会将进程从这些状态之一转换到另一个状态。

  • Running:进程处于运行状态,正在执行指令
  • Ready:进程处于准备运行状态(寄存器与指针就绪,此时占用CPU),但是系统出于某些原因没有选择执行
  • Blocked:进程状态被存储起来,处于“沉睡”状态(不占用CPU),例如执行IO时,进程进入Bolcked状态直到IO完成

通过这三个状态,我们可以使进程成为CPU虚拟化技术的基础单位,即通过调节进程的执行顺序来进行计算资源的分配。

存储进程

操作系统也是程序,和其它程序一样,它用一些数据结构来跟踪程序运行时的各种相关信息。

进程状态在操作系统中是怎样存储的呢?我们要提到一种数据结构,叫做进程表(process list),它包含系统中所有进程的信息,列表中每个条目都存在于有时被称为进程控制块(process control block) 的东西中,它实际上只是一个包含特定进程信息的结构。简单来讲,可以是下图所示的结构体。

切换进程时,系统读取进程表中下一个要执行的进程的有关信息,放入寄存器中,此时下一个进程进入Ready状态,直到下一个时间片,CPU开始执行进程指令,进程切换就完成了。

进程API

最后,普通进程受操作系统管理,有一些比较通用的API用来管理进程。

APICreateDestroyWaitStatus
说明操作系统必须包含一些创建新进程的方法。当您在shell中键入命令,或双击应用程序图标时,操作系统将被调用,以创建一个新进程来运行您所指示的程序。由于存在创建进程的接口,系统也提供了强制销毁进程的接口。当然,许多进程会运行并在完成时自动退出;然而,当它们没有自动停止时,用户可能希望手动杀死它们,因此,一个界面来停止失控的进程是非常有用的。有时等待进程停止运行是有用的;因此,通常会提供某种等待接口。通常还会有一些接口来获取有关进程的一些状态信息,比如它运行了多长时间,或者它处于什么状态。

还有一些其它的API,例如,大多数操作系统都提供了某种方法来暂停进程(暂时停止运行),然后恢复进程(继续运行)

总结

我们了解了操作系统最基本的抽象:进程,介绍了它的底层机制,这一部分与虚拟化的关系在于,对计算资源和存储资源的虚拟化就是建立在进程这一概念之上的,通过进程这一概念,每个程序都仿佛拥有自己独立的cpu资源和内存资源。有了这一基础概念,之后我们会学习时间共享上下文转换等机制,以此了解进程与进程之间的关系,为后面学习更深一步的进程调度打下基础。