日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(56)等待链表,调度链表

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (56)等待链表,调度链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、回顧

進程結構體EPROCESS(0x50和0x190)是2個鏈表,里面圈著當前進程所有的線程。

對進程斷鏈,程序可以正常運行,原因是CPU執行與調度是基于線程的,進程斷鏈只是影響一些遍歷系統進程的API,并不會影響程序執行。

對線程斷鏈也是一樣的,斷鏈后在Windbg或者OD中無法看到被斷掉的線程,但并不影響其執行(仍然在跑)。

二、線程的三種狀態:等待,運行,就緒

線程可以分為3種狀態:

1、wait(等待,掛起,阻塞隨便怎么翻譯)

導致線程等待的原因有多種,例如調用了Sleep, WaitForSingleObject 等函數,或者在創建時和運行時讓線程掛起的API,例如 SuspendThread 函數。

等待線程存儲在等待鏈表頭 KiWaitListHead 中, KiWaitListHead 是一個全局變量,可以 dd 查看。

kd> dd KiWaitListHead 80553d88 81fa69d8 81fe6488 00000011 00000000

0x80553d88 存儲了 KiWaitListHead ,這是一個 _LIST_ENTRY,它屬于某個線程 _KTHREAD + 0x60 的位置。

+0x060 WaitListEntry : _LIST_ENTRY+0x060 SwapListEntry : _SINGLE_LIST_ENTRY

_KTHREAD + 0x60 是一個共用體 union,線程處于等待或者調度狀態就會存到這個位置的鏈表里,如果是等待狀態,這個地方就是等待鏈表;如果是調度狀態,這里就是調度鏈表。

舉例說明,我們可以看看當前的 WaitListEntry.FLink 線程是誰:
首先通過 ETHREAD 找到 EPROCESS:

kd> dt _ETHREAD 81fa69d8-60 ... +0x220 ThreadsProcess : 0x81b87b08 _EPROCESS ...

然后看看鏡像名:

dt _EPROCESS 0x81b87b08 ... +0x174 ImageFileName : [16] "svchost.exe" ...

2、running(運行中)

一個核只有一個運行中的線程,運行中的線程存儲在 KPCR 中。


3、ready(就緒,等待調度)

所有就緒線程根據32個不同的優先級,各自存儲在32個鏈表中。

通過全局變量 KiDispatcherReadyListHead 可以查看這32個鏈表的鏈表頭:

kd> dd KiDispatcherReadyListHead L70 80554820 80554820 80554820 80554828 80554828 80554830 80554830 80554830 80554838 80554838 80554840 80554840 80554840 80554848 80554848 80554850 80554850 80554850 80554858 80554858 80554860 80554860 80554860 80554868 80554868 80554870 80554870 80554870 80554878 80554878 80554880 80554880 80554880 80554888 80554888 80554890 80554890 80554890 80554898 80554898 805548a0 805548a0 805548a0 805548a8 805548a8 805548b0 805548b0 805548b0 805548b8 805548b8 805548c0 805548c0 805548c0 805548c8 805548c8 805548d0 805548d0 805548d0 805548d8 805548d8 805548e0 805548e0 805548e0 805548e8 805548e8 805548f0 805548f0 805548f0 805548f8 805548f8 80554900 80554900 80554900 80554908 80554908 80554910 80554910 80554910 80554918 80554918

每兩個4字節就構成了一個 LIST_ENTRY,我們發現這里32個鏈表都是空的,原因是現在windbg把系統掛起了,所有線程都處于等待狀態,不能被調度了。

32個鏈表對應32個優先級 0-31,默認優先級是8,優先級越高越優先。我推測空閑線程 IdleThread 的優先級是最低的。

三、理解模擬線程切換的代碼

目前學習的內容都是為后面學習線程切換打基礎,學到這里,我們需要先閱讀 ThreadSwitch.c 模擬線程切換的代碼,學習3環如何模擬線程切換,這是打基礎的最后一步。

所以,這節課的課后作業首先就是對著視頻,把代碼抄下來。

總結

以上是生活随笔為你收集整理的(56)等待链表,调度链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。