【问题标题】:Is pid really unique [closed]pid 真的是独一无二的吗?
【发布时间】:2012-10-08 06:07:52
【问题描述】:

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

谢谢

【问题讨论】:

  • 你在哪里读到的?
  • 也许问题已被改写,“非建设性”状态不再相关?这个问题是网络搜索中的第一个热门问题,答案正是我想要的。

标签: linux multithreading process kernel pid


【解决方案1】:

PID 可以取大约 32k 个值(sysctl kernel.pid_max 可以更改它),因此它们可以足够快地重复使用。 pid + 开始时间可能会更好。 systemd 在 cgroupfs 中附加每个进程的扩展属性信息(procfs 也可以)以避免 pid->attr 映射的歧义。

线程和进程共享相同的命名空间(您可以在/proc/<pid>/task/<taskid> 中看到它),其中<pid> = <taskid> 用于进程的初始线程。 Pid 命名空间限制了可见 pid 的列表,但它们不会引入任何重叠; pid 和任务 ID 在其所有者运行时保持唯一。

【讨论】:

  • PID 在仍在使用时不会被重复使用。
  • 当然。我是根据对问题的一次阅读回答的,希望提问者能澄清一下。
【解决方案2】:

如果您在谈论getpid() 系统调用,那么是的,每个进程的 PID 都是唯一的。 除了,也就是说,如果您在旧版本的 Linux 内核上使用线程。那么每个线程都可能有自己的 process-id。

引用this discussion

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

来自wikipedia link on NPTL

NPTL 自版本 3 以来一直是 Red Hat Enterprise Linux 的一部分,自版本 2.6 以来一直在 Linux 内核中。它现在是 GNU C 库的一个完全集成的部分。2

即使是 2.6.X 内核也有一个用于线程的虚拟进程。你可以看到ps auxf的线程process-ids:

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 下为 main 和 thread 输出相同的 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

【讨论】:

  • 那么最新版本的 Linux 对进程及其线程有相同的 PID 吗?在这种情况下,线程的唯一标识符是什么? T[G]身份证?
  • 我会使用pthread_self(); @Buffalo。我已更改答案以显示其输出。
  • pthread_self() 绝对没有什么独特之处。返回的值只是一个指向 pthread_t 的指针(它不是整数!)所以它可以出现在多个进程中。
  • pthread_self() 可以在多个进程中调用,但对于线程来说它将是唯一的值,因为它们都在同一个内存空间中,所以地址是唯一的@LubosD。
  • 是的,但它只是一个内存指针,它有可能比 pid/tid 更快地被回收。
猜你喜欢
  • 2011-08-18
  • 2015-10-18
  • 1970-01-01
  • 2015-06-20
  • 2017-01-01
  • 2017-05-10
  • 2011-05-23
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多