Windows 7 会重复使用进程 ID 吗?
我之所以问这个问题,是因为根据我的经验,Windows XP 和 Linux 似乎从未生成过高于 20-30k 的进程 ID。但是,我的 Windows 7 计算机在重新启动后的几个小时内会达到高达 5-10k 左右的 ID,这是我过去的正常经验。第二天早上我检查了一下,发现有些进程是 250k 或更高,但事实并非如此。
我激活了安全审计功能来记录进程的创建和终止。没有任何进程生成,数百或数千个进程。24 小时内仅记录了 513 个此类事件,但似乎使用了数十万个进程 ID。
我尝试搜索我的问题,之前提出的建议问题之一指向Mark Russinovich 的精彩博客。但是这篇文章虽然读起来很有趣,却让我感到困惑。
答案1
从我的测试来看,你有一个错误的假设,PID 编号不是按顺序给出的。这很容易证明,从命令行执行以下命令。它应该打开 3 个记事本副本。
notepad & notepad & notepad
在我的计算机上,这里是同时打开的 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."
运行该程序 10 次后,每次启动记事本时,总是需要等待一段时间134
才能147
重新使用相同的 PID(为什么这个数字这么小?GO-GO Gadget生日问题!
答案2
我进行了一个小时的测试,在此期间有 302 个进程退出。其中 70 个进程有共同的 PID,因此我认为 PID 被频繁重用。