保定建设环境项目网站,网络营销整合推广,淘客的手机网站,开发公司送物业费的协议#x1f31f; 快来参与讨论#x1f4ac;#xff0c;点赞#x1f44d;、收藏⭐、分享#x1f4e4;#xff0c;共创活力社区。#x1f31f; #x1f6a9;用通俗易懂且不失专业性的文字#xff0c;讲解计算机领域那些看似枯燥的知识点#x1f6a9; 在 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结构体里等着父进程来取。要是父进程忘了调用wait或waitpid等系统调用获取子进程状态子进程就变成了僵尸进程一直占着系统资源。比如说在一个多进程的网络服务器里如果父进程老是创建子进程却不回收时间长了僵尸进程越来越多就像家里的垃圾不清理一样会占用很多空间导致系统变慢甚至崩溃。所以父进程一定要记得及时清理子进程的资源保持系统的整洁干净。 验证Z状态 如果父进程先退出 为什么要被领养呢 进程状态查看与监控的实用技巧 在 Linux 系统中ps aux和ps axj命令就是我们查看进程状态的得力助手。
循环打印的命令
while :; do ps axj | head -1 ps axj |grep code; sleep 1; done ps aux能像一个详细的清单一样把系统里所有进程的信息都展示出来包括是谁启动的进程、用了多少 CPU 和内存、什么时候启动的、现在处于什么状态等等。ps axj命令更厉害它还能告诉我们进程之间的关系比如会话 ID、父进程 ID 等。就好像给我们画了一张家族树让我们清楚地看到每个进程的 “亲戚关系”。 当系统出现问题或者我们想了解某个进程的情况时用这两个命令就能快速找到我们需要的信息帮助我们解决问题。 通过这次对 Linux 进程状态的深入探索我们揭开了它神秘的面纱从理论到实践从常见状态到特殊状态再到如何查看和监控都有了全面的了解。这不仅让我们更懂 Linux 系统的运行机制在遇到问题时也能更从容地应对就像拥有了一把万能钥匙可以打开系统运行的各种秘密大门。希望大家在 Linux 的世界里继续探索发现更多的精彩