目录
进程是操作系统一个核心概念。每个进程都有自己的唯一标识:进程 ID,也有自己的生命周期,一个典型的进程的生命周期如图:
进程 ID
Linux 下每个进程都会有一个非负整数表示的唯一进程 ID,简称 pid。Linux 提供了 getpid 函数来获取进程 pid,同时还提供了 getppid 函数来获取父进程的 pid,这两个函数的接口如下:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
每个进程都有自己的父进程,父进程又会有自己的父进程,最终都会追溯到 1 号进程,即 init 进程。这就决定了操作系统上所有的进程必然会组成树状结构,就像一个家族的家谱一样。可以通过 pstree 命令来查看进程的家族树:
procfs 文件系统会在 /proc 下为每个进程创建一个目录,名字是该进程的 pid。目录下有很多文件,用于记录进程的运行情况和统计信息等:
因为进程有创建,也有终止,所以 /proc/ 下记录的目录(以及目录中的内容)也会发生变化。
操作系统必须保证在任意时刻都不能出现两个进程有相同 pid 的情况。虽然进程的 ID 是唯一的,但是进程 ID 可以重用。进程退出后,其进程 ID 还可以再次分配给其它的进程使用。那么问题来了,内核是如何分配进程 ID 的?
Linux 分配进程 ID 的算法不同于给进程分配文件描述符的最小可用算法,它采用了延迟重用的算法,即分配给新创建进程的 ID 经量不与最近终止进程的 ID 重复&#