https://www.nowcoder.com/feed/main/detail/99b8c74ce8fb4121863a4fb6a68198f9

在 Linux 系统中,以下方式保证进程号(PID,Process ID)的唯一性:

一、PID 分配机制

Linux 内核使用一个递增的计数器来分配进程号。当系统启动一个新进程时,内核会从一个特定的起始值开始搜索可用的最小未使用的进程号。这个起始值通常是一个相对较高的数字,以避免与系统启动时就存在的进程或早期启动的进程的 PID 冲突。

例如,内核可能从 300 开始搜索,依次检查 300、301、302 等,直到找到一个未被使用的数字作为新进程的 PID。

二、PID 回收与循环利用

当一个进程结束时,其占用的 PID 不会立即被分配给新的进程。内核会将这个已结束进程的 PID 放入一个 “已使用但可回收” 的列表中。在一段时间后,如果没有特殊情况,这个 PID 才会被重新分配给新的进程。

这样做的目的是防止在某些情况下,新进程被错误地认为是刚刚结束的旧进程,尤其是在涉及进程间通信或其他依赖于特定 PID 的场景中。

此外,当 PID 的取值范围接近上限时,内核会开始循环利用早期已回收的 PID,以确保始终有可用的唯一进程号。

三、进程命名空间

在 Linux 中,进程命名空间可以进一步隔离进程的 PID 空间。不同的命名空间可以有相同的 PID 值,而不会产生冲突。这在容器化技术等场景中非常有用,每个容器可以拥有自己独立的 PID 命名空间,从而保证在容器内部看到的进程号是唯一的,与其他容器或宿主机上的进程号不冲突。

综上所述,Linux 通过严格的分配机制、回收策略和命名空间等多种手段来保证进程号的唯一性。