BOOK Preview

インサイドMicrosoft Windows 第4版 上

第2章 システムアーキテクチャ

2.4.7 システムプロセス
まとめ

マイクロソフトプレスの書籍紹介ページ
書籍情報のページ
2005/09/06

2.4.7 システムプロセス

 次のシステムプロセスは、すべてのWindowsシステム上で動作しています。「アイドル」と「システム」という2つのプロセスは、完全なプロセスではありません。この2つのプロセスは、ユーザーモード実行ファイルを動作させていません。

  • アイドルプロセス(CPUあたり1個のスレッドを起動し、CPUがアイドル状態に入ったときに起動される)

  • システムプロセス(カーネルモードシステムスレッドのほとんどを起動する)

  • セッションマネージャ(Smss.exe)

  • Windowsサブシステム(Csrss.exe)

  • ログオンプロセス(Winlogon.exe)

  • サービスコントロールマネージャ(Services.exe)とその子サービスプロセス(システム提供のジェネリックサービスホストプロセスであるSvchost.exeなど)

  • ローカルセキュリティ認証サーバー(Lsass.exe)

 これらのプロセス間の関係を理解したい場合には、プロセスを「ツリー構造」に表示させてみるとよいでしょう。つまり、プロセス間の親子関係を把握してしまうのです。どのプロセスがどのプロセスの作成元になっているかを理解してしまえば、プロセスの性質がわかります。図2-6は、プロセスツリーの部分的なスクリーンショットです。

図2-6 システムプロセスツリー

 以降の節では、図2-6に表示されているキーとなるシステムプロセスを説明していきます。本章では、プロセスの起動順序を簡単に紹介することにとどめ、Windowsのブートや起動過程などの本格的な説明は第5章で行います。

■アイドルプロセス

 図2-6にリストされている第1プロセスは、システムアイドルプロセスです。詳細については第6章で取り上げますが、プロセスはイメージ名で識別されます。しかし、この第1プロセスは(Systemという名称のプロセスと同じように)、ユーザーモードイメージを実行しているわけではありません。簡単に言えば、\Windowsディレクトリ内に「System Idle Process.exe」というイメージファイルは存在しません。また、このプロセスの表示名は、使用するツールの実装に応じて異っています。表2-8は、アイドルプロセス(プロセスID 0)に付けられる名前をリストしています。アイドルプロセスの詳細については第6章で取り上げます。

ツール プロセスID 0 の名称
タスクマネージャ System Idle Process
Process Viewer(Pviewer.exe) Idle
Process Status(Pstat.exe) Idle Process
Process Explode(Pview.exe) System Process
Task List(Tlist.exe) System Process
QuickSlice(Qslice.exe) Systemprocess
表2-8 プロセスID 0 の名称とツール

 それでは次に、システムスレッドと実際のコードを実行しているシステムプロセスの役割を検討してみましょう。

■InterruptとDPC

 InterruptとDPCというプロセス名を表示する2行は、割り込みと遅延プロシージャコールの処理に消費された時間を示しています。メカニズムの詳細については第3章で取り上げます。ここでは、Process Explorerはこれらのプロセスを表示しますが、実際にはプロセスではない、ということを印象に残しておいてください。これら2つのプロセスは、どのプロセスにも割り当てられないCPU時間を示しているのです。たとえば、頻繁に割り込み処理を行うシステムなどでは、CPU時間を表示するプロセスはそれほど現れません。タスクマネージャは、このようなプロセス(InterruptとDPC)をシステムアイドル時間に含めています。このため、タスクマネージャを使用すると、高速に割り込み処理を行うシステムはアイドル状態にあるように見えます。

■Systemプロセスとシステムスレッド

 Systemプロセス(Windows 2000ではプロセスID8、Windows XPとWindowsServer 2003ではプロセスID 4)は、カーネルモードでのみ動作する特殊な種類のスレッドを内部で生成しています。そのスレッドは、カーネルモードシステムスレッドと呼ばれています。システムスレッドは、通常のユーザーモードスレッドのすべての属性とコンテキスト(ハードウェアコンテキスト、優先度など)を持っていますが、システムスペースにロードされているカーネルモードコードのみを実行する点で、ユーザーモードスレッドと一線を画しています。実行されるカーネルモードコードには、Ntoskrnl.exeや他のすべてのデバイスドライバなどが含まれます。さらに、システムスレッドは、ユーザープロセスアドレススペースを持っていないため、オペレーティングシステムヒープ(ページあるいは非ページツール)からメモリを動的に確保する必要があります。

 システムスレッドは、DDKから公開されているPsCreateSystemThread関数で作成されます。この関数は、カーネルモードからのみ呼び出すことができます。Windowsと各種のデバイスドライバは、システム初期化時にシステムスレッドを作成し、必要な処理を行っています。たとえば、I/O要求を出したり、あるいはデバイスをポーリングしています(このような処理は、システムスレッドコンテキストが必要です)。メモリマネージャは、システムスレッドを作成して、データが書き込まれたページをページファイルやマップドメモリに書き出したり、プロセスのスワッピングなどを行っています。カーネルは、バランスセットマネージャと呼ばれるシステムスレッドを作成しています。このスレッドは、1秒間隔で起動し、各種のスケジューリングとメモリ管理関連のイベントを発生させています。キャッシュマネージャもまた、システムスレッドを使用し、先読み後書きI/O(FILO)処理を実装しています。ファイルサーバーデバイスドライバ(Srv.sys)は、ネットワーク上で共有できるディスクパーティション上に作成されたファイルデータへのI/O要求を、システムスレッドを使って処理しています。フロッピードライバでさえシステムスレッドを利用し、フロッピーデバイスのポーリングを行っています(この場合、割り込み駆動型のフロッピードライバは大量のシステムリソースを消費するため、ポーリングはより効果的な手段といえます)。特定のシステムスレッドに関する詳しい説明は、取り上げられるコンポーネントと共に行います。

 システムスレッドはデフォルトではSystemプロセスが所有しますが、デバイスドライバは任意のプロセス内にシステムスレッドを作成できます。たとえば、Windowsサブシステムデバイスドライバ(Win32k.sys)は、Windowsサブシステムプロセス(Csrss.exe)内部にシステムスレッドを作成し、そのプロセスのユーザーモードアドレススペース内のデータに効率的にアクセスしています。

 トラブルシューティングやシステム分析を行っている場合、実行中の個々のシステムスレッドとドライバ、あるいはサブルーチンを対応付けることができると、問題箇所を効率的に特定できるようになります。たとえば、ファイルサーバーの負荷が高まっているような場合、Systemプロセスは多量のCPU 時間を消費している可能性があります。このような場合、Systemプログラムが起動し、何らかのシステムスレッドが動作しているわけですが、問題(どのデバイスドライバあるいはオペレーティングシステムコンポーネントが動作しているのか)を特定するには、より詳しい知識が必要です。

 Systemプロセス内のスレッドが動作している場合には、パフォーマンスツールなどを起動し、まず、どのスレッドが動作しているのかを特定します。実行中のスレッドを特定した後は、そのシステムスレッドが動作を開始したドライバ(作成元ドライバ)を探すか、あるいはコールスタックを調べます(少なくとも、現在の実行アドレス)。

 これまで説明した2つのテクニックは、次の実験で実際に活用されています。

実験:Systemプロセス内のシステムスレッドを特定する

 Systemプロセス内のスレッドのアドレスから、そのスレッドがカーネルモードシステムスレッドであることがわかります。スレッドの開始アドレスが0x80000000(デフォルト)より上位にある場合、そのスレッドはカーネルモードスレッドです(Boot.iniファイルに/3GBスイッチを使用している場合は別ですが)。また、個々のスレッドのCPU時間を見ると、カーネルモードシステムスレッドは、カーネルモードでのみ動作したCPU時間の累積値を持っていることが、その場でわかります。

 システムスレッドを作成したデバイスドライバを特定するためには、スレッドの開始アドレスを調べ(Pviewer.exeが使えます)、そのアドレスに最も近いベースアドレスを持つドライバを探します(ただし、開始アドレスがベースアドレスを超えてはなりません)。Pstatユーティリティは、ロードされているデバイスドライバのベースアドレスを表示してくれます。

 
