Linux PID 是如何生成的?


系统解释每个命令后,会建立一个单独的进程来执行该命令。这个新进程会分配一个独特的进程标识号 (PID)。系统使用 PID 来跟踪每个进程的当前状态。

注意 - Linux 命令区分大小写。

进程表

Linux 中的进程表就像几乎所有其他操作系统一样,只是计算机 RAM 中的一种数据结构。它包含有关操作系统当前正在管理的进程的详细信息。

此数据包含有关每个过程的广泛详细信息。

  • 进程ID

  • 进程所有者

  • 进程优先级

  • 每个进程的环境变量

  • 父进程

  • 已用时间

  • 指向进程可执行机器代码的指针

运行以下命令以显示整个屏幕(或终端的完整窗口),其中包含系统当前状态以及使用大部分 CPU 的进程列表。

$ top

输出

top - 13:29:09 up 2 days,  7:13,  4 users,  load average: 0.07, 0.02, 0.00
Tasks: 148 total,   1 running, 147 sleeping,   0 stopped,   0  zomb
Cpu(s):  0.6%us, 0.5%sy,  0.0%ni, 97.3%id,  1.6%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4051792k total,  4026104k used,  25688k   free,   359168k buffers
Swap:  4096492k    total, 24296k used, 4072196k  free,   2806484k cached
  PID     USER       PR   NI    VIRT    RES      SHR      S       %CPU    %MEM       TIME+     COMMAND
 7629    greys       20    0    749m  291m       28m      S        1       7.4     16:51.40    firefox
19935    greys       20    0    133m   14m       10m      S        0       0.4      2:38.52    smplayer
  331    root        20    0    4020    880      592      S        0       0.0     0:00.96       init
    2    root        15   -5      0      0        0       S        0       0.0      0:00.00     /bin/sh
    3    root        RT   -5      0      0        0       S        0       0.0      0:00.04     migration/0
 5494    root        15   -5      0      0        0       S        0       0.0      0:00.90    khelper/0
   13    root        RT   -5      0      0        0       S        0       0.0      0:00.00    kacpid
    6    root        RT   -5      0      0        0       S        0       0.0      0:00.06    kacpi_notify
  686    root        15   -5      0      0        0       S        0       0.0      0:01.32    ata/1
  368    root        RT   -5      0      0        0       S        0       0.0      0:00.00    ata/0
   21    root        15   -5      0      0        0       S        0       0.0      0:02.14    events/0
   10    root        15   -5      0      0        0       S        0       0.0      0:01.44    events/1

这些是默认 top 输出包含的元素。

PID 生成

每个进程都有一个独特的标识符作为其表示,称为进程 ID (pid)。空闲进程及其 pid 号是内核启动的初始进程的名称。init 进程是启动后第一个启动的进程,其 pid 号为 1。

可以通过查阅 /proc/sys/kernel/pid_max 文件来确定系统的限制。

$ cat /proc/sys/kernel/pid_max 

输出

420314

然后,我们确定了系统的最高 PID。下一步是启动四个 readlink 进程,每个进程都检查分配给它的新 PID。

largest=0

for pid in /proc/[0-9]*; do
    pid="${pid##*/}" # Extract PID
    [ "$pid" -gt "$largest" ] && largest="$pid" # -gt means "greater than"
done

printf "Largest PID is %d
" "$largest" for _ in $(seq 4); do printf "New process PID %d
" "$(readlink /proc/self)" done

输出

Largest PID is 12648
New process PID 12650
New process PID 12651
New process PID 12652
New process PID 12653

由于 seq 命令固有的启动额外进程的能力,我们可以看到在检查最高 PID 和报告新 PID 之间存在 1 PID 的延迟。

使用 ps 命令

要使用 ps 命令查看正在运行的进程的 PID,可以在终端中执行以下命令。

$ ps aux

输出

USER          PID       %CPU     %MEM        VSZ         RSS      TTY       STAT      START TIME COMMAND
webmast+       1        0.0       0.0        1136        0 ?      Ss        16:23      0:00 /sbin/docker-
webmast+       7       10.1       0.1        1012     233528 ?    Rl        16:23      24:52 GROUND
webmast+     15430      0.0       0.0       2888       908 ?      S         16:35      0:00 /bin/sh -c py
webmast+     15431      0.0       0.0       13788     20436 ?     Sl        16:35      0:02 python3 main.
webmast+     91894      0.0       0.0        1028       22836 ?   S         17:20      0:00 gnuplot
webmast+     91907      0.0       0.0        2888       948 ?     S         17:20      0:00 /bin/sh -c oc
webmast+     91908      0.0       0.0      4316732     45844 ?    Sl        17:20      0:01 /usr/bin/octa

此命令显示进程列表及其对应的 PID、用户信息、CPU 和内存使用情况以及其他详细信息。

使用 pgrep 命令

当使用特定搜索模式运行 pgrep 命令时,它会扫描正在运行的进程并将它们与提供的条件进行匹配。然后,它返回满足搜索条件的进程的 PID。

以下是如何使用 pgrep 命令查找具有特定名称的进程的示例:

$ pgrep <process_name>

将 <process_name> 替换为要查找的进程的名称。该命令将返回匹配的进程 ID (PID) 列表。

例如,如果要查找名为“python3”的进程的 PID,则运行:

输入

$ pgrep python3

输出

15431
173607
189388

输出将是名称为“python3”的进程的 PID 列表。

结论

在本文中,我们学习了 Linux 进程 ID、什么是进程表,以及 PID 的生成方式。PID 对于管理 Linux 中的进程至关重要。内核使用计数器和基本 PID 值为每个进程生成唯一的 PID。了解 PID 的生成方式对于需要管理和交互 Linux 中的进程的系统管理员和开发者非常重要。

更新于:2023年8月1日

119 次查看

开启你的职业生涯

完成课程获得认证

开始学习
广告