操作系统:进程
进程
为了将一个CPU变成多个虚拟的CPU来实现(伪)并行,或者说为CPU提供一种描述(伪)并行的抽象,操作系统的设计者开发了进程(process)。
进程是“一个具有独立功能的程序在一个数据集合上的一次动态执行过程”,或者简单说,是一个正在执行程序的实例。一个进程应该包括程序计数器、寄存器和变量的当前值。通过将运行中的程序和资源抽象成进程,我们得到一套了对CPU(伪)并行运行的描述,即CPU运行时在多个进程之间来回切换实现并行。这种快速的切换被称作多道程序设计(本章中的CPU均视作单核CPU,即每一个核在某一时刻只能运行一个进程)
一个常见的问题是:“进程和程序有什么区别?”进程是程序的一次执行过程,随着系统的需要在不同的状态之间变化,而程序是一段静态的,可以长久保存、多次运行的代码。如果一个程序运行了两遍,这将算作两个进程。
进程的创建
在一般的系统中,需要有某种方法在运行时创建或者撤销进程。
有4种事件会导致进程的创建:
- 系统初始化。
- 正在运行的程序运行了创建进程的系统调用。
- 用户请求创建一个新进程。
- 一个批处理作业的初始化。
进程的终止
进程的终止通常有以下几种情况:
- 正常退出(自愿的)。
- 出错退出(自愿的)。
- 严重错误(非自愿)。
- 被其他进程杀死(非自愿)。
进程的状态
虽然每个进程是独立的实体,但是进程之间经常会相互作用,比如进程A等待进程B的结果供其运行,在这种情况下,在进程B完成之前,进程A必须阻塞。逻辑上,每个进程可能有三种状态(如图1所示),这三种状态是:
- 运行态(该进程正占用CPU)
- 就绪态(该进程可运行,但因CPU被占用而暂停)
- 阻塞态(在某种外部事件发生之前,该进程不能运行)
进程的实现
为了实现多进程模型,操作系统使用了一张表格(一个结构数组),即进程表。每个进程占用一个进程表项(或被称作进程控制块,PCB)。该表中包含了进程状态的重要信息,保证进程能从中断现场原样启动。
操作系统是怎样管理进程表项,并通过进程表项来完成对进程的调度呢?我们大致可以得到图2所示的粗略模型。
调度系统位于操作系统的最底部,上面每一层都是一组各式各样的进程。每个进程都根据其表项的状态进入相应的队列,当状态发生变化时,进程表项从一个状态队列中脱离出来,加入另外一个队列。
进程挂起
进程挂起是指把进程从内存中移除,切换到外存(磁盘)中保存。进程存在阻塞挂起状态和就绪挂起状态。进程可能发生的挂起状态有以下四种:
- 阻塞到阻塞挂起(运行或者就绪的进程需要更多空间)。
- 就绪到就绪挂起(低优先级就绪进程可能会被挂起)。
- 运行到就绪挂起(对于抢先式分时系统,若有高优先级阻塞挂起进入就绪挂起,系统可能会把运行进程转到就绪挂起状态)。
- 阻塞挂起到就绪挂起(发生外部事件接触阻塞状态)。
解除挂起可能有以下两种情况:
- 就绪挂起到就绪(没有就绪进程或者挂起就绪进程优先级高于就绪进程)。
- 阻塞挂起到阻塞(内存空间足够)。
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
- 来自作者
- 相关推荐