等待链表,调度链表

在进程结构体Eprocess(offset 0x50和offset 0x190)是两个链表,里面圈着当前进程所有的线程

如下图

 线程的三种状态:就绪、等待、运行

正在运行中的线程就存储在KPCR中,就绪和等待的线程全存在另外的33个链表中。其中一个等待链表,32个就绪链表

这些链表都是用了_KTHREAD(0x60)这个位置,也就是说,线程在某一时刻,只能属于其中一个圈

在用windbg查看时,这个些链表的每个成员其实都是LIST_ENTRY结构体

 等待链表

调用了Sleep或WaitForSingleObject等函数,就挂到这个链表

查看等待链表

0: kd> dd KiWaitListHead
8055d4a8  8a0f6728 8a099940 00000011 00000000

调度链表

调度链表有32个圈,就有优先级:0-31 0最低 31最高 默认优先级一般是8

改变优先级就是从一个圈里面卸下来挂到另外一个圈上

这32个圈是正在调度的线程:包括正在运行的和准备运行的

例如:1个CPU和10个线程正在运行,那么某一时刻,正在运行的线程在KPCR中,其他9个在这32个圈中

查看调度链表

0: kd> dd KiDispatcherReadyListHead L70
8055df80  8055df80 8055df80 8055df88 8055df88
8055df90  8055df90 8055df90 8055df98 8055df98
8055dfa0  8055dfa0 8055dfa0 8055dfa8 8055dfa8
8055dfb0  8055dfb0 8055dfb0 8055dfb8 8055dfb8
8055dfc0  8055dfc0 8055dfc0 8055dfc8 8055dfc8
8055dfd0  8055dfd0 8055dfd0 8055dfd8 8055dfd8
8055dfe0  8055dfe0 8055dfe0 8055dfe8 8055dfe8
8055dff0  8055dff0 8055dff0 8055dff8 8055dff8
8055e000  8055e000 8055e000 8055e008 8055e008
8055e010  8055e010 8055e010 8055e018 8055e018
8055e020  8055e020 8055e020 8055e028 8055e028
8055e030  8055e030 8055e030 8055e038 8055e038
8055e040  8055e040 8055e040 8055e048 8055e048
8055e050  8055e050 8055e050 8055e058 8055e058
8055e060  8055e060 8055e060 8055e068 8055e068
8055e070  8055e070 8055e070 8055e078 8055e078

总结

这些圈都挂一个相同的位置,就是_KTHREAD(0x60)

原文地址:https://www.cnblogs.com/pppyyyzzz/p/14262709.html