【linux】进程和线程的几种状态及状态切换

一、进程的状态

1.1 进程的三种状态

进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。

一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态

运行态(Running):进程正在执行。
就绪态(等待态)(Waiting):进程在等待某个事件的发生,例如输入输出操作、网络请求等。
阻塞态(Blocked):进程被挂起,等待某些资源的释放或者信号的到达。

1.2 三种状态转换图

在这里插入图片描述

1.3 三种状态之间的转换

理论上上述三种状态之间转换分为六种情况;

运行——>就绪:

  1. 主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
  2. 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。

就绪——>运行:

运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:

正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:

进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。

在一些系统中,又增加了一些新状态,如挂起状态,可运行状态,深度睡眠状态,浅度睡眠状态,暂停状态,僵死状态。

1.4 linux下的进程进程状态

linux中的进程一般有以下状态:

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

具体的讲解在【linux】进程概念详述(五、进程状态)
这里把它们之间的转换图列出来:
在这里插入图片描述

二、线程的状态

线程通常有五种:

新建状态(New): 新创建了一个线程对象,该线程的生命周期开始。
就绪状态(Runnable): 线程对象创建后,其它线程调用了该对象的start方法,该状态的线程会位于可运行的线程池中,变得可运行,等待cpu的使用权。
运行状态(Running): 就绪状态的线程获取到了cpu的时间片,执行程序代码。
阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃cpu的使用权,暂停或停止运行,直到线程进入就绪状态,才有机会获得cpu的青睐从而转入运行状态。
死亡状态(Dead): 线程执行完了或者因为异常而退出的run方法,该线程生命周期结束。

这里的阻塞状态又分为三种:

等待阻塞: 运行的线程执行wait方法,则该线程会释放占用的的所有资源,jvm会把该线程放入 “等待池” 中,进入这个状态后是不能被自动唤醒的,需要调用notify/notifyAll 方法才能被唤醒。
同步阻塞: 运行的线程在获取对象的同步锁时,若该同步锁被其它线程占用,则jvm会把该线程放入 “锁池” 中。
其它阻塞: 运行的线程执行sleep/join方法、或者发出了I/O请求时,jvm会把该线程置为阻塞状态。当sleep方法等待超时、join方法等待线程终止或者超时、I/O处理完毕时,线程将重新转入就绪状态。

三、总结

线程的状态可能会受到操作系统调度策略的影响,因此不同的操作系统可能会有不同的状态定义。此外,在多线程编程中,程序员也可以通过锁、条件变量等机制来控制线程的状态转换。



猜你喜欢

转载自blog.csdn.net/qq_66314292/article/details/130109723