轻松看懂Linux 内核进程管理之进程ID

本文详细探讨了Linux内核中进程ID的管理,包括PID类型(PID, TGID, PGID, SID)、PID命名空间的层次结构、内核如何使用task_struct数据结构管理进程ID,以及相关管理函数。重点讲述了如何通过数据结构和算法快速查找和分配进程ID,并解释了命名空间如何增加了PID管理的复杂性。" 73176467,1454895,Android Oprofile 分析系统性能,"['Android开发', '性能优化', '系统分析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注该数据结构如何来组织和管理进程ID的。

进程ID类型

要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型:

PID:这是 Linux 中在其命名空间中唯一标识进程而分配给它的一个号码,称做进程ID号,简称PID。在使用 fork 或 clone 系统调用时产生的进程均会由内核分配一个新的唯一的PID值。

TGID:在一个进程中,如果以CLONE_THREAD标志来调用clone建立的进程就是该进程的一个线程,它们处于一个线程组,该线程组的ID叫做TGID。处于相同的线程组中的所有进程都有相同的TGID;线程组组长的TGID与其PID相同;一个进程没有使用线程,则其TGID与PID也相同。

PGID:另外,独立的进程可以组成进程组(使用setpgrp系统调用),进程组可以简化向所有组内进程发送信号的操作,例如用管道连接的进程处在同一进程组内。进程组ID叫做PGID,进程组内的所有进程都有相同的PGID,等于该组组长的PID。

SID:几个进程组可以合并成一个会话组(使用setsid系统调用),可以用于终端程序设计。会话组中所有进程都有相同的SID。

PID 命名空间

命名空间是为操作系统层面的虚拟化机制提供支撑,目前实现的有六种不同的命名空间,分别为mount命名空间、UTS命名空间、IPC命名空间、用户命名空间、PID命名空间、网络命名空间。命名空间简单来说提供的是对全局资源的一种抽象,将资源放到不同的容器中(不同的命名空间),各容器彼此隔离。命名空间有的还有层次关系,如PID命名空间,图1 为命名空间的层次关系图。

在上图有四个命名空间,一个父命名空间衍生了两个子命名空间,其中的一个子命名空间又衍生了一个子命名空间。以PID命名空间为例,由于各个命名空间彼此隔离,所以每个命名空间都可以有 PID 号为 1 的进程;但又由于命名空间的层次性,父命名空间是知道子命名空间的存在,因此子命名空间要映射到父命名空间中去,因此上图中 level 1 中两个子命名空间的六个进程分别映射到其父命名空间的PID 号5~10。

命名空间增大了 PID 管理的复杂性,对于某些进程可能有多个PID——在其自身命名空间的PID以及其父命名空间的PID,凡能看到该进程的命名空间都会为其分配一个PID。因此就有:

全局ID:在内核本身和初始命名空间中唯一的ID,在系统启动期间开始的 init 进程即属于该初始命名空间。系统中每个进程都对应了该命名空间的一个PID,叫全局ID,保证在整个系统中唯一。

局部ID:对于属于某个特定的命名空间,它在其命名空间内分配的ID为局部ID,该ID也可以出现在其他的命名空间中。

【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份 价值699的内核资料包(含视频教程、电子书、实战项目及代码)
<think>好的,用户之前问过为什么开多布控会卡死但NPU占用不高,我之前详细分析了可能的原因和解决步骤,包括建议他们使用top命令来监控资源。现在用户的新问题是“看不懂这个top的界面”,这说明他们在执行之前的建议时遇到了困难,需要帮助理解top命令的输出。 首先,我需要确认用户对top命令的熟悉程度。用户可能刚开始接触Linux系统监控工具,所以需要以简单明了的方式解释。用户的主要困惑在于界面中的各个参数和数据的含义,比如负载、CPU、内存、进程列表等。 接下来,我要分解top界面的各个部分,逐一解释每个区域的作用。用户可能对术语如“负载平均值”、“%Cpu(s)”、“KiB Mem”等感到陌生,需要用通俗易懂的语言说明。同时,用户可能需要知道如何操作top,比如退出或排序进程,所以需要给出基本操作指令。 另外,用户可能在使用top时遇到了具体的问题,例如不知道哪些指标是关键,或者如何识别资源瓶颈。结合他们之前的问题,可能需要特别强调如何通过top发现CPU或内存的瓶颈,比如某个进程的高CPU占用率或内存不足的情况。 还需要考虑用户的使用场景,他们可能是在进行系统调试或优化,所以需要将top的信息与之前的问题关联起来。例如,当用户运行多个布控任务时,如何通过top发现CPU或内存的瓶颈,从而采取相应的优化措施。 最后,要确保解释清晰、结构合理,可能采用分步骤的方式,先介绍各个区域,再说明关键指标,最后给出操作建议。避免使用过多的技术术语,尽量用比喻或例子帮助理解。同时,提供退出命令和排序方法,方便用户实际操作。</think>以下是`top`命令界面的**分步解析**,帮助你快速理解关键信息: --- ### **一、`top`界面整体结构** ```plaintext top - 14:20:03 up 2 days, 3:45, 2 users, load average: 1.02, 0.98, 0.85 Tasks: 256 total, 1 running, 255 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.6 us, 2.3 sy, 0.0 ni, 91.9 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15928.2 total, 1024.3 free, 4096.2 used, 10807.7 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 11520.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 root 20 0 10.3g 2.1g 12345 S 45.6 6.3 12:34.56 python 5678 user 20 0 12345 6789 9012 S 2.3 0.1 0:12.34 nginx ``` --- ### **二、关键区域详解** #### **1. 第一行:系统概况** - **`14:20:03`**:当前时间 - **`up 2 days, 3:45`**:系统已运行时间(2天3小时45分钟) - **`load average: 1.02, 0.98, 0.85`**: - **系统负载**:1分钟、5分钟、15分钟内的平均活跃进程数 - **判断标准**:若值 > CPU核心数(如4核CPU负载>4),表明系统过载。 #### **2. 第二行:任务状态** - **`Tasks: 256 total`**:总进程数 - **`1 running`**:正在运行的进程数 - **`255 sleeping`**:休眠(等待资源)的进程数 - **`0 stopped/zombie`**:已停止或僵尸进程(异常需关注)。 #### **3. 第三行:CPU使用率** - **`us`**:用户态程序占用CPU百分比(**你的应用代码**) - **`sy`**:内核态占用(**系统调用、中断**) - **`id`**:空闲率 - **`wa`**:I/O等待(若长期>10%,磁盘/网络可能瓶颈) - **`st`**:虚拟机被宿主机占用的CPU时间(仅虚拟机有效)。 #### **4. 第四、五行:内存与交换分区** - **`Mem`**:物理内存 - `total`:总量 - `free`:完全空闲内存 - `buff/cache`:缓存/缓冲区占用(Linux会自动利用空闲内存加速I/O) - **`Swap`**:虚拟内存(磁盘空间模拟的内存) - **若`used`持续增长**:物理内存不足,系统开始卡顿。 #### **5. 进程列表(按CPU占用排序)** - **`PID`**:进程ID - **`%CPU`**:进程占用的CPU百分比(**总和可超过100%**,因多核) - **`%MEM`**:进程占用的物理内存百分比 - **`S`**:进程状态(`R`=运行, `S`=休眠, `Z`=僵尸) - **`COMMAND`**:进程名称(如`python`、`nginx`)。 --- ### **三、操作技巧** 1. **退出`top`**:按 `q` 键 2. **切换排序**: - 按 `P`(按CPU占用排序,默认) - 按 `M`(按内存占用排序) 3. **筛选进程**:按 `u` 后输入用户名,仅显示该用户的进程 4. **高亮关键列**:按 `b` 键切换高亮(如红色标记高CPU进程)。 --- ### **四、快速诊断卡死问题** 1. **观察指标优先级**: - **`%CPU` > 80%**:某个进程占用过高(如Python脚本) - **`wa` > 10%**:磁盘I/O瓶颈(检查硬盘性能) - **`free`内存接近0**:内存不足,触发Swap交换 - **`load average` > CPU核心数**:系统过载。 2. **示例场景**: - **现象**:布控任务卡死时,`top`显示`wa=25%`且某个进程`%CPU=90%` - **结论**:同时存在CPU计算瓶颈和磁盘I/O瓶颈。 --- ### **五、延伸工具推荐** - **`htop`**:增强版`top`,支持鼠标操作和颜色标记(安装命令:`sudo apt install htop`) - **`glances`**:综合监控工具,显示更直观(安装:`pip install glances`)。 如果需要进一步分析某个`top`截图,可以粘贴具体内容,我会帮你解读关键问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值