奇数のWindowsプロセスIDがないのはなぜですか?
あなたがWindowsをいじっていて、あなたが行くにつれて学ぶことを愛するならば、あなたはWindowsプロセスとスレッドIDが偶数と4の倍数であることに気付いたかもしれません。何故ですか?本日のSuperUser Q&A投稿には、興味をそそられる読者の質問に対する答えがあります。.
本日の質疑応答セッションは、コミュニティ主導のQ&A Webサイトのグループである、Stack Exchangeの下位区分であるSuperUserの好意により提供されます。.
質問
SuperUserの読者Peter Hahndorfは、なぜ奇数のWindowsプロセスIDがないのか知りたいのです。
WindowsでプロセスIDを調べる方法はたくさんあります。 PowerShellを使用する
私はこの結果を得ます:
ご覧のとおり、すべてのプロセスIDは偶数であり、それだけでなく、すべて4の倍数です。あなたはあなたが望むように難しく見えることができます、そして、あなたは決して奇数のプロセスIDを見つけることは決してないでしょう、少なくともWindows NTベースであるどんなバージョンでも。その理由は何ですか?
奇数のWindowsプロセスIDがないのはなぜですか?
答え
スーパーユーザーの貢献者DavidPostillが私たちに答えを持っています。
奇数のWindowsプロセスIDがないのはなぜですか?
カーネルハンドルを割り当てるのと同じコードが、プロセスIDとスレッドIDの割り当てにも使用されます。カーネルハンドルは4の倍数なので、プロセスIDとスレッドIDも同じです。.
プロセスIDとスレッドIDが4の倍数になるのはなぜですか?
Windows NTベースのオペレーティングシステムでは、プロセスIDとスレッドIDは常に4の倍数になります。これは単なる偶然ですか?
はい、それは単なる偶然の一致です、そしてそれはプログラミング契約の一部ではないのであなたはそれに頼るべきではありません。たとえば、Windows 95のプロセスIDとスレッドIDは、常に4の倍数ではありませんでした。比較すると、カーネルハンドルが常に4の倍数であるという理由は仕様の一部であり、当面の間保証されます。.
プロセスIDとスレッドIDは、コードの再利用の副作用として4の倍数です。カーネルハンドルを割り当てるのと同じコードが、プロセスIDとスレッドIDの割り当てにも使用されます。カーネルハンドルは4の倍数なので、プロセスIDとスレッドIDも同じです。これは実装の詳細なので、それに依存するコードを書かないでください。私はあなたにあなたの好奇心を満たすように言っているだけです.
ソース: プロセスIDとスレッドIDが4の倍数になるのはなぜですか?
なぜカーネルはいつも4の倍数を扱うのですか?
あまりよく知られていないことは、カーネルハンドルの下位2ビットが常にゼロであるということです。つまり、それらの数値は常に4の倍数です。これはカーネルハンドルにのみ適用されることに注意してください。疑似ハンドルやその他の種類のハンドル(USERハンドル、GDIハンドル、マルチメディアハンドルなど)には適用されません。カーネルハンドルはCloseHandle関数に渡すことができるものです.
少なくともカーネルハンドルの最下位ビットが常に0であることは、完了ポート通知を抑制するためにイベントハンドルの最下位ビットを設定できることを示すGetQueuedCompletionStatus関数によって暗黙的に示されます。これが機能するためには、最下位ビットは通常ゼロでなければなりません.
この情報は、ハンドルを不透明な値として扱い続ける必要があるほとんどのアプリケーション作成者には役立ちません。タグビットに興味がある人は、低レベルのクラスライブラリを実装している人、またはより大きなフレームワークの中にカーネルオブジェクトをラップしている人です。.
ソース: なぜカーネルはいつも4の倍数を扱うのですか?
参考文献
昔の新しいこと:Raymond ChenによるWindowsの進化を通しての実用的な開発(マイクロソフトの主任ソフトウェア設計エンジニア)
説明に追加するものがありますか?コメントで音を消す。他の技術に精通したStack Exchangeユーザーからの回答をもっと読みたいですか?こちらのディスカッションスレッドをチェックしてください。.