嗨,我四处寻找这个问题的答案,我想知道是否有任何有 Windows 内部经验的人知道内核是否会分配与线程 ID 相同的进程 ID。我的意思是说我已经启动了一个进程 a.exe,它有一个 id 为 123 的线程。如果启动另一个进程,例如 b.exe,进程 id 会是 123 吗?换句话说,进程和线程标识符是否曾经发生冲突?谢谢
编辑:似乎进程和线程 id 来自名为 PspCidTable 的同一个池。一位名叫 Polynomial 的黑客审查了 windows nt 源代码,他说:
内核需要能够生成一系列在整个系统中唯一的进程和线程 ID。为了有效和安全地做到这一点,内核创建了一个可用于进程和线程的 ID 池。这个池在内核中被导出为一个名为 PspCidTable 的 HANDLE_TABLE 对象。在系统 Phase0 启动过程中,会调用 PspInitPhase0 函数。此函数使用 ExCreateHandleTable 创建一个 HANDLE_TABLE 对象,它会自动用 65536 个整体填充表。每个条目都是一个 16 位无符号整数(至少在 32 位操作系统上),存储在作为双向链表一部分的列表项对象中。进程 ID 和线程 ID 都来自 PspCidTable 池。
以上来源:你(可能)不了解 Windows 的东西
PspCidTable仍然存在于 Windows XP中,Windows 7 中的经验观察使我相信上述情况仍然正确。