返回主目录算法
以前的有博文对进程和线程的区别进行了详细的介绍,而且说明了引入进程的目的是为了可以使程序并发的执行,而且能够对并发执行的程序加以描述和控制。这篇博文,咱们就来对进程的状态转换来进行详细的分析。本文除了进程的状态转换,还穿插着对进程的控制的说明。缓存
注意:本博文中进程均是在传统操做系统中的进程,既是OS进行资源分配的基本单位,也是OS进行调度的一个独立单位。markdown
在开始以前,咱们对进程和程序来进行一个对比:数据结构
- 程序是静态的,而进程是动态的。
- 程序能够做为一种软件资源长期存在,而进程是有必定生命周期的。程序是永久的,进程是暂时的。
- 进程更能真实地描述并发,而程序不能;
- 进程具备建立其余进程的功能,而程序没有;
- 同一程序能够对应多个进程;
- 进程是系统分配资源和调度的独立单位,而程序不是。
所以,从上面咱们能够获得进程的一些特征:并发
- 动态性(进程由建立而产生,由调度而执行,由撤销而消亡);
- 并发性(多个进程同存于内存中,能够并发的执行);
- 独立性(资源分派和调度的独立单位);
- 异步性(进程的执行以一种不可预知的速度向前推动)。
三种基本状态
上面咱们讲到了,进程是具备生命周期的,由建立而产生,由调度而执行,由撤销而消亡,而且内存中能够同时存在多个进程,多个进程在并发执行的过程当中共享系统资源,由于资源的争用或者其余缘由,致使进程在运行的过程当中呈现间断性(异步),所以,进程在其生命周期内就具备多种状态。异步
首先咱们讲的是三种基本状态:就绪态、执行态、阻塞态。这三种基本状态是每一个OS中都会有的,所以也称之为基本状态,下面先给出三种基本状态的定义:性能
- 就绪(Ready)状态:经过Ready咱们能够看到,处于此状态的进程已经处于准备好要运行了,此时进程已经分配好除CPU外的全部必要资源,只需得到CPU(CPU如何进行分配,请关注后续有关处理机调度的博文),即可当即执行。用一句话来描述处于就绪态的进程:万事俱备,只欠CPU。另外还有一个就绪队列的概念,处于就绪态的进程都在此队列中,等待着调度程序的调度(分配CPU)。
- 执行(Running)状态:Running,运行中的,处于此状态的进程是已经得到CPU而且正在执行中。对于这一状态,在单CPU OS中,同一时刻只能有一个进程处于此状态,而在多CPU OS中,则能够有多个(不超过CPU的数量)进程同时处于执行状态。
- 阻塞(Block)状态:阻塞,百度释义为:障碍而不能经过,没法畅通。处于此状态的进程是由于在执行的过程当中因为发生某种须要等待的事件(I/O请求、申请缓存失败、等待接收数据等),而暂时没法继续执行。咱们知道在多道批处理系统中,此时须要进程把处理机释放,并选取新的就绪进程执行。与就绪队列相对应的,处于阻塞状态的进程都在阻塞队列中,某些OS中,出于提升效率的目的,根据阻塞的缘由,会有多个阻塞队列。

上图是进程的三种基本状态的转换图,进程在运行的过程当中会常常的发生状态的转换。从图中咱们能够看到,就绪态和执行态是能够互相转换的,可是执行态到阻塞态是单向的,这是由于就算阻塞的进程"通畅"了,可是由于处理机已经分配给了别的进程,所以进程的状态也只能切换到就绪态,而且也是单项的,由于等待事件也只能够在执行中才能发生,下面说明下各个状态切换发生的缘由:学习
- 就绪态—>执行态:进程得到CPU(被调度程序选中);
- 执行态—>阻塞态:向OS请求共享资源(互斥、同步)失败、等待某种操做完成、新数据还没有到达(I/O操做)、等待新任务的到达;
- 阻塞态—>阻塞态:上述的四类等待事件发生;
- 执行态—>就绪态:分配给进程的时间片执行完成(轮转调度算法)、高优先级的进程到达(抢占式调度)。
建立状态和终止状态
咱们知道,进程建立时,须要对其分配除CPU外的全部的必要资源,可是,若是此时OS由于资源不足没法给进程分配资源,那么进程应该处于什么状态呢?为了知足上述问题,知足进程状态的完整性以及加强管理的灵活性,一般会在OS中为进程新增两种常见的状态:建立状态和终止状态。下面给出两种状态的定义:atom
- 建立状态:进程建立的过程当中,所需的资源尚不能获得知足,此时建立工做还没有完成,进程没法被调度执行,进程此时就处于建立状态。
- 终止状态:进程正常运行结束或者出现致使进程终止的错误,或是被OS所终结,或是被父进程终结,则进入终止状态。进入终止状态的进程将不能再执行,可是在OS中依然保持一个记录,其中保存着状态码和计时统计数据,等待别的进程收集,一旦资源被收集完成,OS会马上删除该进程。

