Linux进程状态

大家好,我是knight-n。本篇文章我会为大家介绍进程状态。

什么是进程状态

进程状态是指进程在其执行过程中的不同状态。这些状态随着进程的执行和外界条件的变化而转换。

在三态模型中进程状态分为三种基本状态,即运行态,就绪态,阻塞态。

在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。

本文我们介绍的是Linux下的进程状态。下面的代码是Linux内核源码中对进程状态的定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

LInux中进程状态通过一个整数进行标识,这个整数值是一个位图,每一个位都代表一个特定的状态。

R (running) 运行状态,值为0(二进制:00000000 )

S (sleeping)睡眠状态,值为1(二进制:00000001)

D (disk sleep)磁盘睡眠状态,值为2(二进制:00000010)

T (stopped)停止状态,值为4(二进制:00000100)

t (tracing stop)跟踪停止状态,值为8(二进制:00001000)

X (dead)死亡状态,值为16(二进制:00010000)

Z (zombie)僵尸状态,值为32(二进制:00100000)

 下面我们依次对这些进程状态进行介绍

R状态

R状态即运行状态,我们从状态名称就能大致理解这个状态的意义。运行状态就是进程在运行时的状态。但其实这样的说法并不准确。

在操作系统中,每个CPU都有一个与之关联的运行队列,当一个进程被创建或唤醒时,它的PCB会被放入一个运行队列的末尾。CPU调度器会根据调度算法从运行队列中选择一个进程来执行。被选中的进程会被加载到CPU上,并开始执行。当进程因为某种原因(如I/O操作、等待资源等)需要让出CPU时,它会被放回运行队列的末尾或等待队列中,等待下一次被调度。

在Linux中,当进程正在运行或在运行队列中等待运行时即为R状态。

S状态

R状态即睡眠状态,我们知道进程不仅需要占用CPU资源,进程需要访问外部设备,而这些外设的速度远远小于CPU运行速度,所以在进程访问外设时,操作系统会将进程从CPU的运行队列中移除,避免CPU资源的浪费。同时将进程加入到相应外设的等待队列中,当进程任务完成后,操作系统会重新将进程放入CPU的运行队列。

我们将进程处于等待队列时的状态称为S状态,即睡眠(阻塞)状态。下面我们介绍一种特殊的状态,挂起状态。

挂起状态是操作系统的一种资源管理手段,当进程处于阻塞状态时,进程的数据仍然被储存在内存中。而内存空间是有限的,当操作系统的工作负荷较重时,操作系统会选择将一些不重要的进程数据从内存中移除转换至外存,但进程的PCB仍然被操作系统保留,当内存空间充足时,进程可以从挂起状态恢复,挂起状态可以帮助操作系统更好地管理内存资源,提高系统的整体性能。

D状态

D状态即深度睡眠状态,深度睡眠状态是对进程的一种保护措施。当一个进程处于D状态时进程不会接受任何中断,一般来说D状态是进程在执行重要的磁盘IO任务或网络请求,为了保护该进程,可以将进程设置为D状态。

D状态的进程在等待期间不会消耗CPU资源,这对于系统性能是有益的。然而,如果系统中有大量的进程陷入D状态,可能会导致系统资源的浪费和性能下降,因为这些进程无法被调度和执行,会一直占据系统的资源。

为了解决这个问题,Linux内核引入了一种被称为“D状态超时”的机制。当进程进入D状态一段时间后,内核会尝试解除其睡眠状态并将其转变为可运行状态。这样可以避免进程长时间停留在D状态下,保证系统的正常运行。

T状态

T状态即停止状态,当一个进程进入T状态时,它会被暂停执行,不再占用CPU资源。这种状态通常发生在进程接收到某些特定的信号,如SIGSTOP信号,导致进程被暂停。

当进程处于T状态时,它不会执行任何操作,也不会消耗CPU资源。进程不会响应任何调度请求,直到它被明确地恢复执行。为了恢复T状态的进程,可以发送SIGCONT信号给该进程,使其继续运行。 需要注意的是,T状态与阻塞状态不同。阻塞状态是进程等待某些事件(如I/O操作)完成的状态,而T状态是进程被明确暂停执行的状态。

t状态

t状态即跟踪停止状态,当一个进程被调试且暂停时就是t状态。

当进程处于t状态时,它不会执行任何操作,也不会消耗CPU时间。与T状态不同,t状态是专门为调试目的而设计的。调试器可以使用这个状态来控制进程的执行流程,例如设置断点、单步执行等。

X状态

X状态即死亡状态,X状态表示进程已经死亡。这并不是一个进程可以长时间保持的状态,在进程表中通常不会直接看到这个状态。当进程结束时,它首先会被标记为X状态,然后父进程会收集这个进程的信息并释放其占用的资源。一旦父进程完成了这些操作,该进程就会从系统中完全消失。

Z状态

Z状态即僵尸状态,表示进程已经成为僵尸进程。我们在上面介绍X状态的时候我们介绍进程结束时,它首先会被标记为X状态,然后父进程会收集这个进程的信息并释放其占用的资源。当父进程完成了这些操作,该进程就会从系统中完全消失。在进程死亡到进程被回收这段时间内,进程就处于僵尸状态。在这个状态下,进程占有的所有资源(除进程PCB以外)都已被回收。task_struct(进程PCB)中保存了进程的退出码和一些统计信息。如果系统中存在大量的僵尸进程,可能会导致资源泄漏和其他问题。

为了避免这种情况,父进程应该及时回收其已终止的子进程的资源。这可以通过调用wait()或waitpid()等系统调用来实现。当父进程回收了僵尸进程的资源后,该僵尸进程就会从系统中消失。

让我们想一下,如果父进程提前退出会发生什么?子进程退出后会一直处于僵尸状态。这种情况下的进程被成为孤儿进程。Linux系统会将该进程领养,该进程会被init进程即系统进程接管,并成为该进程的父进程。

至此,值得关注的进程状态全部讲解完成。

感谢观看!!!

相关推荐

  1. Linux进程状态

    2024-04-03 23:18:02       5 阅读

最近更新

  1. vue2 mixins混入

    2024-04-03 23:18:02       0 阅读
  2. HashTable和ConcurrentHashMap的区别

    2024-04-03 23:18:02       0 阅读
  3. 前端错误监控的方法有哪些

    2024-04-03 23:18:02       0 阅读
  4. numpy

    2024-04-03 23:18:02       0 阅读
  5. C# 接口

    2024-04-03 23:18:02       0 阅读
  6. ubuntu在线安装mysql数据库

    2024-04-03 23:18:02       0 阅读
  7. 十分钟Nginx优化速成课

    2024-04-03 23:18:02       0 阅读
  8. 浅理解vue2中的模板编译

    2024-04-03 23:18:02       0 阅读
  9. H3C交换机FTP与TFTP

    2024-04-03 23:18:02       0 阅读

热门阅读

  1. 力扣--哈希表+滑动子块--串联所有单词子串

    2024-04-03 23:18:02       4 阅读
  2. MySQL两表联查之分组成绩第几问题

    2024-04-03 23:18:02       4 阅读
  3. Redis面试题15道

    2024-04-03 23:18:02       3 阅读