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