假设我们有一个进程, 它需要的资源有CPU, 资源A(在进程创建时为其分配), 资源B(进程运行时才发现需要资源B), 现在用这个进程来分析一下进程的几种状态. 先看图:
图1: 进程的几种状态
1. 创建 --> 就绪(+资源A):
操作系统为进程分配资源A, 进程进入就绪态, 等待CPU.
进程当前拥有资源: 资源A.
2. 就绪 --> 执行(+CPU):
操作系统进行CPU的调度, 将CPU分配给该进程, 进程进入执行态.
进程当前拥有资源: CPU + 资源A.
3. 执行 --> 就绪(-CPU):
操作系统进行CPU的调度, 剥夺该进程的CPU, 剥夺CPU的原因可能是该进程的时间片完或者是更高优先级的进程进入就绪态并抢占了CPU, 该进程进入就绪态.
进程当前拥有资源: 资源A.
4. 执行 --> 阻塞(wait资源B, -CPU):
进程执行过程中发现需要资源B, 但资源B当前无法使用, 需要等待, 则进程进入阻塞态. 同时操作系统剥夺进程的CPU资源.
进程当前拥有资源: 资源A.
5. 阻塞 --> 就绪(+资源B):
进程需要的资源B可以使用了, 操作系统将资源B分配给进程, 进程进入就绪态.
进程当前拥有资源: 资源A + 资源B.
6. 阻塞 --> 挂起阻塞(-资源A):
如果资源B迟迟不能使用, 则进入阻塞态的进程将长期占有资源A, 这也是资源的浪费, 因此我们引入挂起, 把资源A让出来, 供其他进程使用. 操作系统剥夺资源A, 进程进入挂起阻塞态.
进程当前拥有资源: 无.
7. 挂起阻塞 --> 阻塞(+资源A):
操作系统发现资源B快准备好了, 就马上归还抢占的资源A, 唤醒(激活)进程, 进程进入阻塞态.
进程当前拥有资源: 资源A.
8. 挂起阻塞 --> 挂起就绪(+资源B):
资源B准备好了, 但是资源A暂时无法归还, 进程进入挂起就绪态.
进程当前拥有资源: 资源B.
9. 挂起就绪 --> 就绪(+资源A):
资源A可以归还了, 操作系统归还资源A, 进程进入就绪态.
进程当前拥有资源: 资源A + 资源B.
10. 就绪 --> 挂起就绪(-资源A):
进程刚被创建后, 分配了资源A, 进入就绪态, 如果操作系统发现CPU需要较长时间才会分配给该进程, 则为了资源A不被闲置, 就剥夺资源A, 进程进入挂起就绪态.
进程当前拥有资源: 无.
11. 创建 --> 挂起就绪(没有分配资源):
操作系统创建了进程, 但是发现这个进程很久之后才能分配到CPU, 因此索性不给这个进程分配资源, 直接让进程进入挂起就绪态.
进程当前拥有资源: 无.
12. 执行 --> 挂起就绪(-CPU, -资源A):
操作系统负担较大, 认为这个进程不重要, 为了减轻负担, 剥夺这个进程的资源, 进程进入挂起就绪态.
进程当前拥有资源: 无.
13. 执行 --> 终止(-CPU, -资源A):
进程执行完毕, 释放资源, 进入终止态.