IE8 のプロセスモデルについて

こんにちは。つい最近、パパになった金(キム)です。

このごろ、あまり更新がなく、もし、本ブログの更新を待ち望んでいたユーザー様がいらっしゃいましたら、大変すみませんでした。^^;

最近、IE6、7 では期待通りに動いていた Web コンテンツなどが、IE8 にバージョン アップをしてから、期待通りに動作しないとのお問い合わせがよくあります。

今回は、このような現象の一つの要因と考えられる、IE8 から導入された新しいプロセス モデル、Loosely-Coupled IE (LCIE) についてお話をします。

また、この LCIE に関連して発生しうる動作についても、具体的な現象、要因と回避策についてご案内します。

- 目次 -

1. IE8 から導入された新しいプロセス モデル (LCIE) について。

2. IE8 で別々のウィンドウでもセッション情報が共有されてしまう。

3. IE8 でポップアップ ウィンドウが前面に表示されない。

4. IE8 で認証情報が付与されず、認証を求めるダイアログが表示される場合がある。

1. IE8 から導入された新しいプロセス モデル (LCIE) について

=====================================

IE8では、ブラウザの信頼性、パフォーマンス、およびスケーラビリティを改良する為の1つの方法としてLCIE を導入しています。

その為、IE8 はウィンドウのアドレスバーやお気に入りバーが表示される部分を処理するプロセス (フレーム プロセス) とコンテンツが表示される部分を処理するプロセス (タブ プロセス) が分離され動作します。

既定の設定では、IE アイコンをクリックするとフレーム プロセスとタブ プロセスの 2 つの iexplore.exeが最初に起動します。

IE アイコンを再度、クリックすると起動中のフレームプロセスやタブ プロセスが使用される場合もあれば、新規のタブ プロセスが起動する場合もあります。

タブ プロセスは、使用可能なメモリ量、タブ数、タブの整合性レベルなどをもとに増加します。

IE6、7 では、IE を起動した際に、1 つの iexplore.exeのみで処理され、新しいタブや子ウィンドウを開いた際も同一 iexplore.exe内で処理されます。

その為、LCIE 機能がなかった IE6、7 では新しいタブや子ウィンドウで異常終了が発生した場合、同一 iexplore.exeで処理されていたタブやウィンドウも影響を受け、同時に終了されてしまいます。

このような LCIE を制御する為には、下記のレジストリを追加する必要があります。

-----------------------------------------------------------------------------------

キー : HKLM (or HKCU) \Software\Microsoft\Internet Explorer\Main

名前 : TabProcGrowth

種類 : REG_DWORD

値 : 0 、1

0 : LCIE を無効にし、iexplore.exe を1つに制限します。(注 : 本設定をすると、保護モードも無効となります)

1 : 保護モード無効/有効の状態で iexplore.exe (タブ プロセス)をそれぞれ 1 つずつに制限する。

-----------------------------------------------------------------------------------

*デフォルトの状態ではこのキーはありませんので、必要に応じて作成します

参考情報 :

IE8 and Loosely-Coupled IE (LCIE)

<http://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx>

上記資料の日本語翻訳版は以下となります。ただし、製品出荷前の古い情報を含んでおりますのでご注意ください。

IE8 と Loosely-Coupled IE (LCIE)

<http://msdn.microsoft.com/ja-jp/ie/cc787974.aspx>

2. IE8 で別々のウィンドウでセッション情報が共有されてしまう

=====================================

現象:

IE8を起動しコンテンツを使用中、もう 1つの別のウィンドウを起動し、同じコンテンツにアクセスすると、セッション情報が共有されてしまう。

要因と回避策:

IE8 ではデフォルトでプロセスが異なる場合でも、セッション情報を引き継ぐ動作となります。

本動作を回避する為には下記のいずれかの方法があります。

1) TabProcGrowth=0 に設定することにより、IE8 の LCIE 機能が無効となり、プロセス間でのセッションを共有しない動作となります。

2) FrameMerging=0 に設定することにより、IE8 のプロセスが異なる場合にセッション情報を共有しない動作となります。

FrameMerging=0 の設定を行った場合、プロセス間でのセッション情報は共有されなくなりますが、IE8 のプロセスの分離動作 (LICE) は引き続き有効となります。

レジストリのキーと種類は、上記のTabProcGrowth と同じです。

3) IE8 の [ファイル] - [新規セッション] を選択することで、セッション情報を共有しないウィンドウを開くことが可能です。

4)コマンドプロンプトやスクリプトで、"-NoFrameMerging” を引数で起動することで、セッション情報を引き継がず IE を起動することができます。

iexplore.exe -NoFrameMerging <http://www.microsoft.com/>

3. ポップアップウィンドウが前面に表示されない。

==============================

現象:

親ページから子ページを開き、その子ページから親ページの Window.open を利用し、ポップアップ ウィンドウを表示すると、ポップアップウィンドウが前面に表示されない場合があります。

要因と回避策:

親ページの window.open メソッドが実行されると、IE8 内部では新しいタブ プロセスを作成し、新しいウィンドウに対して フォア グラウンド (SetForegroundWindow) 関数が実行されます。

しかし、window.open メソッドが実行されるプロセスとポップアップ ウィンドウを表示する新しいタブ プロセスが異なる場合には、ポップアップ ウィンドウが前面に表示されない (フォア グラウンドにならない) 場合があります。

本動作を回避する為には下記のいずれかの方法があります。

1) 親ウィンドウのページに記述されたwindow.open メソッドを経由せず、子ウィンドウで直接 window.open メソッドを実行し、ポップアップ ウィンドウを表示する。

2) ポップアップウィンドウを開く前に、alert や confirm を設定する。

3) LCIE の機能を無効にする。

4. IE8 で認証情報が付与されず、認証を求めるダイアログが表示される場合がある。

=================================================

現象:

IE8 にて認証が必要なコンテンツにアクセスし、コンテンツを利用します。

コンテンツを利用し始め、およそ、60 秒に Window.open で別のウィンドウを開く操作を行った場合に、認証を求めるダイアログが表示される場合があります。

要因と回避策:

例えば、IE8 起動時のホーム ページがインターネット (保護モード:有効)で、表示する任意のコンテンツがイントラネット(保護モード:無効)の場合には、フレーム プロセスとして iexplore.exe が 1つと、タブ プロセスとして iexplore.exe が2 つ起動します。

コンテンツを表示した際の IE のプロセスは下記のようになります。

フレーム プロセス

タブ プロセス 1 (保護モード有効)

タブ プロセス 2 (保護モード無効)

表示するコンテンツの保護モードは無効であるため、タブプロセス 2 がアクティブな状態、タブ プロセス 1 は非アクティブな状態です。

その後 60 秒が経過すると、非アクティブなタブ プロセス 1 が終了します。

このタイミングで window.open メソッドにより、新規ウィンドウを開く操作を行うと、タブプロセスが 1 つしか存在しないため、新たなタブ プロセスを増やす判断をします。

しかしながら、新しいタブプロセスは認証情報のキャッシュを持たないため、認証情報が付与されず、認証を求めるダイアログが表示されます。

本動作を回避する為には、上記の TabProcGrowth を 0、または 1 に設定する必要がございます。

以上です。

コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。