超时检测和恢复 (TDR)

本文介绍面向驱动程序开发人员的超时检测和恢复 (TDR) 。 有关详细信息,请参阅 Windows 8 及更高版本中的 TDR

概述

当计算机在实际处理最终用户命令或操作时出现“挂起”或完全“冻结”时,会出现图形中最常见的稳定性问题之一。 许多用户等待几秒钟,然后决定重新启动计算机。 由于 GPU 正忙于处理密集的图形操作(通常在玩游戏期间),因此不会更新显示屏幕,因此计算机经常出现冻结外观。 TDR 使操作系统能够检测 UI 没有响应。

下图显示了 TDR 过程。

显示超时检测和恢复 (TDR) 通过 WDDM 的 GPU 进程的关系图。

OS 尝试检测计算机似乎处于“冻结”状态的情况。 然后,OS 会尝试从冻结的情况下动态恢复,以便桌面再次响应,从而缓解最终用户无需重启其系统的情况。

默认情况下,如果 OS 检测到 5 个 (5) 或更多个 GPU 挂起 (0x117) ,并且后续恢复在 1 (1) 分钟内发生,则操作系统会在下一 (第六个或更多个) GPU 挂起时对计算机进行 bug 检查。 有关详细信息,请参阅 TdrLimitCountTdrLimitTime

请注意,引擎超时 (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 函数,以通知驱动程序 OS 检测到超时。 然后,驱动程序必须重新初始化自身并重置 GPU。 此外,驱动程序必须停止访问内存,并且不应访问硬件。 OS 和驱动程序收集可用于恢复后诊断的硬件和其他状态信息。

有关详细信息,请参阅 Windows 8 及更高版本中的 TDR

桌面恢复

OS 会重置图形堆栈的相应状态。 视频内存管理器(也是 Dxgkrnl.sys的一部分)从视频内存中清除所有分配。 显示微型端口驱动程序重置 GPU 硬件状态。 图形堆栈执行最终操作,并将桌面还原到响应状态。

从挂起检测到恢复的唯一可见项目是屏幕闪烁。 当 OS 重置图形堆栈的某些部分时,会导致此闪烁,从而导致屏幕重绘。 显示微型端口驱动程序在符合 WDDM 1.2 及更高版本时可以消除此重绘 (请参阅 在 WDDM 1.2 及更高版本中提供无缝状态转换) 。

操作系统成功恢复桌面后,它将完成以下操作:

  • 向最终用户显示一条信息性消息,指出“显示驱动程序停止响应并已恢复”。
  • 在 事件查看器 应用程序中记录上述消息,并采用调试报告的形式收集诊断信息。 如果最终用户选择提供反馈,OS 将通过联机故障分析 (OCA) 机制将此调试报告返回给 Microsoft。

某些旧版 DirectX 应用程序可能只是在此恢复结束时呈现黑色,这要求最终用户重启这些应用程序。 编写良好的 DirectX 9Ex 和 DirectX 10 及更高版本的处理设备删除技术的应用程序继续正常工作。 应用程序必须释放并重新创建其 Microsoft Direct3D 设备和设备的所有对象。

线程同步和 TDR

有关详细信息 ,请参阅线程同步和 TDR

测试和调试 TDR

有关详细信息 ,请参阅测试和调试 TDR