知識マップ: 使用中のexe/DLLをどう差し替えるか ── Restart Managerと自動更新の「ファイル使用中」問題
記事「使用中のexe/DLLをどう差し替えるか ── Restart Managerと自動更新の「ファイル使用中」問題」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
実行中のexe・ロード済みDLLはメモリマップドファイルとしてOSに保持されるため中身の書き換えと削除はブロックされ、これがインストーラーの「再起動が必要です」という要求の主因になる。Restart ManagerはRmGetListで占有アプリ・サービスを列挙し、RmShutdownで終了させ、RegisterApplicationRestartで登録済みのアプリだけをRmRestartで再起動させることでOS再起動の要求を減らし、Windows Installer 4.0以降のMSIはこれを自動的に利用する。LocalSystemのサービスは別のユーザーセッションのアプリを終了・再起動できないという制約があり、WTSQueryUserTokenでセッショントークンを取得する方法などで越える必要がある。ファイルの中身はロックされてもディレクトリ上の名前は変更できるため、rename-then-replaceパターンでプロセスを止めずに更新でき、それでも差し替えられない場合はMoveFileExの再起動時置換予約が最終手段になる。
flowchart LR
accTitle: Restart Managerとファイル使用中問題の知識マップ
accDescr: 実行中exeがメモリマップドファイルとしてロックされる仕組み、Restart ManagerによるRmGetList・RmShutdown・RmRestartの流れとMSI統合、rename-then-replaceやMoveFileExの再起動時置換といった代替手段の関係を示す図
restart_manager["Restart Manager"]
file_lock_in_use["使用中ファイルのロック"]
rename_then_replace["rename-then-replaceパターン"]
memory_mapped_file["ファイルマッピング(メモリマップトファイル)"]
reboot_required_prompt["OS再起動の要求"]
rm_get_list["RmGetList"]
rm_shutdown["RmShutdown"]
rm_restart["RmRestart"]
windows_service["Windowsサービス"]
wm_queryendsession["WM_QUERYENDSESSION"]
wm_endsession["WM_ENDSESSION"]
register_application_restart["RegisterApplicationRestart"]
session_boundary_restriction["セッション境界の制約"]
wts_query_user_token["WTSQueryUserToken"]
msi["MSI(Windows Installer)"]
installer["インストーラー"]
msi_restart_manager_integration["MSIとRestart Managerの統合"]
movefileex_delay_until_reboot["MoveFileEx + MOVEFILE_DELAY_UNTIL_REBOOT"]
pending_file_rename_operations["PendingFileRenameOperations"]
memory_mapped_file -->|"原因になり得る"| file_lock_in_use
file_lock_in_use -->|"原因になり得る"| reboot_required_prompt
rename_then_replace -->|"軽減する"| file_lock_in_use
restart_manager -->|"軽減する"| reboot_required_prompt
restart_manager -->|"利用する"| rm_get_list
restart_manager -->|"利用する"| rm_shutdown
restart_manager -->|"利用する"| rm_restart
restart_manager -->|"利用する"| windows_service
file_lock_in_use -->|"で確認できる"| rm_get_list
rm_shutdown -->|"利用する"| wm_queryendsession
rm_shutdown -->|"利用する"| wm_endsession
wm_queryendsession -->|"より先に行うべき"| wm_endsession
rm_restart -.->|"前提とする"| register_application_restart
register_application_restart -->|"推奨される対応"| reboot_required_prompt
session_boundary_restriction -.->|"防止する"| restart_manager
wts_query_user_token -.->|"軽減する"| session_boundary_restriction
msi -->|"実装を担う"| installer
msi -->|"利用する"| restart_manager
msi_restart_manager_integration -->|"利用する"| restart_manager
movefileex_delay_until_reboot -->|"に保存される"| pending_file_rename_operations
movefileex_delay_until_reboot -.->|"推奨される対応"| file_lock_in_use
rename_then_replace -->|"推奨される対応"| reboot_required_prompt
概念間の関係(全22件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- ファイルマッピング(メモリマップトファイル)は使用中ファイルのロックの原因になることがあります。
- 使用中ファイルのロックはOS再起動の要求の原因になることがあります。
- rename-then-replaceパターンは使用中ファイルのロックを軽減します。
- Restart ManagerはOS再起動の要求を軽減します。
- Restart ManagerはRmGetListを利用します。
- Restart ManagerはRmShutdownを利用します。
- Restart ManagerはRmRestartを利用します。
- Restart ManagerはWindowsサービスを利用します。
- 使用中ファイルのロックはRmGetListで確認できます。
- RmShutdownはWM_QUERYENDSESSIONを利用します。
- RmShutdownはWM_ENDSESSIONを利用します。
- WM_QUERYENDSESSIONはWM_ENDSESSIONより先に行うべきです。
- RmRestartはRegisterApplicationRestartを前提とします。
- RegisterApplicationRestartはOS再起動の要求に対する本記事の推奨です。
- セッション境界の制約はRestart Managerを防ぎます。
- WTSQueryUserTokenはセッション境界の制約を軽減します。
- MSI(Windows Installer)はインストーラーの実装を担います。
- MSI(Windows Installer)はRestart Managerを利用します。
- MSIとRestart Managerの統合はRestart Managerを利用します。
- MoveFileEx + MOVEFILE_DELAY_UNTIL_REBOOTはPendingFileRenameOperationsに保存されます。
- MoveFileEx + MOVEFILE_DELAY_UNTIL_REBOOTは使用中ファイルのロックに対する本記事の推奨です。
- rename-then-replaceパターンはOS再起動の要求に対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。