进程状态:Linux的幕后指挥管理,穿越操作系统进程的静与动

文章目录

  • 引言:进程的生命与状态:动与静的交响曲
  • 一、操作系统中的进程状态概述
    • 1.1 经典的进程状态模型
    • 1.2 进程状态转换图
  • 二、Linux操作系统中的进程状态
    • 2.1 Linux进程状态的分类
    • 2.2 各状态的详细解释
  • 2.3 Linux进程状态表
  • 2.4 使用ps查看进程状态
  • 三、进程状态具体分析
    • 🖋️运行 R
    • 🖋️睡眠 S
    • 🖋️休眠 D
    • 🖋️暂停 T
    • 🖋️死亡 X
    • 🖋️僵尸 Z
    • 📖孤儿进程
  • 总结:进程状态的舞蹈

在这里插入图片描述

引言:进程的生命与状态:动与静的交响曲

每一个进程都拥有自己的生命轨迹,它们在CPU的调度下,按照某种规律从一个状态转变到另一个状态。这些状态是进程在操作系统内存空间中的各种“存在形式”,是它们生命周期的不同表现,承载着操作系统对每个进程的管理与调度。

在Linux这个庞大而复杂的宇宙中,每个进程如同宇宙中的星辰,承载着数据流动与信息处理的重任。而它们的生命周期,却不仅仅是简单的“开始”与“结束”。在这无尽的天际,进程的状态不断变化,如同风中的细沙,或稳静、或急躁、或急促、或安逸。今天,我们将一同探索,深入理解Linux操作系统中进程状态的神秘面纱。

一、操作系统中的进程状态概述

操作系统中的进程状态是进程在生命周期中可能处于的不同状态。这些状态帮助操作系统识别进程的运行情况,并在不同状态间进行合理的资源分配

操作系统中的经典进程状态包括就绪运行阻塞终止

1.1 经典的进程状态模型

典型的操作系统中,进程状态可以分为以下几种:
在这里插入图片描述
在这种经典模型中,进程会在不同状态之间流转。具体来说:

就绪 -> 运行:CPU调度器分配CPU给就绪状态的进程。
运行 -> 阻塞:进程等待I/O或其他资源时进入阻塞状态。
阻塞 -> 就绪:等待的条件满足后,进程重新进入就绪队列,等待CPU调度。
运行 -> 终止:进程执行完毕或异常终止,进入终止状态。

1.2 进程状态转换图

在这里插入图片描述
该图展示了一个经典进程状态的转换流程。箭头表示进程状态转换的可能路径。

二、Linux操作系统中的进程状态

Linux操作系统在经典的进程状态基础上进行了一系列扩展,允许内核更细粒度地控制进程,尤其是当系统资源紧张或多任务并发性很高时。Linux内核中的进程状态可以使用ps命令或读取/proc文件系统来查看进程的状态信息。

2.1 Linux进程状态的分类

在这里插入图片描述
在进程的task_struct结构体中,state字段用来表示进程的当前状态。根据内核中的定义,不同状态的进程会被挂载在不同的等待队列上,以实现细粒度的调度与控制。

而在我们 Linux 中,新建就绪运行都可以看作 运行 R 这一个状态,所以比较清晰

在这里插入图片描述

2.2 各状态的详细解释

  • TASK_RUNNING:进程正在运行或准备运行。它可以被调度器分配到CPU执行。TASK_RUNNING的进程始终是就绪队列的一部分。

  • TASK_INTERRUPTIBLE:进程处于可中断等待状态,等待某一条件满足。进程在此状态下可以被信号唤醒。(关于信号的知识我们在后面会讲)

  • TASK_UNINTERRUPTIBLE:进程处于不可中断的等待状态。这通常用于等待特定资源(例如设备I/O操作完成)。进程在此状态下不会被信号打断,即便外部发送信号也不会响应。

  • TASK_STOPPED:进程被暂停,通常是由于接收到SIGSTOP信号或调试器干预,等待继续或恢复信号。

  • TASK_TRACED:进程被调试工具(如gdb)跟踪和控制。此状态下的进程会暂停,直到调试器进一步控制。

  • EXIT_DEAD:进程终止后进入清理阶段,等待系统回收资源

  • EXIT_ZOMBIE:进程已结束,系统未回收其资源。僵尸进程会保留在系统中,直到其父进程调用wait()系统调用收集它的退出状态。

  • TASK_DEAD:表示进程已彻底结束,系统已回收其所有资源。