包含建立状态和终止状态以后,进程的状态转换如上图所示。从图中咱们能够看到,状态的转换多了建立态到就绪态,执行态到终止态,下面给出两种状态切换的缘由:spa
- 建立态—>就绪态:进程所需的资源获得分配;
- 执行态—>终止态:进程正常运行结束或者出现致使进程终止的错误,或是被OS所终结,或是被父进程(或其余有终止权的进程)终结。
下面对进程建立和终止的过程来进行一下说明。首先是进程的建立,进程的建立是一个较为复杂的过程,首先须要由进程申请一个空白的进程控制块(Process Control Block, PCB,后面会详细的讲),并向PCB中填写用于控制和管理进程的信息;而后为该进程分配运行时必要的资源;最后把该进程转为就绪态并插入到就绪队列中。其次是进程的终止,进程的终止分为两个步骤:首先是等待OS进行善后处理(中止执行、终止子孙进程、归还资源等),而后将其PCB清零,并将PCB空间返还给系统。
从上述进程的建立和终止的过程当中,咱们能够得知,建立态就是处于进程建立的第一步完成时的状态,终止态就是进程没法被调度或执行,可是还需等待别的进程来收集信息,也就是终止态一样处于第一步完成的状态,只有当进程归还了PCB后,才算是真正的被OS删除,生命周期才算结束。
挂起、激活操做
在部分OS中,为了系统和用户观察和分析进程的须要,还引入了一个对进程的重要操做—挂起(Suspend),当对某个进程执行此操做是时,该进程将会被挂起,此时意味着该进程须要释放内存,调至到硬盘中(外存),也意味着此时该进程处于静止状态,没法接受调度或者执行。当该进程被执行激活(Active)操做时,才可将该进程从外存中从新导入到内存中。
首先咱们来分析下进程被挂起的缘由:
- 终端用户的请求:当终端用户在本身的程序运行期间发现有可疑问题时,但愿暂停本身的程序的运行,使之中止下来,以便用户研究其执行状况或对程序进行修改;
- 父进程的请求:有时父进程但愿挂起本身的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动;
- 负荷调节的须要:当实时系统中的工做负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行;
- 操做系统的须要:操做系统有时但愿挂起某些进程,以便检查运行中的资源使用状况或进行记帐。
引入挂起以后,系统中的就绪状态和阻塞状态分别变为两种状态,这四种状态为:活动就绪、静止就绪、活动阻塞、静止阻塞,下面分别对这四种状态进行说明:
- 活动就绪(Readya):等价于就绪态,此时进程能够接受调度,得到处理机后可直接转为执行态;
- 静止就绪(Readys):进程被调至外存,没法接受调度;
- 活动阻塞(Blockeda):等价于阻塞态,当等待的事件发生后能够由活动阻塞变为活动就绪状态;
- 静止阻塞(Blockeds):进程仍然能够等待事件,当事件发生后,状态由静止阻塞变为静止就绪状态。