実験:システムスレッドとデバイスドライバの関係を調べる

 この実験では、Systemプロセス内のCPUの動きと、その動きを作り出しているシステムスレッド(および作成元ドライバ)の関係を調べます。Systemプロセスが動作しているとき、現在行われている動作内容を理解するには、個々のスレッドの動きを調べる必要があります。この実験では、ファイルサーバーに負荷をかけ、システムスレッドを動かしてみます。ファイルサーバーSrv.sysはファイルI/O要求を受け取ると、内部でシステムスレッドを作成し、必要な処理を行っています。ファイルサーバーコンポーネントの詳細については、第3章で取り上げます。

  1. コマンドプロンプトを開く。
  2. 次のようなコマンドを入力し、Cドライブすべてのディレクトリ情報を表示する。
      dir \\< コンピュータ名>\c$ /s
    /s スイッチは、すべてのサブディレクトリも表示させるコマンドです。
  3. Process Explorerを起動し、Systemプロセスをダブルクリックする。
  4. [Threads]タブをクリックする。
  5. [CSwitch Delta](Context Switch Delta)欄でソートする。次のような情報が表示され、Srv.sysが1つ以上のスレッドを動作させていることがわかる。

 システムスレッドが動作していることがわかっても、それを起動したドライバがはっきりしない場合、[Module]ボタンをクリックし、ファイルプロパティを表示させます。Srv.sysの場合、次のような情報が返されるはずです。

■セッションマネージャ(Smss)

 セッションマネージャ(\Windows\System32\Smss.exe)は、システム内で作成される最初のユーザーモードプロセスです。Windowsエグゼキュティブとカーネルの初期化の最終処理を担当するカーネルモードシステムは、Smss プロセスを作成します。

 セッションマネージャは、Windows起動段階で多くの重要な作業を行います。たとえば、ページファイルの追加、ファイル名の変更と削除処理、システム環境変数の作成などを行っています。また、システムプロセスの多くを作成するサブシステムプロセス(Csrss.exe)とWinlogonプロセスの起動なども行っています。

 Smssの初期化処理を支えるレジストリ情報の多くは、HKLM\SYSTEM\CurrentControlSet\Control\Session Managerに格納されています。いくつかの情報は第5章で取り上げますが、完全な説明を必要とする人は、Windows 2000 リソースキットのRegistry Entries Helpファイル(Regentry.chm)を精読してください。

 以上の初期化処理の完了後、Smss内のメインスレッドはCsrssとWinlogonのプロセスハンドル上で永久に待ちに入ります。これらのプロセスの一方が異常終了した場合、Smssはシステムをクラッシュします(クラッシュコードはSTATUS_SYSTEM_PROCESS_TERMINATED(0xC000021A))。Windowsシステムの世界はこの2つのプロセスの存在を前提としています。Smssはこの間、サブシステムのロード要求、デバッグイベント、および新規ターミナルサーバーセッションの作成要求などを待ち受けます。ターミナルサービスの詳細については、「1.2.6 ターミナルサービスとマルチセッション」を再読してください。

 ターミナルサービスセッションを作成するのはSmssです。Smssはセッション作成要求を受け取ると、NtSetSystemInformationを呼び出し、カーネルモードセッションデータ構造体の設定要求を出します。この設定要求は、内部メモリ管理関数MmSessionCreateを呼び出し、セッション仮想アドレススペースを設定します。この仮想アドレススペースには、セッションページプールと、Win32サブシステム(Win32k.sys)と他のセッションスペースデバイスドライバによって割り当てられるセッション単位のデータ構造体が含められます(詳細については第7章で取り上げます)。その後、SmssはWinlogonとCsrssインスタンスを作成します。

