_ XPのエクスプローラ固まりますねぇ(2006/11/14) へたれたドライブやネットワークドライブ系、 あと、ファイルへのアクセスが多いアプリとかを併用してるとけっこう 頻度が高いです。ネットワークドライブで TortoiseSVN つかうとかね! SP1 が出るまえは Image Viewer とあわせて不幸になることが多かった記憶。
_ ドライブ一覧で反応がかえってこない要因は、たぶんデバイスドライバレベル での反応の問題ではあるのですが、ユーザへの反応が無くなってしまう直接的な 原因はエクスプローラの設計のまずさにあります。
_ アプリケーションからOSの機能を呼び出す時、多くの場合、 その処理が完了するまでアプリの実行が停止されます。 これをブロッキングといいます。ブロックされてしまった アプリケーションは、他のことがなにもできなくなり、 操作不能に陥ります。ブロッキング自体は回避できない ことなのですが、UI的には工夫の余地があります。
_ 個別のアプリケーションはOS の上で「プロセス」という 実行単位で扱われているのですが、この「プロセス」の中に、 さらに細かい実行単位「スレッド」があり、ブロッキングの対象は スレッドなので、あるスレッドがブロックされてもプロセス中の 他のスレッドは処理を続けることができます。 つまり、画面処理の部分を別スレッドで行っておけば、 仮にディスク情報の収集の処理でブロッキングがおこっても、 ユーザに対しては操作可能なままで動作し続けることができるわけです。
_ こういった「マルチスレッド」プログラミングは、 スレッド同士がメモリを共有する関係で、こまかい制御が必要になり、設計と 実装が難しいです。特に UI 系は制御が煩雑になるため、一般的な Windows プログラミングでは、画面制御の部分を中心に、極力シングルスレッドで 動作させ、ブロッキングの時間が長くなることが予想されるなど、どうしても 必要な部分だけマルチスレッドにする、というスタイルが とられています。
_ エクスプローラもこの例に漏れず、ファイルコピーなどの処理では、 別スレッドを立ち上げて処理を行っているのですが、ドライブ情報の収集 などでは、ごく短時間で処理が終わることを期待して、画面処理と同じ スレッドでそのまま処理してしまっているのでしょう。工夫が 今一歩足りなかったわけです。
_ さて、「データ構造ごとまるごと分離してそのあと相互に干渉しない」と いう方針の場合は、マルチスレッドでも難しくないので、エクスプローラは 実際には「タスクバー+個別の窓単位に1つづつのスレッドで動作するプロセス」 として動作しています。機能がかぶるアプリケーションでプロセスを共有すると、 プログラム領域やリソース領域など、読み出し専用の部分を共有できるので、 メモリ効率がとても良いのです。
_ ところが、外部からのアプリケーションの終了処理は「プロセス」単位でしか 行うことができません。このため、エクスプローラの1つの窓=1つのスレッドが 反応がないからといって強制終了を行うと、全部のエクスプローラ窓+タスクバー まで皆がまきぞえでお亡くなりになってしまうわけです orz
_ これの回避方法としては 「エクスプローラを別プロセスとして起動する」という隠し機能が知られてます。 これでタスクバーとエクスプローラが分離します。 加えて、エクスプローラのツール/フォルダオプションメニューから、 表示タブの詳細設定欄の「別のプロセスでフォルダウィンドウを開く」 をチェックすることで、個別のエクスプローラ窓のプロセスも わかれるので、全体として巻き添え終了はなくなります。 そのかわりメモリ消費はかなり増えるので、 メモリが少ないマシンだとメモリ不足の原因になりかねないので要注意です。
_
Vista ではこのあたりの設計はどうなってるのかなぁ。
いろいろあって今試験用マシンはけっきょく無い状態^^;
メールはこちらへ...[わたなべごう (go @(at) denpa .(dot) org)]
この日記は、GNSを使用して作成されています。