当前位置: 首页 > article >正文

探秘 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.kler.cn/a/512316.html

相关文章:

  • 从零开始:Spring Boot核心概念与架构解析
  • postman请求参数化
  • Jenkins-pipeline Jenkinsfile说明
  • 前沿技术趋势洞察与分析:探寻科技变革的多维密码
  • 鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象
  • 高等数学:映射与函数
  • 算法6(力扣148)-排序链表
  • lvm快照备份
  • 【优选算法】----移动零
  • Grafana 统一可视化了,告警如何统一?
  • 【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程
  • Python----Python高级(文件操作open,os模块对于文件操作)
  • LLM大语言模型的分类
  • 通信协议—WebSocket
  • 电子应用设计方案97:智能AI投影仪系统设计
  • uniapp时间组件
  • 回归算法、聚类算法、决策树、随机森林、神经网络
  • Kafka面试题----Kafka都有哪些特点
  • Lightning初探
  • Go channel关闭方法
  • JAVA-IO模型的理解(BIO、NIO)
  • 在VSCode中使用Jupyter Notebook
  • Centos 8 交换空间管理
  • LeetCodeHOT100:60. n个骰子的点数、4. 寻找两个正序数组的中位数
  • 以“智慧建造”为理念,综合应用云、大、物、移、智等数字化技术的智慧工地云平台源码
  • 愿景是什么?