pid真的很独特

时间:2012-10-17 21:17:53

标签: linux multithreading process kernel pid

是否存在PID最终不具有唯一性的情况?它是识别流程(或线程)的最佳方式吗?我读到以前版本的Linux有不同的方法

由于

2 个答案:

答案 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。

引用this discussion

  

内核2.4.20使用NPTL (Native posix thread library),这是RH9附带的内核。 RH8使用Kernel 2.4.18,它没有实现NPTL(意味着每个线程都有自己的PID,因此很好地描述了它在/ proc中的状态)。 NPTL是POSIX线程的“真实”实现,意味着线程共享更多,包括PID。由于几个原因,它是更有效的运行线程的方法,但是,我不知道调试这些线程的任何简单技巧。你怎么知道你的线程何时正在休眠而不是等待信号量,或者哪个线程在一个有大量线程的进程中死亡等等。

来自wikipedia link on NPTL

  

自版本3以来,NPTL一直是红帽企业Linux的一部分,自2.6版以来,它一直是Linux内核的一部分。它现在是GNU C库的完全集成部分。2

即使2.6.X内核也有线程的虚拟进程。您可以使用ps auxf

查看主题process-id
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