web-dev-qa-db-ja.com

Windows 7はプロセスIDを再利用しますか?

Windows 7はプロセスIDを再利用しますか?

私がこの質問をする理由は、Windows XPであり、Linuxは20〜30kを超えるプロセスIDを生成するようには思われないという経験です。しかし、私のWindows 7マシンは5までのIDに到達します再起動後数時間以内に–10k程度、これは過去からの私の通常の経験です。翌朝チェックすると、一部のプロセスが250k以上ですが、そうではありません。

セキュリティ監査機能をアクティブにして、プロセスの作成と終了をログに記録しました。何百、何千、またはプロセスを生成しているものはありません。これらのイベントのうち513のみが24時間登録されていますが、数十万のプロセスIDが使用されているようです。

私は自分の質問を検索しようとしましたが、以前に尋ねられた提案された質問の1つは、 Mark Russinovichのすばらしいブログ を指しています。しかし、この記事は非常に興味深い読み物ですが、私は戸惑いました。

19
isildur

私のテストから、あなたには1つの誤った仮定があるように見えます、PID番号は順番に与えられていません。これは非常に簡単に証明できます。コマンドラインから次のコマンドを実行します。メモ帳を3つ開く必要があります。

notepad & notepad & notepad

私のマシンには、すべてが同時に開いた3つのコピーのPIDがあります。

enter image description here

PIDのジャンプが頻繁に見られるように、一度に1つずつ開くと、次のPIDが前のPIDよりも常に大きいとは限らないこともわかります。たとえば、メモ帳の4番目のコピーを開いて、これを取得しました

enter image description here

したがって、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ガジェット 誕生日の問題 !)

22

私は1時間テストを実行し、その間に302プロセスが終了しました。これらのうち、70は共通のPIDを持っていたので、PIDは頻繁に再利用されます。

1
Data Munger