Windows 7 是否重用进程 ID?

isi*_*dur 19 windows windows-7 task-manager pid

Windows 7 是否重用进程 ID?

我问这个问题的原因是由于我的经验,Windows XP 和 Linux 似乎从未生成高于 20-30k 的进程 ID。但是,我的 Windows 7 机器在重新启动后的几个小时内会达到高达 5-10k 左右的 ID,这是我过去的正常体验。第二天早上我检查,有些进程是 250k 或更高,这不是。

我激活了安全审计功能来记录进程的创建和终止。没有任何东西会产生成百上千或过程。这些事件中只有 513 个在 24 小时内注册,但似乎已经使用了数十万个进程 ID。

我尝试搜索我的问题,之前提出的建议问题之一指向Mark Russinovich 的精彩博客。但是这篇文章虽然读起来很有趣,但让我感到困惑。

Sco*_*ain 22

从我的测试来看,您似乎有一个错误的假设,即 PID 编号不是按顺序给出的。这很容易证明,从命令行执行以下命令。它应该打开 3 个记事本副本。

notepad & notepad & notepad
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这里是所有同时打开的 3 个副本的 PID。

在此处输入图片说明

正如您可以看到 PID 的跳动很多,如果您一次打开它们,您还会看到下一个 PID 并不总是比前一个大。例如,我打开了记事本的第 4 个副本并得到了这个

在此处输入图片说明

因此,似乎 Windows 7 每次启动进程时都会随机选择一个未使用的 PID,因此很可能在整个 Windows 运行过程中重复使用一个 PID,而无需重新启动。


我写了一个简单的 powershell 脚本(需要 v2 或更高版本,请参阅此答案,C# 版本的编辑历史记录)来肯定地证明它

$h = new-object 'System.Collections.Generic.HashSet[string]'
do {
    $proc = Start-Process 'notepad' -PassThru
    $id = $proc.Id
    Stop-Process $id
} while ($h.Add($id))
$count = $h.Count
Write-Host "Took $count PIDs to hit a duplicate, the duplicate was $id."
Run Code Online (Sandbox Code Playgroud)

运行程序10次总是要花之间134147记事本的推出为同一PID被重新使用的(为什么是这个数字如此之小?GO-GO小工具生日问题!)

  • Windows NT 使它更快,因为 [PID 总是四的倍数](http://blogs.msdn.com/b/oldnewthing/archive/2008/02/28/7925962.aspx)。 (5认同)