TDR (逾時偵測和復原)
本文說明驅動程式開發人員的逾時偵測和復原 (TDR) 。 如需詳細資訊,請參閱 Windows 8 和更新版本中的 TDR。
概觀
圖形中最常見的穩定性問題之一是在電腦實際處理使用者命令或作業時顯示為「停止回應」或完全「凍結」時發生。 許多使用者等候幾秒鐘,然後決定重新啟動電腦。 計算機的凍結外觀經常發生,因為 GPU 正在忙碌處理密集的圖形化作業,通常是在遊戲期間,因此不會更新顯示畫面。 TDR 可讓操作系統偵測 UI 沒有回應。
下圖顯示 TDR 程式。
OS 會嘗試偵測電腦似乎「凍結」的情況。 OS 接著會嘗試從凍結的情況動態復原,讓桌面再次回應,以減輕使用者不需要重新啟動其系統的情況。
根據預設,如果OS偵測到五個 (5) 或更多 GPU 停止回應, (0x117) ,且後續復原會在 (1) 1) 分鐘內發生,OS 會錯誤地檢查下一個 (第六個或更多) GPU 停止響應的計算機。 如需詳細資訊,請參閱 TdrLimitCount 和 TdrLimitTime。
請注意,引擎逾時 () 0x141 不會造成 GPU 停止回應計數,不過如果引擎逾時失敗,OS 可能會將引擎逾時升階為 GPU 停止回應。 若為引擎逾時 (0x141) ,最大數目會小於配接器逾時 (0x117) 。 引擎重設進程會封鎖造成這類逾時之進程的 GPU 存取,而系統記錄 0x142 表示該事實。 如此一來,故障的程式就不會對系統進行錯誤檢查。
WDDM 中的逾時偵測
GPU 排程器是 DirectX 圖形核心子系統 (Dxgkrnl.sys) 的一部分,會偵測 GPU 花費的時間超過執行特定工作的時間量。 GPU 排程器接著會嘗試先佔此特定工作。 優先作業具有「等候」逾時,這是實際的 TDR 逾時。 Windows Vista 和更新版本中的預設逾時期間為 2 秒。 如果 GPU 無法在 TDR 逾時期間內完成或先佔目前的工作,OS 會診斷 GPU 已凍結。
為了避免發生逾時偵測,硬體廠商應該確保圖形作業 (也就是 DMA 緩衝區完成) 在使用者案例中不需要超過 2 秒,例如生產力和遊戲遊戲。
準備復原
GPU 排程器會呼叫顯示迷你埠驅動程式的 DxgkDdiResetFromTimeout 函式,通知驅動程式操作系統偵測到逾時。 然後,驅動程式必須重新初始化本身並重設 GPU。 此外,驅動程式必須停止存取記憶體,而且不應該存取硬體。 OS 和驅動程式會收集硬體和其他狀態資訊,這對於復原後診斷很有用。
如需詳細資訊,請參閱 Windows 8 和更新版本中的 TDR。
桌面復原
OS 會重設圖形堆疊的適當狀態。 視訊記憶體管理員也是 Dxgkrnl.sys的一部分,會清除視訊記憶體中的所有配置。 顯示迷你埠驅動程式會重設 GPU 硬體狀態。 圖形堆疊會採取最終動作,並將桌面還原至響應狀態。
從停止響應偵測到復原的唯一可見成品是螢幕閃爍。 當OS重設圖形堆疊的某些部分時,這個閃爍會產生螢幕重繪。 當顯示迷你埠驅動程式符合 WDDM 1.2 和更新版本時,可以消除此重新繪製 (請參閱 在 WDDM 1.2 和更新版本中提供順暢的狀態轉換和更新版本) 。
當 OS 成功復原桌面時,它會完成下列動作:
- 向使用者顯示參考訊息,指出「顯示驅動程式已停止回應並已復原」。
- 在 事件檢視器 應用程式中記錄上述訊息,並以偵錯報告的形式收集診斷資訊。 如果使用者選擇提供意見反應,OS 會透過在線當機分析 (OCA) 機制,將此偵錯報告傳回給 Microsoft。
某些舊版 DirectX 應用程式可能只會在此復原結束時呈現黑色,這需要使用者重新啟動這些應用程式。 撰寫良好的 DirectX 9Ex 和 DirectX 10 和更新版本應用程式,可處理 Device Remove 技術繼續正常運作。 應用程式必須釋放,然後重新建立其 Microsoft Direct3D 裝置和所有裝置的物件。
線程同步處理和 TDR
如需詳細資訊 ,請參閱線程同步處理和 TDR 。
測試和偵錯 TDR
如需詳細資訊,請參閱 測試和偵錯 TDR 。