探秘 Linux 进程状态:解锁系统运行的密码

 🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟  

🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩      


        在 Linux 系统的奇妙世界里,进程就像一个个忙碌的小工匠🧑‍🔧,各自承担着不同的任务。而进程状态呢,就像是这些小工匠的工作状态指示灯,告诉我们它们此刻是在辛勤劳作、稍作休息,还是遇到了什么问题。接下来,就让我们一起深入探究 Linux 进程状态的奥秘吧!


目录

💯进程状态的基础认知与内核视角

(一)操作系统中的进程状态概览

(二)Linux 内核里的进程状态定义

💯代码实例中的进程状态变化

(一)经典代码展示进程状态切换

(二)不同代码场景下进程状态的有趣差异

💯特殊进程状态的深度解读与应对之策

(一)磁盘休眠状态(D - disk sleep):深度睡眠的神秘面纱

(二)停止状态(T - stopped):进程暂停的神奇魔法

(三)僵尸状态(Z - zombie):进程的 “幽灵” 难题及解决办法

💯进程状态查看与监控的实用技巧 


💯进程状态的基础认知与内核视角

(一)操作系统中的进程状态概览

        在操作系统的大舞台上,进程状态可是关键角色。一般来说,有新建、就绪、运行、阻塞、终止这些常见状态。

        新建时,进程就像刚诞生的婴儿👶,系统给它准备好各种资源;就绪状态的进程则像等待上场比赛的运动员,随时准备在 CPU 这个赛场上一展身手;

        运行态的进程正在全力冲刺,执行着各种指令;

        阻塞态的进程就像遇到红灯的汽车🚗,暂时停下来等待某个事件完成;

        终止态的进程任务完成,功成身退,系统会回收它占用的资源。这些状态相互转换,共同维持着系统的正常运转。


(二)Linux 内核里的进程状态定义

        为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。

        Linux 内核源代码对进程状态有着独特的定义,其中R (running)S (sleeping)D (disk sleep)T (stopped)X (dead)Z (zombie)等状态是核心成员,它们都藏在task_state_array数组里。不同的进程状态代表着进程要做什么事。

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 */
};

进程状态查看:ps aux / ps axj 命令

为什么第一次状态是S,后面是R呢?? 

  •  因为进程运行速度很快,第一个打印的时候,一直都在等待显示器,所以显示Sleep状态

我们现在来看看S状态: 

 阻塞:

 

  • 运行状态(R - running)的真相揭秘:运行状态的进程不一定正在 CPU 上飞奔哦!它可能在 CPU 上努力工作,也可能在运行队列里排着队,等待调度器的召唤。调度器就像一个公正的裁判,通过复杂的调度算法,比如根据优先级或者时间片轮转,给每个运行态的进程公平的机会使用 CPU 资源。想象一下,在一个繁忙的工厂里,很多工人都想使用机器,调度器就是那个安排工人使用机器的管理员,确保每个工人都能有机会完成自己的工作,让系统高效地处理多个任务。
  • 睡眠状态(S - sleeping)与阻塞的紧密联系S (sleeping)状态的进程在等待某个特定事件结束,这和阻塞状态可是亲戚关系呢!当进程进行 I/O 操作时,它就会进入睡眠态,把 CPU 资源让出来,避免干等着浪费资源。比如说,当你从网上下载文件时,进程就会进入睡眠态,等待数据传输完成,等数据准备好了,它才会被唤醒,重新进入就绪队列,等待 CPU 再次调度它继续工作。

💯代码实例中的进程状态变化

(一)经典代码展示进程状态切换

看看下面这段简单的 C 代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ // 子进程printf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ // 父进程printf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

  • fork函数一执行,系统就像变魔术一样创建了子进程,这时候父子进程都进入了就绪态,眼巴巴地等着 CPU 来调度它们。就好像一群小朋友在排队等老师点名玩游戏一样,都很期待能快点轮到自己。
  • 等到printf函数执行的时候,进程可能会因为输出缓冲区的问题短暂阻塞,进入睡眠态。这是因为 CPU 太快了,而输出设备(比如显示器)反应没那么快,进程得等等显示器准备好才能继续。这就像你在给朋友发消息,消息发出去了,但要等朋友的手机接收到并显示出来,这个过程中你可能得稍微等一会儿。

