【问题标题】:How PID (Process Indentifier) is generated in kernel-mode under Windows?Windows下内核模式下PID(进程标识符)是如何产生的?
【发布时间】:2011-06-03 09:06:58
【问题描述】:

我想知道如何在 Windows 下生成进程标识符(又名 PID)。它在不同的机器上是独一无二的吗?例如,考虑当前分配给我的 Firefox 程序的 5856 id。同一个可执行镜像在另一台机器下是一样的吗?

【问题讨论】:

    标签: kernel pid


    【解决方案1】:

    PID 生成主要是 Microsoft 不会正式记录的秘密 - 因为一旦记录了它,他们就必须坚持该实现。但是,它始终是 4 的倍数 - 但这不是您应该依赖的行为。它们不是唯一的,可以重复使用。

    Raymond Chen 在他的blog 中提到了这一点。

    【讨论】:

    • 由于副作用,它们只是 4 的倍数;这不是设计的,理论上可以改变。
    • 是的——这正是雷蒙德在他的博客中指出的。我会更新我的答案以澄清。
    【解决方案2】:

    进程标识符在不同机器之间不是唯一的。它们可以在同一台机器上为以后的进程重用,并且在同一可执行文件的两次调用之间通常不会相同。

    您不应该关心它是如何生成的——您唯一可以确定的是进程标识符唯一地标识了一个正在运行的进程,即在任何一个进程中都只有一个进程具有该标识符时间。

    【讨论】:

    • 嗯,你知道它是根据什么生成的吗?
    • 不,没有记录,可能会在 Windows 版本或服务包或更新之间发生变化,或者取决于一天中的时间或月相。 :)
    • 信息量很大,特别是“月相”部分:)
    • 欢迎您! :) 好的,更严重的是,我只是想指出您根本不能依赖任何特定行为。您可以尝试发布另一个问题,说明您要完成的工作 - 可能会有一些帮助来代替。
    【解决方案3】:

    进程、线程和内核句柄 ID 来自一个通用例程。从技术上讲,这是一个 DWORD,尽管我不记得上次看到它们高于 65,536 是什么时候。它们可以重复使用,只是一种基于计数器的机制。

    【讨论】:

    • 已经在 Windows 10 上看到过一次这样的进程,带有一些 6 位数的 PID。但这很罕见。
    【解决方案4】:

    进程在内核中作为对象进行维护,因此,与系统中的所有其他对象(即事件、互斥体、信号量、计时器等)通过句柄导出到用户模式的方式相同。

    因此,进程 ID 实际上只是处理对象的 HANDLE,它们在全局句柄表(PspCidTable,作为实现细节)中维护。有趣的是,线程也作为对象维护,也被插入到这个表中。线程 ID 实际上只是线程对象的句柄。

    -斯科特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多