■Winlogon、LSASS、およびUserinit

 Windowsログオンプロセス(\Windows\System32\Winlogon.exe)は、ユーザーからのログオンとログオフ要求を処理します。Winlogonは、SAS(SecureAttention Sequence)キーが押されたとき、ユーザーからのログオン要求通知が発生したことを検知します。WindowsのデフォルトSASは、Ctrl+Alt+Deleteキーを押します。このSASキーストロークの組み合わせは、ユーザーモードアプリケーションではインターセプトできないため、ログオンプロセスをシミュレートするパスワード捕捉プログラムからユーザーを保護してくれます。

 ログオンプロセスのユーザー識別と認証処理は、GINA(Graphical Identificationand Authentication)と呼ばれる差し替え可能なDLLに実装されています。Windowsの標準GINAはMsgina.dllであり、デフォルトログオンインターフェイスを実装提供しています。開発者は、独自のGINA DLLを開発し、ユーザー名/パスワード方式に代わる、ユーザー識別と認証メソッド(たとえば、声紋認証)を実装できます。また、Winlogonプロセスは、ネットワークプロバイダDLLを追加ロードし、第2の認証処理も実行できます。これらの技術を高度に運用すれば、複数のネットワークプロバイダを通してすべての識別/認証情報を収集できます。

 入力されたユーザー名とパスワードは、ローカルセキュリティ認証サーバープロセス(第8章で取り上げる\Windows\System32\Lsass.exe)に送られ、認証を受けることになります。LSASSは、DLLとして実装されている適切な認証パッケージを呼び出し、アクティブディレクトリやSAMに格納されているデータと入力されたパスワードなどの一致検証作業を開始します。SAMというのは、ユーザーとグループを定義するレジストリ情報の一部です。

 一致検証作業に問題がなければ、LSASSはセキュリティ参照モニタのNtCreateToken関数などを呼び出し、ユーザーのセキュリティプロファイルを含むアクセストークンオブジェクトを作成します。作成されたアクセストークンはWinlogonに渡され、ユーザーセッション内の初期プロセスを作成するために使用されます。初期プロセスは、レジストリキーHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon直下のUserinitレジストリに格納されています。デフォルトではUserinit.exeですが、リストには複数のイメージが格納されていることもあります。

 Userinitは、ユーザー環境を初期化する作業を行い(たとえば、ログインスクリプトの実行やグループポリシーの適応など)、レジストリ内のShell値を探します(既に触れた同一のWinlogonキーの下にあります)。その後、1つのプロセスを起動し、システム定義シェルを実行し(デフォルトでは、Explorer.exe)、動作を終了します。Explorerの親プロセスはUserinit.exeですが、Process ExplorerやTlistなどのツールは、Userinitプロセスは動作を既に終了していますから、Explorerの親プロセスを表示しません。Explorerは、Winlogonプロセスの孫プロセスという表現も可能です。

 Winlogonは、ユーザーログオンとログオフの間動作するだけではなく、キーボードからのSAS入力があると必ず動作することになっています。たとえば、ログインしているときにCtrl+Alt+Deleteキーを押すと、Windowsセキュリティダイアログボックスが表示され、ログオフ、タスクマネージャの起動、ワークステーションのロック、システムのシャットダウンなどを選択するオプションが表示されます。Winlogonは、このようなユーザーからの入力を処理しているプロセスなのです。

 ログオンプロセスに関係する詳細な説明は、「5.1.5 Smss、Csrss、およびWinlogon」を参照してください。セキュリティ認証に関する詳しい説明は、第8 章で行います。また、Lsaで開始されるLSASSのインターフェイス関数の詳細については、Platform SDKのドキュメントを参照してください。

