进程是一个具有一定独立功能的 程序 在一个 数据集合 上的 一次动态执行 过程。
本文是进程与线程的第二部分,主要介绍进程的状态,包括进程的生命周期管理、进程状态变化模型和进程挂起模型,以及操作系统如何管理进程的状态队列。
一个进程的生命周期包括:进程的创建、就绪、运行、等待(阻塞)、终止。
引起进程创建的 3 个主要事件:
1 | P_create |
一个进程被创建完成后,便会进入就绪状态,等待操作系统的调度执行。
1 | P_create -> P_ready |
内核选择一个 就绪 的进程,让它占用 CPU 并执行。
1 | P_create -> P_ready -> P_running |
计算机有那么多进程呢,操作系统如何选择进程?又为何选择这个进程?这由后续要讲解的调度算法控制!
在以下情况下,进程等待(阻塞):
1 | P_create -> P_ready -> P_running |
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
唤醒进程的原因:
1 | P_create -> P_ready -> P_running |
被唤醒的进程将进入就绪状态,进程只能被别的进程或操作系统唤醒。
在以下四种情况下,进程结束:
1 | P_create -> P_ready -> P_running -> Exit |
进程的三种基本状态(进程在生命结束前处于三种基本状态之一):
不同操作系统设置的进程状态数目可能不同。
进程其它的基本状态:
进程可能的状态变化如下:
NULL -> New
:一个新进程被产生出来执行一个程序。New -> Ready
:当进程创建并并初始化完成后,一切就绪准备运行时,变为就绪状态。
Ready -> Running
:处于就绪态的进程被进程调度程序选中后,就分配到 CPU 上来运行。Running -> Exit
:当进程表示它已经完成或者发生异常,当前运行的进程会由操作系统作结束处理。Running -> Ready
:处于运行状态的进程在其运行过程中,由于分配它的 CPU 时间片用完而让出 CPU,或者当一个高优先级的进程就绪时,操作系统可能会抢占当前正在运行的低优先级进程,并将其切换到就绪态,以便优先执行高优先级进程。Running -> Blocked
:当进程请求某个事件且必须等待时。
Blocked -> Ready
:当进程等待到某个事件到来时,它从阻塞状态变到就绪状态。进程挂起(suspend)是指操作系统进程管理将前台的进程暂停并转入后台的动作。将进程挂起可以让用户在前台执行其他的进程。挂起的进程通常释放除 CPU 以外已经占有的系统资源,如内存等。在需要时用户可以恢复进程的运行,将被挂起的进程从后台转入前台,并从暂停处开始继续运行。(Wikipedia)
进程挂起:为了合理且充分地利用系统资源。
进程在挂起状态时,意味着进程 没有占用内存空间,处在挂起状态的进程映像在磁盘上(把进程放到磁盘上)。
带有挂起状态的进程状态转移模型:
可以将挂起状态间的转化分为两类,一类是进程处于内存中时发生的挂起,另一类是进程处于外存时的挂起。
阻塞 -> 阻塞挂起:
就绪 -> 就绪挂起:
通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能立即执行。
但是,如果释放内存以得到足够空间的 唯一方法 是挂起一个就绪态进程的话,那么这种转换也是必需的;并且,如果操作系统确信高优先级的阻塞态进程很快就会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。
运行 -> 就绪挂起:
阻塞挂起 -> 就绪挂起:
条件:当有阻塞挂起因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程。
既然有将内存中的进程挂起到外存的,那么也会有解挂重新激活进程的操作:即将一个进程从外存转到内存。
就绪挂起 -> 就绪态:
条件:内存中没有就绪进程,或挂起的就绪进程优先级高于内存中的就绪进程时,会进行这种转换。但一般情况下也会发生这种转换,不一定是上述两种条件。
阻塞挂起 -> 阻塞态:
条件:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程。
状态队列(State Queue)是操作系统中用于管理进程状态的数据结构,用于存储不同状态的进程。
状态队列:
参考资料: