进程线程002 等待链表 调度链表
文章目錄
- 前言
- 等待鏈表
- 33個鏈表
- 調度鏈表
- 版本差異
- 總結
前言
進程結構體EPROCESS(0x50和0x190)是2個鏈表,里面圈著當前進程的所有線程。
對進程斷鏈,程序可以正常運行,原因是CPU執行與調度是基于線程的,進程斷鏈只是影響一些遍歷系統進程的API,并不會影響程序執行。
對線程斷鏈也一樣,斷鏈后在Windbg或者OD無法看到被斷掉的線程,但并不影響線程執行。
等待鏈表
線程有三種狀態:就緒 等待 運行。
當線程調用了Sleep或者WaitForSingleObject等函數時,就掛到這個鏈表上。用下面這條命令可以查看等待鏈表。
kd> dd KiWaitListHeadKiWaitListHead是一個全局變量,里面存的是一個雙向鏈表。阻塞中的線程一定在這個等待鏈表里。這個雙向鏈表指向KTHREAD這個結構體的下面這個位置。
kd> dt _KTHREAD+0x074 WaitListEntry : _LIST_ENTRY+0x074 SwapListEntry : _SINGLE_LIST_ENTRY33個鏈表
正在運行中的線程存儲在KPCR中,就緒和等待的線程全在另外的33個鏈表中。一個等待鏈表,32個就緒鏈表
這些鏈表都使用了KTHREAD(0x60)的位置,也就是說線程在某一時刻,只能屬于其中一個圈。
調度鏈表
就緒鏈表也稱為調度鏈表,既然有32個鏈表,就要有32個鏈表頭。在windbg中用下面的命令查看調度鏈表
kd> dd KiDispatcherReadyListHead L70KiDispatcherReadyListHead是一個全局變量,存儲了32個鏈表的鏈表頭。那么為什么等待鏈表只有1個,而調度鏈表有32個呢。原因在于運行中的線程是有線程優先級的,這32個鏈表里面存儲的就是不同的優先級的線程。
版本差異
XP只有32個圈,也就是說上面這個數組只有一個,多核也只有一個。W7也是一樣的只有一個圈。如果是64位,那就有64個圈。
服務器版本:KiWaitListHead整個系統只有一個,但KiDispatcherReadyListHead這個數組有幾個CPU就有幾組
總結
數組存儲了這32個鏈表頭
總結
以上是生活随笔為你收集整理的进程线程002 等待链表 调度链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程线程001 进程线程结构体和KPCR
- 下一篇: 进程线程003 模拟线程切换