(二)不同代码场景下进程状态的有趣差异

        对比一下只有while循环和有printf函数的while循环这两种代码情况。只有while循环时,进程就像一个不知疲倦的小陀螺,一直在 CPU 上转,处于运行态。但有printf函数的while循环就不一样了,因为printf要和显示器打交道,进程就经常得停下来等显示器,所以会频繁进入睡眠态。这就好比一个人在安静地看书(只有while循环),可以一直看下去;但如果他一边看书一边要和别人聊天(有printf函数),就得时不时停下来听对方说话,进程状态也就跟着变了。

💯特殊进程状态的深度解读与应对之策

(一)磁盘休眠状态(D - disk sleep):深度睡眠的神秘面纱

                        

  D (disk sleep)状态,也就是不可中断睡眠状态,是进程在等待磁盘 I/O 操作完成时的特殊状态。这个状态下的进程可固执了,对大多数信号都不理不睬,一心等着磁盘操作结束。比如说,在数据库往磁盘里存大量数据的时候,进程进入D状态,就算系统有点小问题或者资源紧张,它也不会轻易被打断,这样就能保证数据安全地写入磁盘,不会出现数据丢失或损坏的情况。这就像一个人在全神贯注地做手术,不能被外界干扰,确保手术顺利完成。

(二)停止状态(T - stopped):进程暂停的神奇魔法

  T (stopped)状态就像给进程按下了暂停键。通过发送SIGSTOP信号,进程就会乖乖地停在那里,不管它正在做什么。而SIGCONT信号就是继续播放键,能让它接着从暂停的地方继续干活。在调试程序的时候,这个功能可太好用了!开发人员就像电影导演一样,可以在关键的地方暂停进程,仔细查看程序的状态、变量的值,看看有没有什么问题,就像导演在拍摄电影时,会暂停画面检查每个细节是否完美。

(三)僵尸状态(Z - zombie):进程的 “幽灵” 难题及解决办法

        僵尸状态是进程退出后留下的一个小麻烦。当子进程完成任务退出后,内核会把它的一些信息(比如退出状态码)放在task_struct结构体里,等着父进程来取。要是父进程忘了调用waitwaitpid等系统调用获取子进程状态,子进程就变成了僵尸进程,一直占着系统资源。比如说在一个多进程的网络服务器里,如果父进程老是创建子进程却不回收,时间长了,僵尸进程越来越多,就像家里的垃圾不清理一样,会占用很多空间,导致系统变慢甚至崩溃。所以,父进程一定要记得及时清理子进程的资源,保持系统的整洁干净。

验证Z状态:

 

 如果父进程先退出:

为什么要被领养呢?


💯进程状态查看与监控的实用技巧 

         在 Linux 系统中,ps auxps axj命令就是我们查看进程状态的得力助手。

循环打印的命令:

while :; do ps axj | head -1 && ps axj |grep 'code'; sleep 1; done
  • ps aux能像一个详细的清单一样,把系统里所有进程的信息都展示出来,包括是谁启动的进程、用了多少 CPU 和内存、什么时候启动的、现在处于什么状态等等。
  • ps axj命令更厉害,它还能告诉我们进程之间的关系,比如会话 ID、父进程 ID 等。就好像给我们画了一张家族树,让我们清楚地看到每个进程的 “亲戚关系”。

当系统出现问题或者我们想了解某个进程的情况时,用这两个命令就能快速找到我们需要的信息,帮助我们解决问题。


        通过这次对 Linux 进程状态的深入探索,我们揭开了它神秘的面纱,从理论到实践,从常见状态到特殊状态,再到如何查看和监控,都有了全面的了解。这不仅让我们更懂 Linux 系统的运行机制,在遇到问题时也能更从容地应对,就像拥有了一把万能钥匙,可以打开系统运行的各种秘密大门🚪。希望大家在 Linux 的世界里继续探索,发现更多的精彩!💻🌟

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

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

相关文章

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

鸿蒙产业学院正式揭牌!软通动力与深信息签署校企合作框架协议

12月27日&#xff0c;深圳信息职业技术学院&#xff08;简称“深信息”&#xff09;与软通动力信息技术&#xff08;集团&#xff09;股份有限公司&#xff08;简称“软通动力”&#xff09;正式签署校企合作框架协议&#xff0c;并共同揭牌成立鸿蒙产业学院。深信息校长王晖&a…

python轻量级框架-flask

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 Web 框架…

2024年河北省职业院校技能大赛 “信息技术应用创新赛项”(高职组)样题解法

​有问题请留言或主页私信咨询 2024年河北省职业院校技能大赛 “信息技术应用创新赛项”&#xff08;高职组&#xff09;样题 一、初始化环境 1.账号及默认密码如表1所示。 表1 账号及密码规划表 账 号密 码root&#xff08;服务端&#xff09;kylin2024!desk&#xff08…

gozero获取数据库内容报错解决方案与实践

这个错误通常出现在 Go 语言的数据库查询中&#xff0c;表示你尝试将一个不支持的数据类型&#xff08;[]uint8&#xff0c;即字节切片&#xff09;存储到一个 Go 类型&#xff08;*time.Time&#xff09;中。具体来说&#xff0c;create_time 列的类型可能是 DATETIME 或 TIME…

【学习笔记15】如何在非root服务器中,安装属于自己的redis

一、下载安装包 官网下载黑马程序员给的安装包&#xff08;redis-6.2.6&#xff09; 二、将安装包上传至服务器 我将安装包上传在我的文件夹/home/XXX&#xff0c;指定路径中/src/local/redis/&#xff0c;绝对路径为/home/XXX/src/local/redis/解压安装包 XXXomega:~$ cd …

PotPlayer 配置安装

文章目录 一、下载1、官网链接2、微软商店 Microsoft Store 二、安装1、双击安装包2、选择字体3、安装向导下一步4、接收许可协议5、选择组件及关联6、选择安装位置7、硬解选项 三、设置1、关闭自动更新2、左键单双击设置3、视频下自动隐藏3.1、效果对比 4、播放信息显示设置4.…

【PCIe 总线及设备入门学习专栏 2 -- PCIe 的 LTSSM 和 Enumeration】

文章目录 OverviewLTSSM StatesDetect StatesDETECT_QUIETDETECT_ACTDETECT_WAITPolling StatesPOLL_ACTIVEPOLL_CONFIGPOLL_COMPLIANCEConfiguration StatesCONFIG_LINKWD_STARTCONFIG_LINKWD_ACCEPTCONFIG_LANENUM_WAITCONFIG_LANENUM_ACCEPTCONFIG_COMPLETECONFIG_IDLERecov…

STM32 FreeROTS Tickless低功耗模式

低功耗模式简介 FreeRTOS 的 Tickless 模式是一种特殊的运行模式&#xff0c;用于最小化系统的时钟中断频率&#xff0c;以降低功耗。在 Tickless 模式下&#xff0c;系统只在有需要时才会启动时钟中断&#xff0c;而在无任务要运行时则完全进入休眠状态&#xff0c;从而降低功…

【机器学习实战中阶】书籍推荐系统

图书推荐系统机器学习项目 通过这个机器学习项目&#xff0c;我们将构建一个图书推荐系统。对于这个项目&#xff0c;我们将使用 K 最近邻&#xff08;K-Nearest Neighbor, KNN&#xff09;算法。 让我们开始构建这个系统。 数据集说明 关于数据集 背景 在过去的几十年中…

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…

【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

文本摘要研究:从统计方法到大型语言模型

论文地址&#xff1a;https://arxiv.org/pdf/2406.11289 &#x1f4d6; 文本摘要研究&#xff1a;从统计方法到大型语言模型 近年来&#xff0c;文本摘要研究经历了多次重大变革&#xff0c;从深度神经网络的出现到预训练语言模型&#xff08;PLMs&#xff09;&#xff0c;再到…

MYSQL 5.7数据库,关于1067报错 invalid default value for,解决方法!

???作者&#xff1a; 米罗学长 ???个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 ???各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot&#xff0c;mysql等项目&#xff0c;源码丰富&#xff0c;欢迎咨询。 ???…

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS&#xff1f; CppCMS 是一个高性能的 C Web 开发框架&#xff0c;专为构建快速、动态的网页应用而设计&#xff0c;特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails&#xff0c;但针对 C 提供了更细粒度的控制和更高效的性能。…

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇&#xff1a;一文大白话讲清楚啥是个webpack第二篇&#xff1a;一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建然后看本篇&#xff0c;Loader的配置…

Kafka 日志存储 — 日志索引

每个日志分段文件对应两个索引文件&#xff1a;偏移量索引文件用来建立消息偏移量到物理地址之间的映射&#xff1b;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…

空调可视化监控与管理系统

随着智能化技术的不断发展&#xff0c;空调系统作为现代建筑、工业和商业场所的核心设备&#xff0c;正在从传统管理模式向智能化管理迈进。无论是大型商业楼宇、工业厂房&#xff0c;还是数据中心的精密空调&#xff0c;如何通过智能监控和高效管理降低能耗、提升运行效率&…