.NETアプリケーションは,通常のWindowsアプリケーションに比べるとセキュリティが向上しているといわれます。もしそうなら,.NETアプリケーションはどのようにセキュリティを確保しているのでしょうか。またそれによって,パフォーマンスは低下しないのでしょうか。今回は,単純な.NETアプリケーションを実行し,その動作をWindowsに標準で付属するパフォーマンス・モニターで監視して,.NETのセキュリティとパフォーマンスの関係を調べてみましょう。

使用する.NETアプリケーション

図1●.NET版メモ帳を起動した直後の様子をProcess Explorerで取得
図2●「Classes Loaded」,「Total Classes Loaded」,「Runtime Checks」の項目を設定する
図3●パフォーマンス・カウンタの補助機能
図4●パフォーマンス・モニターの監査結果
図5●.NET版メモ帳が使用するクラスに関する詳細な内部情報
図6●パフォーマンス・カウンタで「Processor Time」を選択する
図7●.NET版メモ帳のCPU使用率
図8●Win32版メモ帳のCPU使用率
 今回使用する.NETアプリケーションは,こちらからダウンロードできる.NET版メモ帳です。このアプリケーションはプログラミング言語C#で開発されています。ダウンロードできるコードには,プロジェクト・ファイルも含まれていますから,Visual C# .NETをお持ちの方は,すぐにビルドできます。

 それでは図1[拡大表示]の画面をご覧ください。この画面は,ダウンロードしたソースコードをビルドした.NET版メモ帳(MyNotepdad.exe)を起動した直後の様子を,Mark Russinovich氏が開発したProcess Explorerで取得したものです。画面を見ると分かるように,通常のWindowsアプリケーションであるメモ帳(notepdad.exe)も同時に起動されています。

 それではここで,画面内の「Classes Loaded」,「Total Classes Loaded」,「Runtime Checks」という3つの情報表示欄に注目してください。.NET版メモ帳の3つの表示欄には値が設定されていますが,通常のWindowsアプリケーション,例えば,Win32メモ帳の表示欄には値が設定されていません。これら3つの情報欄は,次のような.NETアプリケーションの特徴を示しています。

  • .NETアプリケーションはクラスで構成される
  • .NETアプリケーションを構成するクラスは管理されている
  • .NETアプリケーションは実行時に何らかのチェックを受けている

 .NETアプリケーションは,「マネージド・コード(managed code)」と呼ばれることがあります。「マネージド・コード」とは,その名のとおり,管理されているコード,という意味です。管理しているのは共通言語ランタイム・エンジン(CLR:Common Language Runtime)というものです。CLRは,基本的には,Java仮想マシン(JVM)と同じ位置付けになります。

 それでは次に,.NET版メモ帳であるMyNotepdad.exeを操作し,「Classes Loaded」,「Total Classes Loaded」,「Runtime Checks」の値の変化の様子を,Windowsに付属するパフォーマンス・モニターで監視してみましょう。パフォーマンス・モニターは,「コントロール・パネル」の「管理ツール」を開き,「パフォーマンス」をクリックすれば起動します。

.NETアプリケーションの動作を監視する

 ここでは,「Classes Loaded」,「Total Classes Loaded」,「Runtime Checks」の値の変化をパフォーマンス・モニターで監視します。そのため,監視対象となる3つの項目を図2[拡大表示]のように設定します。

 ご覧のように,「Classes Loaded」,「Total Classes Loaded」,「Runtime Checks」の表示欄に対応する「カウンタ」を3つ選択しています。適切なカウンタの選択には,経験と高度な知識が要求されますから,慣れないうちは,適当に選択し,少しずつ経験を積んでいくとよいと思います。なお,パフォーマンス・カウンタには選択できるカウンタの意味を説明する,図3[拡大表示]のような補助機能があります。

 3つのカウンタを選択後,筆者は.NET版メモ帳を次のように操作してみました。

操作1:「File/New」を選択する
操作2:テキスト画面に適当な文章を書き込む
操作3:「File/Save As」を選択し,名前を付けてファイルを保存する

 パフォーマンス・モニターは,図4[拡大表示]のような監視結果を報告してくれます。この監査結果は,次のようなことを教えてくれています。

  • 3つの操作を実行しても,新たにクラスがロードされていない
  • 3つの操作を実行すると,何らかのセキュリティ・チェックが行われている

 .NET版メモ帳はきわめて単純なアプリケーションですから,「新たなクラスがロードされない」ことは想像できます。一方,3つの単純な操作をしただけなのに,「何らかのセキュリティ・チェック」が行われていることが分かります。ここでは,アプリケーション内で呼び出しているコードと,呼び出されるコードのトークン(セキュリティ情報)の整合性チェックが行われている,と考えてください。ここで,図5[拡大表示]の画面をご覧ください。

 .NET版メモ帳は,使用するクラスに関する詳細な内部情報を持っています。基本的には,CLRはこれらの情報を使って,「何らかのセキュリティ・チェック」を行っていると考えられます。ちなみに,Win32メモ帳は,この画面に示すような内部情報を持っていません。

 「何らかのセキュリティチェック」が行われているようなので,.NET版メモ帳のパフォーマンスの低下が心配されます。そこで,.NET版メモ帳のパフォーマンスを調べてみましょう。

.NETアプリケーションのパフォーマンス

 アプリケーションのパフォーマンスの調べ方には,いろいろな方法があります。ここでは,CPUと.NET版メモ帳の関係に焦点を当てます。筆者は,図6[拡大表示]のようにパフォーマンス・カウンタを選択しました。

 ご覧のように,プロセスの「Processor Time」というカウンタを選択しています。ここでは,.NET版メモ帳とWin32メモ帳の2つのプロセスの「Process Time」カウンタを選択し,それぞれのプロセスのCPU使用率を比較しています。2つのメモ帳で行った操作は先ほどとまったく同じです。筆者の環境では,図7[拡大表示],図8[拡大表示]のような結果が出ました。

 この結果を単純に比較すると,CPU使用率に関する限り,.NET版メモ帳とWin32メモ帳の間に大きな違いはありません。興味のある方は,今回の記事を参考にしながら,いろいろなアプリケーションで比較してみるとよいでしょう。

今回のまとめ

  • .NETアプリケーションはセキュリティ・チェック用の情報を内部に持っている
  • .NETアプリケーションは実行時にセキュリティ・チェックを受ける
  • 単純な.NET版アプリケーションとWin32アプリケーションではパフォーマンスの違いはない
  • パフォーマンスモニタを使用すると,アプリケーションのパフォーマンスを監視できる