首页 > 代码库 > 【操作系统】进程

【操作系统】进程

进程是一个正在执行程序的实例,它包括程序计数器、寄存器和变量的当前值。在单CPU的环境下,进程交替运行,CPU在多个进程间快速切换,让人感觉多个进程在同时执行,但同一时刻只有一个进程在运行,这就是所谓的伪并行。

创建进程
有四种创建进程的方法:
  1. 系统初始化:操作系统启动时,会创建一些进程,包括前台进程和后台进程(守护进程)。
  2. 正在运行的进程执行系统调用:一个进程发出系统调用创建另一个进程,以便多个进程相互协作完成任务。
  3. 用户请求创建进程:这是我们最熟悉的一种方式。命令行环境下键入命令,而图形界面环境下双击图标,就能创建一个新的进程了。
  4. 一个批处理作业的初始化:操作系统认为有资源可运行另一个作业时,创建一个新的进程。
上述四种创建进程的方法,新进程的产生本质上都是由一个进程执行了一个用于创建进程的系统调用。例如在UNIX系统中,是使用fork+exec的组合产生新进程。

进程的终止
一个进程终止的条件通常有下面几条:
  1. 正常退出:进程完成任务后执行系统调用正常退出,例如UNIX系统的exit系统调用。
  2. 进程发现的错误:例如程序需要打开的文件不存在。
  3. 进程引起的错误:例如访问非法地址,除数为0等由于程序本身的原因而引起的错误。
  4. 被其它进程杀死:其它进程通过系统调用终止当前进程,例如UNIX系统的kill系统调用。

进程的状态
进程有三种状态:
  1. 运行态:实际占用CPU。
  2. 就绪态:可以运行,但因其它进程占用CPU而暂停。
  3. 阻塞态:停止等待某个外部事件的发生,例如磁盘I/O。
三种状态的关系如下:


这里要注意,当阻塞进程等待的事件发生时,不能直接运行,而是要变为就绪状态。如果CPU此时空闲,则可以直接运行该进程,否则要等待调度程序的调度。

进程的实现
操作系统维护有一张表格(程序中表现为一个结构数组),叫做进程表。每一个进程对应一个表项(进程控制块),表项中保存有该进程的相关信息。进程在不同状态间切换时需要用到表项中的信息。例如进程从运行态切换到阻塞态或就绪态时,该进程的信息就要保存在它对应的表项中,待进程恢复运行后,又要从表项中取出这些信息继续执行。这使得进程能够给人以连续执行的错觉,实际上是间断执行的。表项内容大致如下:


参考:
《现代操作系统》 P47-P52.