■サービスコントロールマネージャ(SCM)

 既に触れたように、Windowsの世界で「サービス」といえば、それはサーバープロセスとデバイスドライバのいずれかを指すことになります。ここでは、ユーザーモードプロセスとして動作しているサービスを取り上げます。サービスは、UNIXのデーモンプロセスやVMSのディタッチプロセスに相当します。つまり、システムブート時に自動的に構成され、動作を開始します。対話型のログオン処理を一切必要としません。サービスは、サービス管理ツールやStartService関数を使用し、手動で起動することも可能です。サービスは、基本的には、ログオンユーザーと対話することはありません(第4章で触れるように、特定の条件さえクリアすれば対話は可能です)。

 サービスコントロールマネージャ(SCM)は、\Windows\System32\Services.exeを実行する特殊なシステムプロセスです。このプロセスは、サービスプロセスとの対話を通してサービスの動作を開始したり、あるいは停止する機能を提供します。サービスプログラムは、特殊なWindows関数を呼び出すとはいえ、実際にはWindowsイメージにすぎません。サービスプログラムは、特殊なWindows関数を使ってサービスコントロールマネージャと対話し、サービス起動の成功登録、ステータス要求への応答、サービスの一時停止やシャットダウンなどの処理を行います。システム内のサービスは、HKLM\SYSTEM\CurrentControlSet\Servicesキーに格納されています。Windows 2000リソースキットのRegistry Entriesヘルプファイル(Regentry.chm)を見れば、関連サブキーと格納値がわかります。

 サービスは、プロセス名、内部名、表示名という3種類の名前を持っています。内部名はレジストリに格納されている値であり、表示名はサービス管理ツールなどに表示される文字列です。ただし、すべてのサービスが表示名を持っているわけではありません。持っていない場合、内部名が表示されます。Windowsサービスは、サービスの動作内容を解説する簡単な文字列(Descriptionフィールド)を持っています。

 サービスプロセスとそのプロセスが提供するサービスの関係を知りたい場合には、tlist/sコマンドが使えます。ただし、サービスプロセスと動作中のサービスの間には、常に一対一の対応関係があるわけではないことに注意しておいてください。サービスによっては、他のサービスとプロセスを共有しています。レジストリにはサービスタイプコードというものがあり、そのコードを見れば、独自のプロセスを持つサービスなのか、あるいは他のサービスとプロセスを共有するサービスなのかがわかります。

 スプーラ、イベントログ、タスクスケジューラ、各種のネットワーク関連コンポーネントなどの多くのWindowsコンポーネントは、サービスとして実装されています。

実験:インストールされているサービスをリスト表示する

 インストールされているサービスをリスト表示したい場合には、コントロールパネルから管理ツールを選択し、次にサービスを選択します。次のようなサービスリストが表示されてくるはずです。

 サービスの詳しいプロパティを表示させた場合、サービスを右クリックし、[プロパティ]を選択します。たとえば、Print Spoolerサービスのプロパティは次のようになっています。

 [実行ファイルのパス]フィールドはサービスを含むプログラムを示しています。サービスによっては他のサービスとプロセスを共有していますから、サービスとプロセスが一対一に対応していないこともあります。この点はよく覚えておきましょう。

 
実験:サービスプロセス内のサービス詳細を表示する

 Process Explorerは、1つ以上のサービスを提供するプロセスを強調表示します。[Options]−[Configure Highlighting]を選択し、必要な操作を行います。サービス提供プロセスをダブルクリックすると、[Services]タブがあります。そのタブをクリックすると、プロセスが提供するサービスのリストが表示されます(サービスを定義するレジストリキー名、管理者に見える表示名、サービスの説明文字列)。たとえば、Windows Server 2003環境でSystemアカウントで動作しているSvchost.exeは、次のようなサービスを提供しています。

 サービスの詳しい説明は第4章で行います。

まとめ

 本章では、Windowsのシステムアーキテクチャ概要を紹介しました。Windowsを構成しているキーコンポーネントを検討し、それらが連携する背景などにも触れました。第3章では、それらのコンポーネントを支える、Windowsコアシステムメカニズムを詳しく調べます。たとえば、オブジェクトマネージャやオブジェクト間の同期などの背景を探ります。End of Article

 

 INDEX
  インサイドMicrosoft Windows 第4版 上
  第2章 システムアーキテクチャ
    2.1 要求と設計目標/2.2 オペレーティングシステムモデル
    2.3 アーキテクチャ概要/2.3.1 移植性/2.3.2 対称型マルチプロセッシング
    2.3.3 スケーラビリティ/2.3.4 クライアントとサーバー間の違い/2.3.5 チェックビルド
    2.4 キーシステムコンポーネント/2.4.1 環境サブシステムとサブシステムDLL
    2.4.2 Ntdll.dll/2.4.3 エグゼキュティブ
    2.4.4 カーネル/2.4.5 ハードウェア抽象化層(HAL)/2.4.6 デバイスドライバ
  2.4.7 システムプロセス/まとめ
 
インデックス・ページヘ  「BOOK Preview」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間