2.3 Linux进程状态表

在这里插入图片描述

2.4 使用ps查看进程状态

在Linux系统中,可以通过ps命令查看进程的状态:

ps -aux

在这里插入图片描述
ps命令会显示每个进程的详细信息,其中状态列标记着每个进程的状态。状态的含义如下:

  • R : 运行或就绪状态
  • S:可终止等待
  • D: 不可终止等待
  • Z: 僵尸进程,等待回收
  • X:终止死亡进程
  • T: 停止状态

我们也可以通过ps命令查看某个指定的进程的信息:

ps axj | grep 进程名字

三、进程状态具体分析

🖋️运行 R

首先来看看第一种状态 R
以我们以往的认知来说,一个程序在运行就表示该 进程 处于 运行 状态,那么事实真的如此吗?

先来看看下面这段代码:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{while(1){cout << "I'm a process, my PID is:" << getpid() << endl;sleep(1);}return 0;
}

当前makefile文件为:

myProcess:test.cppg++ -o myProcess test.cpp.PHONY:catPI
catPI:ps ajx | head -1 && ps ajx | grep myProcess | grep -v grep .PHONY:clean
clean:rm -r myProcess

通过 make catPI 指令调用 Makefile 中提前设定好的指令,查看当前进程信息
在这里插入图片描述
可以看到当前的进程状态为 睡眠 S+
注: + 表示当前进程在前台运行中

进程 难道没有运行吗?

运行了,但我们 很难捕捉到 对于 CPU 来说,将这么简单的一句话输出到屏幕上是一件很小的事,可能几毫秒就完成了 而其他大多数时间,进程
都在外设等待队列中 排队 当我们将打印语句和睡眠语句屏蔽后,进程 不用在等待队列中 排队, CPU 就一直在处理死循环,此时可以观察到 运行R 状态

在这里插入图片描述

🖋️睡眠 S

睡眠 S 的本质就是 进程阻塞表示此时进程因等待某种资源而暂停运行

睡眠 S 又称为可中断休眠,当 进程 等待时间过长时,我们可以手动将其关闭,应用卡死后强制关闭也是这个道理

在这里插入图片描述
还有一种方式终止进程:kill

  • kill -9 PID 终止进程,当进程在后台运行时(状态不加 +),我们是无法通过 ctrl+c 终止的,但kill指令可以终止

🖋️休眠 D

还存在一种特殊睡眠状态 休眠 D休眠 又被称为不可中断休眠,顾名思义,休眠 D 状态下的 进程 是无法终止的,kill 指令和 OS都无能为力,只能默默等待 进程阻塞 结束,拿到资源了,进程 才会停止 休眠 D 状态

终止 休眠 D 进程的一个方法就是切断电源,此时进程是结束了,但整个系统也结束了

🖋️暂停 T

我们还可以使 进程 进入 暂停 T 状态

  • kill -19 PID 暂停进程
  • kill -18 PID 恢复进程

在输入暂停指令后,进程进进入暂停状态

在这里插入图片描述
在这里插入图片描述
我们可以通过 kill -18 PID 使 进程 恢复运行,恢复后的 进程 在后台运行

可以看到,恢复后进程继续执行,并且状态由T变为S
在这里插入图片描述
注意: 进程 在后台运行时,是无法通过 ctrl+c·指令终止的,只能通过 kill -9 PID 终止

在 gdb 中调试代码时,打断点实际上就是 使 进程 在指定行暂停运行,此时 进程 处于 追踪暂停状态 t

在这里插入图片描述
在这里插入图片描述

🖋️死亡 X

当进程被终止后,就处于 死亡 X 状态

死亡状态是无法在任务列表中观察到的,死亡 X 状态只是一个返回状态

🖋️僵尸 Z

