Debugging Tools for Windows |
!exqueue扩展显示ExWorkerQueue工作队列(work queue)中当前被排队的项目列表。
Bit 0 (0x1) | 如果没有设置0x02的话,显示时间和优先级统计。 |
Bit 1 (0x2) | 显示工作队列关联的线程和事件列表,以及它们的等待状态。 |
Bit 2 (0x4) | 显示和工作队列关联的线程列表。如果没有同时使用0x2,则每个线程显示在单独的一行上。如果使用了0x2,每个线程和一个堆栈回溯一起显示。 |
Bit 3 (0x8) | (Windows XP和之后) 在队列的每个线程的显示中加入返回地址、堆栈指针、以及(在Itanium系统中)bsp寄存器的值。不会显示函数的参数。 |
Bit 4 (0x10) | 只显示临界工作队列(critical work queue)。 |
Bit 5 (0x20) | 只显示延迟工作队列(delayed work queue)。 |
Bit 6 (0x40) | 只显示超临界工作队列(hypercritical work queue)。 |
Windows 2000 | Kdextx86.dll |
Windows XP和之后 | Kdexts.dll |
如果Flags不包含bit 4、5、6,则显示中包括临界工作队列 (critical work queue)、延时工作队列(delayed work queue),以及超临界工作队列(hypercritical work queue)。
下面是该命令输出的示例:
Dumping ExWorkerQueue: 8046A5C0
**** Critical WorkQueue( current = 0 maximum = 1 )
THREAD fe502940 Cid 8.c Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe5026c0 Cid 8.10 Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe502440 Cid 8.14 Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe5021c0 Cid 8.18 Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe501020 Cid 8.1c Teb: 00000000 Win32Thread: 00000000 WAIT
**** Delayed WorkQueue( current = 0 maximum = 1 )
THREAD fe501da0 Cid 8.20 Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe501b20 Cid 8.24 Teb: 00000000 Win32Thread: 00000000 WAIT
THREAD fe5018a0 Cid 8.28 Teb: 00000000 Win32Thread: 00000000 WAIT
**** HyperCritical WorkQueue( current = 0 maximum = 1 )
THREAD fe501620 Cid 8.2c Teb: 00000000 Win32Thread: 00000000 WAIT
在!exqueue输出中的重要信息有:
参数 | 含义 |
---|---|
current | 队列中的运行中线程的数量;即队列中非等待状态的线程数量。 |
maximum | 队列中任何给定时间点允许运行的线程数量。这个一般是由系统中处理器数量决定的。 |
系统会执行任何current值比maximum值小的队列中的work item。如果current大于或等于maximum,则在有更多的队列中的线程完成执行或者进入等待状态之前,不会有新的work item被执行。该规则当某个CPU密集型work item正在执行并且不会进入等待状态时会延迟系统,因为它会阻止新的work item被执行,即使队列中还有空闲线程。
关于工作者线程的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。