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

【进程与线程】进程的PID

什么是 PID?

PID(Process Identifier,进程标识符)是操作系统为每个进程分配的一个唯一标识,用于标识系统中的每个进程。PID 是一个非负整数,通常从 1 开始分配;每个运行中的进程都有一个唯一的 PID,通过 PID,操作系统可以区分不同的进程并对它们进行管理。

简单点理解为 操作系统为进程分配的身份证号。


PID 的作用

  1. PID 是进程的唯一标识,操作系统通过 PID 来区分和管理进程;用户和管理员可以通过 PID 操作特定的进程(如通过 kill 命令终止进程)。
  2. 用于进程间通信:一些进程间通信(如信号传递)需要使用 PID 确定目标进程。
  3. 系统调试与监控:系统管理员或开发者可以通过 PID 来监控进程的状态(如 CPU 使用率、内存占用等)。

PID是唯一标识进程,帮助操作系统管理和调度进程,在开发中,PID 被广泛用于进程间通信、调试、监控和操作系统管理。


PID 的分配

操作系统在创建进程时,为每个进程分配一个唯一的 PID。
PID分配规则:顺序分配 —> PID 的分配通常是递增的,但当最大值达到后,会从最小值重新分配未使用的 PID。

常见的 PID 分配范围

Linux/Unix 系统:PID 的默认范围是 1 到 32768(可以通过修改 /proc/sys/kernel/pid_max 调整最大值,例如扩展到 4194304)。
Windows 系统:PID 通常为一个 32 位整数。

特殊的 PID
  • PID 0:表示内核调度程序(不是普通进程)。
  • PID 1:表示 init 进程(Linux/Unix 系统中的第一个用户态进程,负责启动其他进程)。
  • PID 2~N:用于其他系统进程和用户进程。

获取 PID 的方法

(1)在程序中获取当前进程的 PID(Unix/Linux 系统):
C:

#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid = getpid();  // 获取当前进程的 PID
    printf("Current PID: %d\n", pid);
    return 0;
}

Python:

import os
print(f"Current PID: {os.getpid()}")

(2)通过命令获取进程的 PID
使用 ps 命令:

ps -e    # 显示所有进程及其 PID
ps -ef   # 显示详细的进程信息
ps -aux  # 显示所有进程的详细信息

使用 tophtop:通过实时监控工具查看正在运行的进程及其 PID。
使用 pidof 命令:

pidof <进程名>   # 获取指定进程的 PID

与 PID 相关的系统调用

(1)获取当前进程的 PID
使用 getpid() 系统调用。在 Linux/Unix 系统中,用于获取当前进程的 PID。
(2)获取父进程的 PID
使用 getppid() 系统调用。用于获取当前进程的父进程的 PID。
(3)创建子进程
使用 fork() 系统调用(Linux/Unix 系统)。父进程调用 fork() 后,会创建一个子进程,父进程的 fork() 返回子进程的 PID,而子进程的 fork() 返回 0。

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        printf("This is child process. PID: %d, Parent PID: %d\n", getpid(), getppid());
    } else if (pid > 0) {
        // 父进程
        printf("This is parent process. PID: %d, Child PID: %d\n", getpid(), pid);
    } else {
        // fork 失败
        perror("fork failed");
    }
    return 0;
}

PID 的回收机制

当进程终止时,其 PID 会被系统回收;回收的 PID 会重新分配给新的进程。系统会确保在一段时间内不会重复使用同一个 PID,以避免 PID 冲突。

僵尸进程与 PID 回收

如果一个子进程终止后,父进程没有调用 wait()waitpid() 获取其退出状态,子进程会进入僵尸状态。
僵尸进程虽然释放了资源,但其 PID 不会被系统回收,直到父进程清理该子进程。

注意事项
  1. PID 不保证连续性:PID 是唯一的,但不连续。由于进程的创建和退出,PID 可能会跳跃。
  2. PID 的最大值限制:Linux 系统中,PID 的最大值可通过 /proc/sys/kernel/pid_max 查看或修改:
cat /proc/sys/kernel/pid_max  # 查看 PID 最大值
echo 4194304 > /proc/sys/kernel/pid_max  # 修改最大值
  1. PID 冲突问题:当系统中进程数量非常多且 PID 最大值较小时,可能会导致 PID 重复分配的风险。

综上,PID 是操作系统中进程管理的核心抽象,它通过唯一标识的方式为操作系统提供了一种高效、简单的进程区分机制。操作系统通过 PID 实现进程的生命周期管理(创建、运行、终止)和资源分配。PID 是进程间通信和信号传递的重要桥梁(如 kill 命令通过 PID 发送信号)。

在实际开发中,系统管理员和开发者通过 PID 进行进程监控、调试、优化和故障处理。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!


http://www.kler.cn/a/505300.html

相关文章:

  • 升级 SpringBoot3 全项目讲解 — 为什么 SpringBoot3 应该抛弃 Maven,搭配 Gradle 来使用?
  • linux环境使用docker部署多个war项目
  • mac 安装docker
  • 第G1周:生成对抗网络(GAN)入门
  • kafka原理和实践
  • TiDB常见操作指南:从入门到进阶
  • 携程API接口详解:如何高效获取景点详情及代码示例
  • 高等数学学习笔记 ☞ 连续函数的运算与性质
  • 分布式数据存储基础与HDFS操作实践(副本)
  • 深度解析Linux中关于操作系统的知识点
  • 浅谈云计算13 | 网络虚拟化
  • Python线性混合效应回归LMER分析大鼠幼崽体重数据、假设检验可视化|数据分享...
  • 如何使用淘宝URL采集商品详情数据及销量
  • python设置键值对
  • Linux网络知识——路由表
  • 少一点If/Else - 状态模式(State Pattern)
  • SQL记录
  • Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)
  • 59_Redis键值设计
  • 音视频文件提供流式传输之HTTP Range 请求
  • 【PHP】双方接口通信校验服务
  • 永久免费不限速下载器支持市面上大部分BT链接
  • vue中 子组件在父组件中因为异步问题导致的的underfind报错问题
  • 通用仓库管理系统开发书 Pyside6 + Sqlite3
  • 工业界主流大语言模型后训练技术综述:偏好对齐与能力提升
  • 【Block总结】ELGCA模块,池化-转置(PT)注意力和深度卷积有效聚合局部和全局上下文信息