本文提供有关并发可视化工具“线程”视图中的时间线报告的信息。
执行时间(线程视图)
线程视图时间线中的这些段表示执行时间,当线程在系统中的逻辑核心上主动执行工作时。
通过内核上下文切换事件检测线程状态更改。 Windows 事件跟踪(ETW)每毫秒捕获一次示例堆栈。 在一个非常短的绿色区域中,可能不会采用任何样本。 因此,某些短执行段可能不会显示调用堆栈。
单击执行段时,并发可视化工具将显示离单击位置最近的示例堆栈。 该示例堆栈的位置由时间线上方的黑色箭头或脱字符指示,并显示在“当前”选项卡上。
若要查看当前视图中所有执行段的传统采样配置文件,请单击“可见时间线配置文件中的 执行 ”。
I/O 时间(线程视图)
时间线中的这些段与分类为 I/O 的阻塞时间相关联。 这意味着线程正在等待 I/O操作完成。 该线程可能在 API 中被阻塞,或者因为 I/O 相关的内核等待而被并发可视化工具(Concurrency Visualizer)计为 I/O。 API,例如 CreateFile(), ReadFile()并 WSARecv() 属于此组。
内存管理时间
时间线中的这些段与分类为内存管理的阻塞时间相关联。 该场景意味着一个线程因与内存管理操作(如分页)相关的事件而被阻塞。 在此期间,线程被阻塞在一个并发可视化工具将其视作内存管理的 API 或内核状态中。 其中包括分页和内存分配等事件。
检查关联的调用堆栈和分析报告,以更好地了解被归类为内存管理的块的根本原因。
抢占时间
时间线中的这些段与分类为抢占的阻塞时间相关联。 此类别意味着由于以下原因之一,线程被切换出去:
计划程序使用更高的优先级线程替换了它。
线程的执行量子已过期,其他线程已准备好执行。
在此期间,因内核等待原因导致线程被阻止,并且此情况在并发可视化工具中被计数为抢占。 抢占段在线程从逻辑核心推送出来时开始,并在该线程恢复执行时结束。
抢占段的工具提示显示导致抢占的进程或线程的名称。 但是,这并不意味着接管的进程或线程实际上在整个抢占期运行。
睡眠时间
时间线中的这些段与归类为睡眠的阻塞时间相关联。 睡眠类别意味着线程已自愿放弃其逻辑核心,并且未执行任何工作。 在此期间,一个线程在并发可视化工具认为是“睡眠”的 API 中被阻塞。 例如 Sleep() 并 SwitchToThread() 属于此组的 API。
同步时间
时间线中的这些段与分类为同步的阻塞时间相关联。 当线程在同步时标记为被阻止时,其中一项是隐含的:
线程的执行可能导致调用已知的线程同步 API,例如
EnterCriticalSection()或WaitForSingleObject()。API 匹配算法不能完全全面,因此某些可以映射到其他类别的 API 也可能显示为同步,因为调用堆栈中的帧最终达到了映射到此类别的基础内核阻塞基元。
若要了解线程阻塞事件的根本原因,请仔细检查阻塞调用堆栈和配置文件报告。
UI 处理时间
时间线中的这些片段与被归类为 UI 处理的阻塞时间相关联。 这意味着线程正在泵送 Windows 消息或执行其他用户界面(UI)工作。 在此期间,一条线程在一个被并发可视化工具统计为UI处理的API中被阻塞。 例如 GetMessage() 并 MsgWaitForMultipleObjects() 属于此组的 API。
如果未识别预定义的阻止 API,请查看调用堆栈和配置文件报告以确定延迟的根本原因。
UI 处理类别可帮助你了解 GUI 应用程序的响应能力,在依赖于 UI 响应能力的应用程序中是可取的。 例如,如果应用程序中的 UI 线程在 UI 处理的时间达到了 100%,则表明该应用程序可能具备较高的响应能力。 但是,如果 UI 线程在其他类别中花费了大量时间,请查找根本原因,并考虑用于减少该线程上的非 UI 类别的选项。