引入挂起操做后,OS中的状态变为7种,其中部分进程状态的变化以下:
- 活动就绪—>静止就绪:该进程被执行挂起原语Suspend;
- 活动阻塞—>静止阻塞:该进程被执行挂起原语Suspend;
- 执行态—>静止就绪:该进程被执行挂起原语Suspend;
- 静止就绪—>活动就绪:该进程被执行挂起原语Active;
- 静止阻塞—>活动阻塞:该进程被执行激活原语Active;
- 静止阻塞—>静止就绪:进程等待的事件发生;
- 活动阻塞—>活动就绪:进程等待的事件发生;
- 建立态—>活动就绪:在当前OS的性能和内存的容量均容许的状况下,完成进程的建立工做(三步);
- 建立态—>静止就绪:当前OS的当前资源情况和性能不容许,不分配给新建进程所需的资源(建立工做只完成第一步),此时进程处于静止就绪状态,被调至到外存中,不参与调度,此时建立工做还没有完成。
从上面的状态咱们能够看到,处于执行态的进程同样会被挂起,并且引入了挂起操做后,进程不会长期的处于建立状态,若是能分配到资源,状态会变为活动就绪态,若是没法分配资源,则进入静止就绪状态,当资源充足后,在将进程调入内存并为之分配资源,完成建立工做。
进程控制块PCB
上面讲了这么多的进程的状态的切换,那么OS究竟是根据什么来进行进程的控制和管理呢?好比进程的状态信息保存在哪里、进程对应的程序和数据是如何保存的、进程是如何保存和恢复CPU现场信息(上下文切换)的,还有其余等等操做是如何实现的?其实这些操做都须要依托于一种数据结构—进程控制块PCB。PCB是OS为了系统的描述和管理进程的运行,在内核中为每一个进程专门定义的一个数据结构。PCB做为进程实体(程序、数据、PCB)的一部分,记录了OS所需的用于描述进程当前状况以及管理进程运行的所有信息,是OS中最重要的记录型数据结构。
**PCB的做用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。**所以PCB的做用很是重要,咱们讲进程的状态切换是必需要讲PCB的。首先,咱们对PCB中存储的信息进行介绍:
- 进程标识符:用于惟一地标识进程。一个进程一般包含两种标识符:外部标识符和内部标识符。外部标识符通常由建立者(用户)提供,用来方便记忆;内部标识是为了方便OS对进程的使用,一般是Linux系统中查看到的Pid;
- CPU状态:CPU状态信息也称处理机的上下文,主要由CPU的各类寄存器(通用寄存器、指令计数器、程序状态字PSW、用户栈指针)中的内容组成的。进程在执行的过程当中,正在处理的许多信息都放在寄存器中,若是须要发生切换,这些信息就须要保存在该进程的PCB中,以即可以再次执行时能够快速的恢复CPU的状态;
- 进程调度信息:在OS进行调度(从就绪队列中选取进程分配CPU)时,必需要知道进程的状态和相关的调度信息,主要包括:进程状态、优先级、进程调度所需的其余信息(等待时间、已经执行的时间等)、事件(等待发生的时间,即阻塞的缘由);
- 进程的控制信息:只用于进程控制所必需的信息,主要包括:程序和数据的地址(所在内存或外存的首地址)、进程同步和通讯机制、资源清单(进程运行期间所需的所有资源,CPU除外,还有一张已经分配给该进程的资源清单,主要用于避免死锁)、连接指针(指向本PCB所在队列中的下一个进程的PCB的首地址)。
经过PCB所保存的信息,咱们是否是也就知道了上面讲到的问题(进程如何进行控制、程序和数据如何保存、CPU上下文如何切换和恢复)的答案了,都是须要使用PCB中保存的信息。下面咱们根据PCB中存储的信息,来对PCB做用作一个具体的分析:
- 做为独立运行基本单位的标志:当一个程序(包含数据)配置了PCB后,就表示他成为了一个进程,一个能在多道程序环境下独立运行并合法的一个基本单位,也就具备了取得OS服务的权利。这也是为何当系统建立一个进程时,须要为之建立一个PCB,并与进程一对一的绑定,系统是根据PCB来感知进程的,PCB被撤销归还给OS时,进程也就随之消亡了;
- 能实现间断运行的方式:这也是进程的一个基本特性—异步性,由于PCB中保存着进程在CPU上执行时的上下文信息,所以在进程再次被调度执行时,能够快速的恢复其CPU的现场信息。
- 提供进程管理所须要的信息:在进程的整个生命周期中,OS都是根据PCB实施对进程的控制和管理。
- 提供进程调度所须要的信息:OS根据PCB中存储的进程的状态信息来将继承插入到对应的队列中,并根据PCB中保存的优先级、等待事件等来进行调度的;
- 实现与其余进程的同步与通讯:PCB中具备用与实现进程通讯的区域或通讯队列指针等。
经过上面的描述,咱们也看到了PCB的重要之处,虽然一个进程中的PCB保存了如此多的信息,可是一个PCB的大小大约是1KB左右,体量小也能够保证内核中能够存放必定数量的PCB。
又到了分隔符如下,本文到此就结束了,本文内容所有都是由博主本身进行整理并结合自身的理解进行总结,若是有什么错误,还请批评指正,固然,若是有什么疑惑能够评论留言。
全文又是4700多字,原创不易,在写这篇博客的时候,真的是投入了大量的心血,翻看了许多的文档,若是本文对你有所帮助,还请留下个赞,以表支持。