进程的状态转换

一、进程状态

1.创建状态
进程由创建而产生。创建进程是一个非常复杂的过程,一般需要通过多个步骤才能完成:如首先由进程申请一个空白的进程控制块(PCB),并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入到就绪队列中。

2.就绪状态
这是指进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。如果系统中有许多处于就绪状态的进程,通常将它们按照一定的策略排成一个队列,该队列称为就绪队列。有执行资格,没有执行权的进程。

3.运行状态
这里指进程已经获取CPU,其进程处于正在执行的状态。对任何一个时刻而言,在单处理机的系统中,只有一个进程处于执行状态而在多处理机系统中,有多个进程处于执行状态。既有执行资格,又有执行权的进程。

4.阻塞状态
这里是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。此时引起进程调度,操作系统把处理机分配给另外一个就绪的进程,而让受阻的进程处于暂停的状态,一般将这个暂停状态称为阻塞状态

5.终止状态
进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还给系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能在再执行,但是操作系统中任然保留了一个记录,其中保存状态码和一些计时统计数据,供其他进程进行收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除其进程,即将其PCB清零,并将该空白的PCB返回给系统。

6、挂起状态

把某些进程对换到外存,暂时不参加进程调度,此时意味着进程处于静止状态。

注:如果挂起时,进程正在执行,则它暂停执行;若处于就绪状态,则进程此时不接受调度。

二、挂起和阻塞的区别(各种理解)

1、挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切的知道他什么时候恢复阻塞。

2、阻塞(pend)就是因为缺少某个资源,释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。

3、pend是task主动去等一个事件,或消息。suspend是直接悬挂task,以后这个task和你没任何关系,任何task间的通信或者同步都和这个suspended task没任何关系了,除非你resume task(激活操作);

4、任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。ready只需要等待CPU时间,当然,任务调度也占用开销,但是不大,可以忽略。可以这样理解,只要是挂起状态,操作系统就不在管理这个任务了。

5、挂起是主动的,一般需要用挂起函数进行操作,若没有resume的动作,则此任务一直不会ready。而阻塞是因为资源被其他任务抢占而处于休眠态。两者的表现方式都是从就绪态里“清掉”,即对应标志位清零,只不过实现方式不一样。

三、操作系统中睡眠、阻塞、挂起的区别形象解释

首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。挂起线程的意思就是你主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。使线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。

     线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。

四、Linux系统中的状态转换

在Linux下,进程标识符就是pid,这个可以通过命令来获取,也可以通过一些系统调用接口来获取,如ps命令,getpid()接口。pid是在操作系统下唯一标识一个进程存在的标识符,用于区别其他进程,同样的道理,一个PCB也只唯一标识一个进程。

在Linux下,一个进程可以有七种不同的状态:

R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行要么是在运行队列里。

S睡眠状态(sleeping):意味着进程在等待事件完成(可中断睡眠)。

D磁盘休眠状态(Disk sleep):也叫不可中断睡眠状态,在这个状态进程通常会等待IO的结束。

T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个暂停的进程可以通过发送SIGCONT信号让进程继续运行(关于信号后面还会继续更新到相关内容)。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

还有t(tracing stop)跟踪状态和Z(zombie)僵尸状态。

僵尸状态是进程已经终止,但是还占用这系统中的资源没有释放,这种状态对系统是有害的。僵尸进程这种状态比较特殊。当进程退出并且父进程没有读取到子进程退出的返回代码就会产生僵尸进程。
所以,只要子进程推迟,父进程还在运行,但父进程没有读取子进程的状态,子进程进入Z状态。

1、孤儿进程

孤儿进程:父进程先退出,子进程就被称为孤儿进程。父进程如果提前退出,那么子进程后退出,进入Z之后,该怎么办呢?这个时候会产生对系统资源的浪费的僵尸进程。操作系统当然不会眼睁睁的看着这种事情发生,所以当系统中产生孤儿进程,就会被1号init进程领养,当然会被init进程回收,这里的init进程可以先理解为操作系统的进程。

2、调度和切换的区别

调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,再有进程的切换。

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/106784321