Linux PIDs 是如何生成的
根据系统对每个命令的解释,会建立一个独立的进程来执行该命令。这个新进程被分配一个独特的进程标识号(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
这些是默认顶部输出所包含的元素。
PID生成
每个进程都有一个独特的标识符,称为进程ID(pid),用来表示它。空闲进程及其pid号是内核启动的初始进程的名称。具有pid号1的init进程是在引导之后启动的第一个进程。
可以通过查看/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
由于序列命令具有启动额外进程的内在能力,因此我们可以看到在检查最高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>
将
例如,如果您要查找名称为”python3″的进程的 PID,您可以执行以下操作 –
输入
$ pgrep python3
输出
15431
173607
189388
输出将会是名为”python3″的进程的PID列表。
结论
在本文中,我们了解了Linux进程ID,进程表的含义,以及如何生成PID。在Linux中,PID对于管理进程至关重要。内核使用计数器和基本PID值为每个进程生成唯一的PID。了解PID的生成方式对于需要在Linux中管理和与进程交互的系统管理员和开发人员非常重要。