「プロセス」と「スレッド」は,Windows 2000だけではなく,すべてのWindowsに存在しますが,多くの人にとっては,近寄り難い存在ではないかと思います。ところが,「マルチ・プロセス環境」や「マルチ・スレッド・アプリケーション」などの言葉は,月刊誌や専門書に頻繁に登場します。プロセスやスレッドは,Windowsの世界では間違いなく重要な意味を持っている用語でありながら,私たちから遠くかけ離れた存在でした。理由は簡単です。プロセスやスレッドに関する情報が,必要なときに,簡単に取り出せなかったからです。しかし,Windows 2000では,プロセスやスレッド情報がちょっとしたプログラムで簡単に取り出せるようになっています。これもWindows 2000のCOMコンポーネントのたまものです。今回紹介するサンプル・プログラムをダブル・クリックすれば,おもしろいように必要なプロセス情報が取り出せるようになります。

 本来なら,「プロセスとは何か」をきちんと定義した上で,本題に入ることが理想ですが,ここではその作業を敢えて行いません。書き手としての私が怠惰ということではなく,「プロセス」をきちんと説明しようとすると,それこそ専門書が一冊書けてしまうほど膨大なものになってしまうからです。そこで,ここではあくまで「プロセス情報」を簡単に取り出す方法だけを紹介します。これを活用することで,皆さんが「プロセスとは何か」を学習する手助けになっていただければ,と思います。また,連載第1回で学んだ,「Windows 2000がCOMコンポーネントという小さな部品の集まりで構成されている」ということも実感できるでしょう。それではさっそく,Windows 2000のプロセス情報を取り出してみましょう。

プロセス情報の収集

 サンプル・プログラム「Sample4_1.vbs」を実行すると,図1[拡大表示]のような情報が画面に表示されます。

 この画面情報は,29個のプロセスが検出されたことを報告しています。私は今Windows 2000 Professional環境でこのサンプル・プログラムを実行していますが,おそらくWindows 2000 Server環境で実行すれば,より多くのプロセスが検出されることでしょう。ネットワーク環境を利用できる方はぜひサーバー環境で実行してみてください。この画面には表示されていませんが,生成される「sample4_1.txt」を見てみましょう。

 これは「csrss.exe」と「winlogon.exe」という2つのプロセスに関する情報です。おそらく,皆さんは,一度はどこかで耳にしたり,あるいは目で追ったことのある項目が含まれているはずです。例えば,ぺージ・フォールト回数(4KBというページ単位でのメモリーへの移動回数),ベース実行優先度(Windows 2000が実行する順序),プロセス・ハンドル(第5回で詳述予定),スレッド個数(自分で作成したスレッド数。スレッドの詳細は第5回で詳述予定)などは結構おなじみの項目ではないかと思います。ワーキング・セットについては,使用できるメモリー量の上限を示していると考えておいてください。このサンプル・プログラムを自分のWindows 2000環境で実行し,表示される内容を多少時間をかけて眺めてください。実行するたびに変化する項目と不変の項目があるはずです。ところで,この情報を目にした人の中には,次のような問いを持ち出す人もいることでしょう。

“プロセスが29個もあり,自分の調べたいプロセスを見つけ出すのに時間がかかりすぎる。目的のプロセスだけを取り出す方法はないだろうか”

 そこで私は,サンプル・プログラム「sample4_2.vbs」を作成しました。このプログラムを実行すると,図2[拡大表示]のような画面が表示されます。

 このプログラムは,「Services.exe」のプロセスだけを検出するプログラムです。作成されるファイル「sample4_2.txt」には次の情報だけが格納されています。

プロセス名 -> services.exe
意味 -> services.exe
生成された日付 -> 20001213095849.473099+540
ページ・フォールト回数 -> 2466
ベース実行優先度 -> 9
プロセス・ハンドル -> 208
プログラム・パス -> C:\WINDOWS\system32\services.exe
スレッド個数 -> 37
Windowsバージョン -> 5.0.2195
最大ワーキング・セット(KBytes) -> 1380
最小ワーキング・セット(KBytes) -> 200

 ソース・コードがどのようになっているのかに興味がある方は,じっくり検討してみてください。ソース・コードの条件の一部を変更するだけで,目的のプロセス情報が取り出せます。ここまでくると,鋭い方は次のような考えを持つことでしょう。

“コンピュータは電源を投入している限り,時々刻々動いている。このため,複数の時点でデータを取れば,よりプロセスの状態が分かるのではないだろうか”

 この質問は的を得ています。ご承知のように,プロセサとメモリーとの間では頻繁にデータを出し入れしています。また,要求された処理が完了すれば消滅するプロセスもあります。このため,ある時点で取得した固定データだけからでは,Windows 2000で実際に行われていることがわかりません。複数の時点でプロセスのデータを取り出すためには,パフォーマンス・モニターや,マイクロソフトの開発ツール群である「Visual Studio」に付属する「SPY++」というツールを使います。パフォーマンス・モニターの使い方や基礎知識は,「初心者のためのWindows 2000入門」第4回を参照してください。

 ここでは,手作りツールとして,「Sample4_3.vbs」という名称のサンプル・プログラムを作成してみました。このサンプルを実行すると,図3[拡大表示]のような画面が表示されます。

 この画面では,Internet Explorer(IE)とメモ帳を起動し,複数のファイルを開いています。開いているファイルは「Sample4_3.txt」ですが,時刻を見ると分かるように,時間がずれています。つまり,Sample4_3.vbsを複数回実行すると,その回数だけメモ帳とIEが起動されるのです。同じメモ帳プロセスでも,いくつかの表示値はサンプル・プログラム実行時点でかなり異なっています。もちろん,ソース・コードに興味がある方はサンプルを実行しながら,検討してみるとよいでしょう。パフォーマンス・モニターやSPY++などと異なり,いくらでも自分の手で改善できます。素朴な手作りツールといったところでしょうか。

 実は,サンプル・プログラムSample4_3.vbsは,初めて起動すると,ほとんどの場合図4[拡大表示]のような画面を表示します。しかし,2回目以降の起動時には,基本的にプロセス情報が表示されます。

 なぜ図4のような画面が表示されるのでしょう。厳密に技術的な分析をすると異なる結論が出ますが,“Windows 2000はプロセス情報を記憶するための内部システム・データベースの作成に時間がかかっている”のが一般的な理由と言えます。サンプル・プログラム「Sample4_3.vbs」は,内部で実行時にメモ帳プロセス(notepad.exeプロセス)を作成し,その情報を取得しています。最初にサンプルを実行すると,図4のような画面が表示されることが多々あります。これはプロセス・システム・データベースにアクセスされていないか,あるいは,アクセスできたとしても,そこに情報が格納されていない,といういずれの解釈も成立します。このシステム・データベースについては,次回取り上げます。それでは,今回内容のまとめに入りましょう。

今回のまとめ

 今回は,Windows 2000のプロセス情報の取得方法を紹介してみました。今まで遠い存在だった「プロセス」が,少し身近なものに感じられたのではないでしょうか。ぜひ今回のサンプル・プログラムを実行し,Windows 2000の世界をのぞいてみてください。ソース・コードを拡張できれば,より貴重な情報をWindows 2000世界から取り出すことができます。判断材料があれば,Windows 2000世界に関して正確な判断ができます。判断材料が信頼できるものであれば,その正確さは増します。判断材料があれば,正確な判断ができます。信頼できる判断材料を自分の手で収集できれば,時々刻々開発出荷されるソフトウエアを,余裕を持って使いこなせるのではないでしょうか。それではまた,明日お会いしましょう。