首页 > 系统相关 >Linux进程状态

Linux进程状态

时间:2024-04-06 23:30:44浏览次数:23  
标签:状态 队列 值为 Linux 进程 CPU 运行

大家好,我是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进程即系统进程接管,并成为该进程的父进程。

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

感谢观看!!!

标签:状态,队列,值为,Linux,进程,CPU,运行
From: https://blog.csdn.net/2301_80926085/article/details/137187628

相关文章

  • Linux挂载NTFS格式硬盘后为只读的解决办法
    在Linux中正确处理从Windows系统拿来的硬盘从Windows系统拿下来的硬盘,放在Linux系统中以后,有时候它为只读,无法进行写入的操作。虽然这两个文件系统是不同的,但在一些Linux系统中,比如Ubuntu,已经最大限度地兼容了NTFS格式硬盘。硬盘换了系统之后变成只读的主要原因是,硬盘中隐藏的分......
  • linux扩展正则表达式()
    1.()含义linux扩展正则表达式()含义是找出“用户组”字符串;此外,()还可以用来作为“多个重复用户组”的识别2.样例命令1:grep-nE'p(wp|lp|np|dp)o'anaconda-ks.cfgORegrep-n 'p(wp|lp|np|dp)o'anaconda-ks.cfg#搜索包含(pwpo)、(plpo)、(pnpo)、(pdpo)字符串的行,因......
  • Linux UVC调试工具
    v4l2-utils:v4l2-utils是一个Linux下用于视频设备管理和调试的工具集,其中包含了一些命令行工具,可以用来查询、设置和调试视频设备。 ubuntu安装v4l2-utils:sudoapt-getinstallv4l-utils 下面是v4l2-utils的一些使用方法:#列出设备v4l2-ctl--list-devices......
  • Linux命令-xargs
    声明:本文框架和思路均参考阮一峰博客的xargs命令教程xargs通常用于将A命令的输出作为B命令的输入(参数),因为一些命令的参数无法使用标准输入(stdin)而只能使用命令行对于那些可以使用stdin作为参数的命令,我们并不需要xargs,直接使用|即可如cat/etc/shells|grepbash而对于不支......
  • 进程与线程
    1、使用ProcessBuilder类创建进程,用于打开:D:/数据库/新建文件夹/example.pdf文件。packagecom.processes.demo;importjava.io.IOException;//进程和线程是操作系统中的两个基本概念,它们都是用于执行程序的执行单元,但是有一些关键差异。//1.定义:进程是操作系统中资源分配......
  • Linux基础 环境变量 别名 快捷键 历史命令 命令提示符
    1.##重启网卡报错[root@localhost~]#systemctlrestartnetwork 2.[root@localhost~]#[]:为了将命令提示符内容,扩进去root:当前登录系统的用户是谁@:分隔符localhost:当前服务器的主机名~:当前所在的目录(~当前登录用户的家目录)#:用户身份(#代表超级用户$代表普通用户) 3......
  • linux后台运行及任务挂后台-linux亲测有效操作001
    由于命令行耗时太久,突然想把进程挂后台走人怎么办?01前台转到后台1.输入ctrl+z将该前台任务挂起^Z[1]+StoppedXXXXXXXX2.运行jobs命令,查看任务号(可以看到run.sh对应的任务号是1)jobs-l#-l显示pid......
  • Linux的学习之路:4、权限
    一、Linux权限的概念权限我们都熟悉,最常见的就是在看电视时需要vip这个就是权限,然后在Linux就是有两个权限,就是管理员也就是超级用户和普通的用户命令:su[用户名]功能:切换用户。例如,要从root用户切换到普通用户user,则使用suuser。要从普通用户user切换到root用户则使......
  • [转帖]【Linux】使用 apt-get 查询并安装指定版本的软件
    https://zhuanlan.zhihu.com/p/540712989 一、通过apt-get安装指定版本的软件$sudoapt-getinstallpackage=versionversion是软件版本号,package是要安装的软件二、查询指定软件有多少个版本1、通过网站搜索https://packages.ubuntu.com/2、使用apt-cachem......
  • JetBrains IDE 2024.1 (macOS, Linux, Windows) 发版 - 开发者工具
    JetBrainsIDE2024.1(macOS,Linux,Windows)-开发者工具CLion,DataGrip,DataSpell,Fleet,GoLand,IntelliJIDEA,PhpStorm,PyCharm,Rider,RubyMine,WebStorm请访问原文链接:JetBrainsIDE2024.1(macOS,Linux,Windows)-开发者工具,查看最新版。原创作品,转载请......