进程的五种状态
首先我们一起来看一下进程在哪些情况下,会有不同的状态表示。
创建态、就绪态
当我们刚开始运行程序的时候,操作系统把可执行文件加载到内存的时候,进程正在被创建的时候,它的状态是创建态
,在这个阶段操作系统会为进程分配资源、初始化 PCB。
当进程创建完成之后,便进入 就绪态
,处于就绪的进程已经具备运行条件,但是由于 CPU 不空闲,就暂时不能运行。
那么过了一会,CPU 它有空了,开始执行 就绪态
的进程,如果一个进程此时在 CPU 上运行,那么这个进程处于 运行态
,CPU 会执行该进程对应的程序。
然后在 CPU 执行过程中,这个进程它需要调用打印机的系统资源,但是打印机它现在也很忙,没空处理。 CPU 就会把该进程变为 阻塞态
。
当打印机忙完了,可以把资源分配给该进程的时候,进程又会从阻塞态
转变成 就绪态
等待 CPU 的再一次执行。
当我们整个进程执行完成之后,一个进程可以执行 exit
系统调用,请求操作系统终止该进程,此时该进程会进入 终止态
,操作系统会让该进程下 CPU,并且回收内存空间资源,最后还要回收该进程的 PCB,当终止进程的工作完成之后,这个进程就彻底消失了。
进程状态之间的切换
现在我们已知进程有五种状态:创建态、就绪态、运行态、阻塞态、终止态,我们再一起来总结一下这几种状态转变的过程。
首先当程序执行,进程在被创建的时候是创建态
,当创建工作完成之后,就会进入就绪态
,等待 CPU 执行.
当 CPU 开始执行该进程,就会进入运行态
,在运行过程中,进程调用 系统调用
的方式申请某种系统资源时,或者请求等待某个事件发生,此时就会进入 阻塞态
,这里强调一下,从 运行态
-> 阻塞态
,是由进程自身做出的主动行为。
当进程申请的资源或等待的事情发了,这个时候又从阻塞态
-> 就绪态
,在这里不是进程本身能控制的,是一种被动行为。
当程序运行结束,或者运行过程中遇到不可修复的错误,就会从 运行态
-> 终止态
。
还有一种情况就是当进程的时间片执行时间到了,或者 CPU 被抢占了,这个时候进程状态会从:运行态
-> 就绪态
。
这里需要注意:不能由阻塞态
直接变为 运行态
,也不能直接由 就绪态
变为阻塞态
,因为阻塞态是由进程主动请求的,必然需要进程在运行时主动发出这个请求。
我们最后再来一起总结看下:
状态如何被组织
操作系统为了方便管理各个不同状态下的进程,会将同一种状态下的各个进程的 PCB 组织起来。
那怎么组织呢? 组织一共有两种方式:链接方式、索引方式。
链接方式就有点像链表的数据结构一样进行存储,如下图:
索引的方式也很好理解,就是维护各个不同状态下进程的索引表就行,如下图:
这两种方式大家理解,有个印象就行。
本章总结
主要是掌握进程的状态,以及状态之间的切换。