是否存在PID最终不具有唯一性的情况?它是识别流程(或线程)的最佳方式吗?我读到以前版本的Linux有不同的方法
由于
答案 0 :(得分:4)
PID可能需要大约32k的值(sysctl kernel.pid_max
可以更改它),因此它们可以足够快地重复使用。 pid +开始时间可能会更好。 systemd附加了cgroupfs中扩展属性的每个进程信息(procfs也可以工作),以避免pid-> attr映射的模糊性。
线程和进程共享相同的命名空间(您可以在/proc/<pid>/task/<taskid>
中看到它),其中<pid>
= <taskid>
用于进程的初始线程。 Pid命名空间限制了可见pid列表,但它们不会引入任何重叠; pids和task id在其所有者运行时仍然是唯一的。
答案 1 :(得分:3)
如果您正在讨论getpid()
系统调用,那么是,每个进程的PID是唯一的。 除之外,也就是说,如果您在较旧版本的Linux内核上使用线程。然后每个线程可能有自己的进程ID。
内核2.4.20使用NPTL (Native posix thread library),这是RH9附带的内核。 RH8使用Kernel 2.4.18,它没有实现NPTL(意味着每个线程都有自己的PID,因此很好地描述了它在/ proc中的状态)。 NPTL是POSIX线程的“真实”实现,意味着线程共享更多,包括PID。由于几个原因,它是更有效的运行线程的方法,但是,我不知道调试这些线程的任何简单技巧。你怎么知道你的线程何时正在休眠而不是等待信号量,或者哪个线程在一个有大量线程的进程中死亡等等。
自版本3以来,NPTL一直是红帽企业Linux的一部分,自2.6版以来,它一直是Linux内核的一部分。它现在是GNU C库的完全集成部分。2
即使2.6.X内核也有线程的虚拟进程。您可以使用ps auxf
:
root 2501 0.0 0.3 244448 25576 ? Ss Jul03 0:11 /usr/sbin/httpd
apache 2716 0.0 0.5 384776 46696 ? S Oct14 0:17 \_ /usr/sbin/httpd
apache 2717 0.0 0.5 382208 44304 ? S Oct14 0:11 \_ /usr/sbin/httpd
以下程序在Linux内核2.6.18下为主线程和线程吐出相同的pid。从pthread_self()
返回的self id唯一地标识该线程。
#include <pthread.h>
void foo() {
printf("thread: pid = %d, self = %ld\n", getpid(), pthread_self());
}
main() {
pthread_t thread;
printf("main: pid = %d, self = %ld\n", getpid(), pthread_self());
pthread_create(&thread, 0L, foo, 0L);
pthread_join(thread, 0L);
}
输出结果为:
main: pid = 13246, self = 46912496175248
thread: pid = 13246, self = 1084229952