知識マップ: アプリから見たWindowsのシャットダウン ── 終了通知・再起動・電源断を正しく生き延びる
記事「アプリから見たWindowsのシャットダウン ── 終了通知・再起動・電源断を正しく生き延びる」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
シャットダウン通知を受けてから使える時間は原則5秒程度しかないため、その場で全部を保存する設計は破綻します。こまめな自動保存で保存すべき差分を小さくしておくのが前提です。GUIアプリはWM_QUERYENDSESSIONに即座にTRUEを返し、後始末はWM_ENDSESSIONで行います。高速スタートアップが有効な構成のシャットダウンはカーネルを休止させるだけなので、完全にリセットされるのは再起動だけです。サービスはSERVICE_ACCEPT_PRESHUTDOWNのほうが先に通知を受けられますが、既定タイムアウトはWindows 10 Creators Update以降10秒に短縮されています。電源断には通知が一切来ないため、一時ファイルに書き切ってReplaceFileで差し替え、バックアップと起動時検証までを復旧経路として用意します。
flowchart LR
accTitle: Windowsのシャットダウンに耐えるアプリ設計の知識マップ
accDescr: サインアウト・シャットダウン・再起動・電源断の違いとハイブリッドシャットダウン、GUIアプリの2段階通知と5秒の猶予、コンソールアプリとサービスの通知経路、再起動後の自動復帰、通知が来ない電源断に耐える書き込み設計を示す図
wm_queryendsession["WM_QUERYENDSESSION"]
hybrid_shutdown["ハイブリッドシャットダウン(高速スタートアップ)"]
ui_thread_context["UIスレッドのコンテキスト"]
shutdown_block_reason["ShutdownBlockReasonCreate"]
uninterruptible_operation["中断すると壊れる処理"]
full_boot_cycle["完全なブートサイクル"]
setconsolectrlhandler["SetConsoleCtrlHandler"]
dotnet_processexit["AppDomain.ProcessExit"]
service_shutdown_notification["SERVICE_CONTROL_SHUTDOWN"]
service_control_manager["SCM(サービス制御マネージャー)"]
service_preshutdown["SERVICE_ACCEPT_PRESHUTDOWN"]
register_application_restart["RegisterApplicationRestart"]
arso["ARSO(自動再起動サインオン)"]
replacefile["ReplaceFile"]
atomic_file_write_pattern["一時ファイル経由の安全な保存パターン"]
unexpected_power_loss["不意の電源断・強制停止"]
flushfilebuffers["FlushFileBuffers"]
cache_manager["キャッシュマネージャー"]
power_status_change["PBT_APMPOWERSTATUSCHANGE"]
unexpected_shutdown_events["シャットダウン関連のイベントログ(1074 / 41 / 6008)"]
windows_event_log["Windowsイベントログ"]
wm_queryendsession -->|"前提とする"| ui_thread_context
wm_queryendsession -->|"用いるのは非推奨"| shutdown_block_reason
shutdown_block_reason -->|"推奨される対応"| uninterruptible_operation
hybrid_shutdown -->|"両立しない"| full_boot_cycle
setconsolectrlhandler -->|"用いるのは非推奨"| ui_thread_context
dotnet_processexit -->|"用いるのは非推奨"| setconsolectrlhandler
service_shutdown_notification -->|"前提とする"| service_control_manager
service_preshutdown -->|"より先に行うべき"| service_shutdown_notification
register_application_restart -.->|"利用する"| arso
replacefile -->|"実装を担う"| atomic_file_write_pattern
replacefile -->|"軽減する"| unexpected_power_loss
flushfilebuffers -->|"前提とする"| cache_manager
power_status_change -->|"軽減する"| unexpected_power_loss
unexpected_shutdown_events -->|"で確認できる"| windows_event_log
概念間の関係(全14件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- WM_QUERYENDSESSIONはUIスレッドのコンテキストを前提とします。
- WM_QUERYENDSESSIONをShutdownBlockReasonCreateに用いることは推奨されません。
- ShutdownBlockReasonCreateは中断すると壊れる処理に対する本記事の推奨です。
- ハイブリッドシャットダウン(高速スタートアップ)は完全なブートサイクルと両立しません。
- SetConsoleCtrlHandlerをUIスレッドのコンテキストに用いることは推奨されません。
- AppDomain.ProcessExitをSetConsoleCtrlHandlerに用いることは推奨されません。
- SERVICE_CONTROL_SHUTDOWNはSCM(サービス制御マネージャー)を前提とします。
- SERVICE_ACCEPT_PRESHUTDOWNはSERVICE_CONTROL_SHUTDOWNより先に行うべきです。
- RegisterApplicationRestartはARSO(自動再起動サインオン)を利用します。
- ReplaceFileは一時ファイル経由の安全な保存パターンの実装を担います。
- ReplaceFileは不意の電源断・強制停止を軽減します。
- FlushFileBuffersはキャッシュマネージャーを前提とします。
- PBT_APMPOWERSTATUSCHANGEは不意の電源断・強制停止を軽減します。
- シャットダウン関連のイベントログ(1074 / 41 / 6008)はWindowsイベントログで確認できます。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。