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

探秘 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 的世界里继续探索,发现更多的精彩!💻🌟

Read more

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

前言:通过结合腾讯云HAI 强大的云端运算能力与DeepSeek先进的 AI技术,本文介绍高效、便捷且低成本的设计一个自己的个人网页。你将了解到如何轻松绕过常见的技术阻碍,在腾讯云HAI平台上快速部署DeepSeek模型,仅需简单几步,就能获取一个包含个人简介、技能特长、项目经历及联系方式等核心板块的响应式网页。 目录 一、DeepSeek模型部署在腾讯云HAI 二、设计个人网页 一、DeepSeek模型部署在腾讯云HAI 把 DeepSeek 模型部署于腾讯云 HAI,用户便能避开官网访问限制,直接依托腾讯云 HAI 的超强算力运行 DeepSeek-R1 等模型。这一举措不仅降低了技术门槛,还缩短了部署时间,削减了成本。尤为关键的是,凭借 HAI 平台灵活且可扩展的特性,用户能够依据自身特定需求定制专属解决方案,进而更出色地适配特定业务场景,满足各类技术要求 。 点击访问腾讯云HAI控制台地址: 算力管理 - 高性能应用服务 - 控制台 腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力,只需简单的几步就能调用DeepSeek - R1

By Ne0inhk
AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk
如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

它是免费的——社区驱动的人工智能💪。         当 OpenAI 第一次推出定制 GPT 时,我就明白会有越来越多的人为人工智能做出贡献,并且迟早它会完全由社区驱动。         但从来没有想过它会如此接近😂让我们看看如何在 Windows 机器上完全免费使用第一个开源推理模型!  步骤 0:安装 Docker 桌面         我确信很多人已经安装了它,所以可以跳过,但如果没有 — — 这很简单,只需访问Docker 的官方网站,下载并运行安装 👍         如果您需要一些特定的设置,例如使用 WSL,那么有很多指导视频,请查看!我将继续下一步。 步骤 1:安装 CUDA 以获得 GPU 支持         如果您想使用 Nvidia 显卡运行 LLM,则必须安装 CUDA 驱动程序。(嗯……是的,它们需要大量的计算能力)         打开CUDA 下载页面,

By Ne0inhk
在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

本文将分步向您展示如何在本地安装和运行 DeepSeek、使用 CodeGPT 对其进行配置以及开始利用 AI 来增强您的软件开发工作流程,所有这些都无需依赖基于云的服务。  步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT         要在本地运行 DeepSeek,我们首先需要安装Ollama,它允许我们在我们的机器上运行 LLM,以及CodeGPT,它是集成这些模型以提供编码辅助的 VSCode 扩展。 安装 Ollama Ollama 是一个轻量级平台,可以轻松运行本地 LLM。 下载Ollama 访问官方网站:https://ollama.com * 下载适合您的操作系统(Windows、macOS 或 Linux)的安装程序。 * 验证安装 安装后,打开终端并运行: ollama --version  如果 Ollama 安装正确,

By Ne0inhk