【发布时间】:2011-06-03 09:06:58
【问题描述】:
我想知道如何在 Windows 下生成进程标识符(又名 PID)。它在不同的机器上是独一无二的吗?例如,考虑当前分配给我的 Firefox 程序的 5856 id。同一个可执行镜像在另一台机器下是一样的吗?
【问题讨论】:
我想知道如何在 Windows 下生成进程标识符(又名 PID)。它在不同的机器上是独一无二的吗?例如,考虑当前分配给我的 Firefox 程序的 5856 id。同一个可执行镜像在另一台机器下是一样的吗?
【问题讨论】:
PID 生成主要是 Microsoft 不会正式记录的秘密 - 因为一旦记录了它,他们就必须坚持该实现。但是,它始终是 4 的倍数 - 但这不是您应该依赖的行为。它们不是唯一的,可以重复使用。
Raymond Chen 在他的blog 中提到了这一点。
【讨论】:
进程标识符在不同机器之间不是唯一的。它们可以在同一台机器上为以后的进程重用,并且在同一可执行文件的两次调用之间通常不会相同。
您不应该关心它是如何生成的——您唯一可以确定的是进程标识符唯一地标识了一个正在运行的进程,即在任何一个进程中都只有一个进程具有该标识符时间。
【讨论】:
进程、线程和内核句柄 ID 来自一个通用例程。从技术上讲,这是一个 DWORD,尽管我不记得上次看到它们高于 65,536 是什么时候。它们可以重复使用,只是一种基于计数器的机制。
【讨论】:
进程在内核中作为对象进行维护,因此,与系统中的所有其他对象(即事件、互斥体、信号量、计时器等)通过句柄导出到用户模式的方式相同。
因此,进程 ID 实际上只是处理对象的 HANDLE,它们在全局句柄表(PspCidTable,作为实现细节)中维护。有趣的是,线程也作为对象维护,也被插入到这个表中。线程 ID 实际上只是线程对象的句柄。
-斯科特
【讨论】: