ClarkCheung
ClarkCheung

I'm writing something about Computer Science, especially some basic knowledges.

操作系统:进程

进程

为了将一个CPU变成多个虚拟的CPU来实现(伪)并行,或者说为CPU提供一种描述(伪)并行的抽象,操作系统的设计者开发了进程(process)

进程是“一个具有独立功能的程序在一个数据集合上的一次动态执行过程”,或者简单说,是一个正在执行程序的实例。一个进程应该包括程序计数器、寄存器和变量的当前值。通过将运行中的程序和资源抽象成进程,我们得到一套了对CPU(伪)并行运行的描述,即CPU运行时在多个进程之间来回切换实现并行。这种快速的切换被称作多道程序设计(本章中的CPU均视作单核CPU,即每一个核在某一时刻只能运行一个进程)

一个常见的问题是:“进程和程序有什么区别?”进程是程序的一次执行过程,随着系统的需要在不同的状态之间变化,而程序是一段静态的,可以长久保存、多次运行的代码。如果一个程序运行了两遍,这将算作两个进程。

进程的创建

在一般的系统中,需要有某种方法在运行时创建或者撤销进程。

有4种事件会导致进程的创建:

  1. 系统初始化。
  2. 正在运行的程序运行了创建进程的系统调用。
  3. 用户请求创建一个新进程。
  4. 一个批处理作业的初始化。

进程的终止

进程的终止通常有以下几种情况:

  1. 正常退出(自愿的)。
  2. 出错退出(自愿的)。
  3. 严重错误(非自愿)。
  4. 被其他进程杀死(非自愿)。

进程的状态

虽然每个进程是独立的实体,但是进程之间经常会相互作用,比如进程A等待进程B的结果供其运行,在这种情况下,在进程B完成之前,进程A必须阻塞。逻辑上,每个进程可能有三种状态(如图1所示),这三种状态是:

  1. 运行态(该进程正占用CPU)
  2. 就绪态(该进程可运行,但因CPU被占用而暂停)
  3. 阻塞态(在某种外部事件发生之前,该进程不能运行)
图1 进程状态转换图

进程的实现

为了实现多进程模型,操作系统使用了一张表格(一个结构数组),即进程表。每个进程占用一个进程表项(或被称作进程控制块,PCB)。该表中包含了进程状态的重要信息,保证进程能从中断现场原样启动。

操作系统是怎样管理进程表项,并通过进程表项来完成对进程的调度呢?我们大致可以得到图2所示的粗略模型。

图2 操作系统进程模型

调度系统位于操作系统的最底部,上面每一层都是一组各式各样的进程。每个进程都根据其表项的状态进入相应的队列,当状态发生变化时,进程表项从一个状态队列中脱离出来,加入另外一个队列。

进程挂起

进程挂起是指把进程从内存中移除,切换到外存(磁盘)中保存。进程存在阻塞挂起状态和就绪挂起状态。进程可能发生的挂起状态有以下四种:

  1. 阻塞到阻塞挂起(运行或者就绪的进程需要更多空间)。
  2. 就绪到就绪挂起(低优先级就绪进程可能会被挂起)。
  3. 运行到就绪挂起(对于抢先式分时系统,若有高优先级阻塞挂起进入就绪挂起,系统可能会把运行进程转到就绪挂起状态)。
  4. 阻塞挂起到就绪挂起(发生外部事件接触阻塞状态)。

解除挂起可能有以下两种情况:

  1. 就绪挂起到就绪(没有就绪进程或者挂起就绪进程优先级高于就绪进程)。
  2. 阻塞挂起到阻塞(内存空间足够)。
CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论