与死亡状态相对应的还有一个 僵尸 Z 状态

  • 通俗来说,僵尸状态 是给 父进程 准备的
  • 当 子进程 被终止后,会先维持一个 僵尸 状态,方便 父进程 来读取到 子进程 的- 退出结果,然后再将 子进程 回收
  • 单纯的在 bash 环境下终止 子进程,是观察不到 僵尸状态 的,因为 bash 会执行回收机制,将 僵尸 回收
  • 我们可以利用 fork() 函数自己创建 父子进程 关系,观察到这一现象

代码示例如下:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{pid_t ret = fork();if(ret == 0){while(1){cout << "I'm son process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else if(ret > 0){while(1){cout << "I'm father process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else{while(1){cout << "Make son process fail!" << endl;sleep(1);}}return 0;
}

此时进程开始执行
在这里插入图片描述
此时父子进程都处于常规睡眠状态
在这里插入图片描述
此时输入指令 kill -9 PIDkill -9 1007716终止 子进程
再次查看进程状态:
在这里插入图片描述
僵尸进程如果不被回收,会导致内存泄漏问题和标识符占用问题

📖孤儿进程

孤儿进程是一种特殊的进程状态

  • 通过程序创建 父子进程
  • 通过指令终止 父进程,此时 子进程 会被OS领养
  • 子进程 的 父进程 变为 1号进程
  • 子进程 就变成了一个 孤儿进程

同样执行上述代码,起初都正常运行
在这里插入图片描述
现在我们消灭父进程,观察其执行结果和运行状态
在这里插入图片描述
可以看到子进程被1号进程领养
在这里插入图片描述
假设 子进程 不被 1号进程 领养

  • 子进程 退出时就会无人回收,成为一只游离的僵尸
  • 僵尸进程 有 内存泄漏 的风险
  • 因此 子进程 会被OS领养

总结:进程状态的舞蹈

Linux操作系统中的进程状态,不仅仅是抽象的计算机术语,它们是系统中每个进程生命周期的具体体现。正如一场精彩的舞蹈,每个进程都有自己的节奏和步伐,它们或快速跃动,或缓慢舞动,或瞬间消失,而每个转变都与操作系统对资源的调度和管理息息相关。

通过理解进程状态与状态转变的过程,我们能够更好地把握Linux系统的脉搏,掌握进程管理与调度的奥秘这不仅是操作系统中的技术问题,更是数字世界中的一场优雅的舞蹈。

本篇关于进程状态的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…

基于深度学习的图像超分辨率技术研究与实现

一、引言 在数字图像处理领域&#xff0c;图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高&#xff0c;如何将低分辨率图像提升到高分辨率&#xff0c;同时保持图像的细节和清晰度&#xff0c;成为了一个极具挑战性的问题。传统的图像超分辨率…

构建高可用性西门子Camstar服务守护者:异常监控与自愈实践

在智能制造领域,西门子Camstar作为领先的MES系统承载着关键生产业务。但在实际运维中,我们发现其服务常因数据库负载激增(如SQL阻塞链超时)或应用服务器资源耗尽(CPU峰值达90%以上)导致服务不可用。传统人工干预方式平均故障恢复时间长达47分钟,这对连续生产场景构成了严…

Java Collection API增强功能系列之二 List.of、Set.of、Map.of

Java 9集合工厂方法&#xff1a;用List.of、Set.of、Map.of创建安全不可变集合 Java 9引入了革命性的集合工厂方法List.of、Set.of和Map.of&#xff0c;彻底改变了开发者创建小型不可变集合的方式。这些方法不仅语法简洁&#xff0c;还在安全性和性能上实现了质的飞跃。本文将…

网络通信微服务

网络通信 VPN 服务器分配内网 IP&#xff0c;加密所有流量,以使用外网访问内网资源 使用了VPN只是第一关&#xff0c;只进入了人家的大厅&#xff0c;只可以访问公共服务&#xff08;像是只可以在人间公司的大厅里溜达&#xff09;&#xff0c;若想要访问人家提供的高级服务&a…

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…

算法 | 蜣螂优化算法原理,引言,公式,算法改进综述,应用场景及matlab完整代码

蜣螂优化算法(Dung Beetle Optimizer, DBO)详解 1. 算法原理 蜣螂优化算法(DBO)是一种基于自然界蜣螂行为的元启发式优化算法,灵感来源于蜣螂的滚球、繁殖、觅食和偷窃行为。其核心思想是通过模拟蜣螂在复杂环境中的协作与竞争机制,解决全局优化问题。关键行为模拟: 滚球…

uniapp开发实战自定义组件形式实现自定义海报功能

在 UniApp 中实现自定义海报功能,可以通过 Canvas 来绘制海报。Canvas 提供了丰富的绘图 API,可以精确控制文字、图片和二维码的位置。下面是一个完整的示例,展示如何创建一个自定义海报组件。 项目结构 假设你的项目结构如下: project-root/ ├── pages/ │ └──…

dockerfile构建镜像方式

在 Docker 中&#xff0c;可使用 docker build 命令依据 Dockerfile 构建镜像。下面为你详细介绍构建镜像的具体方式。 基本构建命令 若要构建镜像&#xff0c;需在包含 Dockerfile 的目录下执行 docker build 命令。基本语法如下&#xff1a; bash docker build -t <镜像…

STM32F103_LL库+寄存器学习笔记10 - DMA传输过半+DMA传输完成中断实现DMA串口接收“双缓冲“

导言 《[[STM32F103_LL库寄存器学习笔记09 - DMA串口接收与DMA串口发送&#xff0c;串口接收空闲中断]]》上一章节完成DMA发送与接收。此时&#xff0c;有一个致命的问题可能会导致数据包丢失。原因是USART1接收只开启了接收空闲中断(IDLE)&#xff0c;DMA在连续模式下&#xf…

李宏毅机器学习笔记06 | 鱼和熊掌可以兼得的机器学习 - 内容接宝可梦

本章提要 深度学习可以在较少参数量的情况下得到比较低的loss&#xff1a; h a l l a r g min ⁡ h ∈ H L ( h , D a l l ) h^{all}arg \min_{h \in H}L(h,D_{all}) hallargminh∈H​L(h,Dall​) 引入 如何权衡模型的复杂程度 Tradeoff of Model Complexity 理论上&#…

java八股文之JVM

1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”&#xff0c;记录每个线程当前执行的指令位置&#xff0c;确保程序流程的连续性和线程切换的准确性。线程私有的&#xff0c;每个线程一份&#xff0c;内部保存的字节码的行号。用于记录正在执行的字节码指令的地…

Android设计模式之观察者模式

一、定义&#xff1a;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新。 二、核心角色&#xff1a; Subject&#xff1a;抽象主题被观察的角色&#xff0c;管理观察者集合&#xff0c;提供注册…

海康gdb流程

gdb相关 在initrun.sh文件里加入&#xff0c;注意需要在hikauto起来之前 # 设置core dump大小 ulimit -c unlimited if [ $? -eq 0 ];then echo "core dump size set success" else echo -e "\33[31m core dump size set fail\33[0m" fi echo …

springBoot统一响应类型3.3版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

【空间变换】欧拉角与四元数

核心 欧拉角描述的是一种变换&#xff0c;只关注变换后的结果&#xff0c;不关注变换过程中的运动 而四元数不仅良好地表示了一种变换&#xff0c;也很好地表示了一种运动过程&#xff0c;又避免了万向节死锁Gimbal Lock变换顺序&#xff0c;是欧拉角变换的一部分&#xff0c;…

基于Linux下的MyBash命令解释器

项目介绍&#xff1a;⼀个⽤C语⾔实现的简单shell&#xff0c;可以接受⽤⼾输⼊的命令并执⾏操作&#xff0c;⽀持多管道和重 定向。 mybash---打造自己的命令解释器 目前我们Linux的系统默认的命令解释器是bash; 命令解释器&#xff08;也称为命令行解释器或shell&#xff0…

Linux常见使用场景

一、文件查看与内容操作 ​1. cat ​作用&#xff1a;查看文件内容&#xff08;一次性输出全部内容&#xff09;。​常用选项&#xff1a; -n&#xff1a;显示行号。-b&#xff1a;仅对非空行显示行号。 ​示例&#xff1a; cat file.txt # 查看文件内容 cat -n fil…

Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读

摘要&#xff1a;重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题&#xff0c;可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…

禅道后台命令执行漏洞

漏洞简介 禅道是第一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、 组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整地覆盖了项目管理的核心流程。 禅道管理思想注重实效&#xff0c;功能完备丰富&#xff0c;…