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つのテクニックは、次の実験で実際に活用されています。
|
|
■セッションマネージャ(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コンポーネントは、サービスとして実装されています。
|
|
サービスの詳しい説明は第4章で行います。
まとめ
本章では、Windowsのシステムアーキテクチャ概要を紹介しました。Windowsを構成しているキーコンポーネントを検討し、それらが連携する背景などにも触れました。第3章では、それらのコンポーネントを支える、Windowsコアシステムメカニズムを詳しく調べます。たとえば、オブジェクトマネージャやオブジェクト間の同期などの背景を探ります。
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」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|