トップ回答者
Loosely-Coupled IE (LCIE) の挙動について

質問
-
IE8からフレームプロセスとタブプロセスが分離され、フレームは親プロセスに移動したことはIEBlogの記事で確認しました。
本機能について確認させてください。
(1)プロセスモデルについて
IEBlogで記載されているプロセスモデルと、MSDNの邦訳されたもの(クラッシュからの自動回復、という資料)のプロセスモデルが微妙に違っているのですがどちらが正しいですか?
IEBlogが正しく、Tab1・・・Tab n とかいてあるのは、グルーピングされた場合、そのグループ内のタブプロセス内でToolbar ExtensionやActiveXなどは共通と思ってますが認識はあっていますか?
(2)マージングについて
別ウィンドウでIEを立ち上げても親となるブローカオブジェクトは増えません。この変わり、ブローカオブジェクト内にIFrameのスレッドが1つ増えていました。このようにIEを複数起動しても親は元のIExploreのプロセスにIFrameのスレッドが増えていくと考えていいですか?これをやめるには -nomerge オプションをつけて起動ということで正しいでしょうか。
(3)証明書情報の引継ぎについて
ひとつのプロセス内で一度固有のCredential (証明書情報) が使われた場合、異なるCredential を使ってプロセスを再利用することはできない、ということがしっかりと理解できませんでした。
これは、たとえば -nomerge でつけて起動しなかった場合、いちど、Aという人の証明書を使ってログインした場合、次にBという人の証明書でログインしようと思っても、IEをすべて閉じないと A で入ってしまう、という感じでしょうか?
移行に際し、レンダリングにばかり注目が集まりますが、意外とLCIEはつまずくポイントではないかと使ってみて感じています。
とはいえ、情報があまり豊富とは言えないです。可能であればLCIEについても情報を充実させていただけるとうれしいです。
回答
-
tnaoshi さん、こんにちは。
(1) プロセスモデルについて
今私も気が付きましたが、MSDN 邦訳されたものは図が IE7 と IE8 で逆になっていますね。すみません、確認して修正するように連絡します。IEBlog のほうが正しく、IE8 ではグルーピングされた際に、そのグループ内のタブプロセス内て、Toolbar Extensions や ActiveXコントロールは共有され、メモリの有効活用および新しくウィンドウ/タブを開いた時にまた一からコントロールなどを呼び出すことなく開くことで早く表示させることができるようになりました。
(2) マージングについて
おっしゃるように通常別ウィンドウで IE を立ち上げてもブローカーオブジェクトは増えず、最初に立ち上げたブローカーオブジェクト内に IEFRAME が増えていくことになります。これを明示的にやめて、新しいウィンドウを立ち上げる毎にブローカーオブジェクトを立ち上げる (= 明示的に新しいセッションを得るなど) には、iexplorer.exe に -nomerge オプションを付けて起動する必要があります。
(3) 証明書情報の引継ぎについて
これは、私の説明がちょっとまずかったのですが、実際は利用できないわけではなく、同一プロセス内で異なる Credential を使わないで欲しい (=使うと問題が起こりやすい)、ということです。
US の IE Team の説明では、IE は従来から 1 Process = 1 Credential というのが基本だったようです。IE8 以前では、親ウィンドウから新しくウィンドウやタブを開いても、一つのプロセス内で処理していました。なので、一度親ウィンドウにて認証を受けた後は別ウィンドウを一から立ち上げるか、一度 IE をすべて閉じてから新しく IE を立ち上げるまではそのプロセス内に Credential が残って引き継がれていました。(また、以前の IE では同じプロセス内で異なる Credential を使った場合、それが上書きされていたようです。)
しかし、IE8 からはこのプロセスモデルの変更によって、親ウィンドウから新しくウィンドウ/タブを開くたびに、新しくプロセスが発生するため Credential を要求します。
例えで書かれているところを、これに合わせると次のようになります。
通常、最初に A という人の証明書を使ってログインした場合、(ログアウトせずに、親ウィンドウを閉じずに Credential が保たれた状態で) 、次に B という人の証明書でログインすると、見た目ログインできますが、次に Credential を使ってアクセスする場合は A の Credential を使うことになります。これが異なる Credential を使ってプロセスを再利用(し続ける) ことはできない、ということになります。
なので、異なる Credential を使わせる場合、ログアウトして Credential 情報を破棄させるか、Credential を保ったプロセスを閉じるか、- nomerge で新しく IEを ( IEFRAME を元のウィンドウにマージさせずに) 立ち上げる必要があります。
また注意点として、プロセスの再利用の効率化や誤った操作によるセッションの引継ぎのために、タブや新しく開いたウィンドウによって発生したプロセスは、一度閉じても約 60 秒間はキープされます。このため、例えば一度新しいウィンドウを開いて Credential を求められて、そのウィンドウを閉じても 60秒以内に同じく新しいウィンドウを開くと、そのプロセスが再利用されるため、Credential を求められることなく開いてしまいます。
今日の Web サイト/サービスでは、確実にログインセッションをキープさせるために、HTTP Cookie などを用いていたり、異なる ID などでログインする場合は、一度前の ID をログオフさせる、という方法をとっていることが多いので、この IE8 でのプロセスモデルの変更による影響が表に表れていませんが、セッションをキープさせる方法が Credential 以外に持たないサービスだと、同じプロセス内での処理は問題ありませんが、新しくウィンドウを開いたりする場合に、何度も Credential を要求されることになります。
五寳
すべての返信
-
tnaoshi さん、こんにちは。
(1) プロセスモデルについて
今私も気が付きましたが、MSDN 邦訳されたものは図が IE7 と IE8 で逆になっていますね。すみません、確認して修正するように連絡します。IEBlog のほうが正しく、IE8 ではグルーピングされた際に、そのグループ内のタブプロセス内て、Toolbar Extensions や ActiveXコントロールは共有され、メモリの有効活用および新しくウィンドウ/タブを開いた時にまた一からコントロールなどを呼び出すことなく開くことで早く表示させることができるようになりました。
(2) マージングについて
おっしゃるように通常別ウィンドウで IE を立ち上げてもブローカーオブジェクトは増えず、最初に立ち上げたブローカーオブジェクト内に IEFRAME が増えていくことになります。これを明示的にやめて、新しいウィンドウを立ち上げる毎にブローカーオブジェクトを立ち上げる (= 明示的に新しいセッションを得るなど) には、iexplorer.exe に -nomerge オプションを付けて起動する必要があります。
(3) 証明書情報の引継ぎについて
これは、私の説明がちょっとまずかったのですが、実際は利用できないわけではなく、同一プロセス内で異なる Credential を使わないで欲しい (=使うと問題が起こりやすい)、ということです。
US の IE Team の説明では、IE は従来から 1 Process = 1 Credential というのが基本だったようです。IE8 以前では、親ウィンドウから新しくウィンドウやタブを開いても、一つのプロセス内で処理していました。なので、一度親ウィンドウにて認証を受けた後は別ウィンドウを一から立ち上げるか、一度 IE をすべて閉じてから新しく IE を立ち上げるまではそのプロセス内に Credential が残って引き継がれていました。(また、以前の IE では同じプロセス内で異なる Credential を使った場合、それが上書きされていたようです。)
しかし、IE8 からはこのプロセスモデルの変更によって、親ウィンドウから新しくウィンドウ/タブを開くたびに、新しくプロセスが発生するため Credential を要求します。
例えで書かれているところを、これに合わせると次のようになります。
通常、最初に A という人の証明書を使ってログインした場合、(ログアウトせずに、親ウィンドウを閉じずに Credential が保たれた状態で) 、次に B という人の証明書でログインすると、見た目ログインできますが、次に Credential を使ってアクセスする場合は A の Credential を使うことになります。これが異なる Credential を使ってプロセスを再利用(し続ける) ことはできない、ということになります。
なので、異なる Credential を使わせる場合、ログアウトして Credential 情報を破棄させるか、Credential を保ったプロセスを閉じるか、- nomerge で新しく IEを ( IEFRAME を元のウィンドウにマージさせずに) 立ち上げる必要があります。
また注意点として、プロセスの再利用の効率化や誤った操作によるセッションの引継ぎのために、タブや新しく開いたウィンドウによって発生したプロセスは、一度閉じても約 60 秒間はキープされます。このため、例えば一度新しいウィンドウを開いて Credential を求められて、そのウィンドウを閉じても 60秒以内に同じく新しいウィンドウを開くと、そのプロセスが再利用されるため、Credential を求められることなく開いてしまいます。
今日の Web サイト/サービスでは、確実にログインセッションをキープさせるために、HTTP Cookie などを用いていたり、異なる ID などでログインする場合は、一度前の ID をログオフさせる、という方法をとっていることが多いので、この IE8 でのプロセスモデルの変更による影響が表に表れていませんが、セッションをキープさせる方法が Credential 以外に持たないサービスだと、同じプロセス内での処理は問題ありませんが、新しくウィンドウを開いたりする場合に、何度も Credential を要求されることになります。
五寳
-
丁寧な返信ありがとうございます。だいぶ理解できました。
たしかに、Process Explorer で確認すると window.open() でウィンドウを開いた際に
IE7 の場合は同じプロセス
IE8 の場合は別のプロセス
でした。
あと1点教えてください。-nomerge オプションなのですが、-nomerge オプションをつけて起動すると、確かにIEを複数起動した際に、マージされなくなります。ただ、window.open() でウィンドウを開いた際には挙動が変わらないように見えます。
たとえば、以下のようなソースで -nomerge をつけたIEから、ボタンをクリックしたらウィンドウが開くサンプルでは、ブローカプロセスの下にプロセスが作成され、-nomerge をつけたIEでもそうでなくても変わらないように見えました。スクリプトから開いたときは何か違いがあるのでしょうか?-nomerge をつけたIEでは、異なるCredentialをいつでも使えるということであればまあいいのですが。
<script type="text/javascript">
あまり広範な知識が無いのでおかしなことを言っているかもしれません。その場合は指摘ください。よろしくお願いします。
function OpenWin(){
ret=window.open("./hoge.html","new","");
}
</script> -
tnaoshi 様
返信が遅くなりました。
上記の -nomerge オプションの振る舞いについては、別途確認します。
基本的には、IEBlog で Andy が言っているように -nomerge をつけた IE では 異なる Credential をいつでも要求するようになるのですが、まだ私のほうでも確信できていません。もうちょっとお待ちを。。。また、回答のフォローなのですが、IE8 では必ずしも新しく開いた タブ やウィンドウが別プロセスになるわけではなく、数個連続で開いたり、多くのタブ・ウィンドウを開いていくと、あるタイミングでプロセスがカップリングされます。このあたり、ポリシーの設定と、"TabProcGrowth" というレジストリキーにて、そのタイミングとプロセスの増減をコントロールできるようになります。
うーん、このあたりのちょっとあいまいなところが、"Loosely-Coupled" の名称の由来のようです。。。
- nomerge と カップリングのタイミングについて、ちょっと確認します。
五寳
-
自己アップデートです。60秒後にプロセスが消滅する仕組みですが、レジストリで時間を制御できました。
Partner Build Update で確認したので RC/RTW になった時にも確認しないといけないといけないでしょうけれど。
キー: HKCU\Software\Microsoft\Internet Explorer\Main
エントリ: TabShutdownDelay
データ型:REG_DWORD
データ (decimal): 60000 (10進数)です。0 にしたところを Process Explorer で確認したらすぐに消えました。
Credentialの動作の方はどんな感じでしょうかね...