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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

进程线程002 等待链表 调度链表

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

文章目錄

    • 前言
    • 等待鏈表
    • 33個鏈表
    • 調度鏈表
    • 版本差異
    • 總結

前言

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

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

對線程斷鏈也一樣,斷鏈后在Windbg或者OD無法看到被斷掉的線程,但并不影響線程執行。

等待鏈表

線程有三種狀態:就緒 等待 運行。

當線程調用了Sleep或者WaitForSingleObject等函數時,就掛到這個鏈表上。用下面這條命令可以查看等待鏈表。

kd> dd KiWaitListHead

KiWaitListHead是一個全局變量,里面存的是一個雙向鏈表。阻塞中的線程一定在這個等待鏈表里。這個雙向鏈表指向KTHREAD這個結構體的下面這個位置。

kd> dt _KTHREAD+0x074 WaitListEntry : _LIST_ENTRY+0x074 SwapListEntry : _SINGLE_LIST_ENTRY

33個鏈表

正在運行中的線程存儲在KPCR中,就緒和等待的線程全在另外的33個鏈表中。一個等待鏈表,32個就緒鏈表

這些鏈表都使用了KTHREAD(0x60)的位置,也就是說線程在某一時刻,只能屬于其中一個圈。

調度鏈表

就緒鏈表也稱為調度鏈表,既然有32個鏈表,就要有32個鏈表頭。在windbg中用下面的命令查看調度鏈表

kd> dd KiDispatcherReadyListHead L70

KiDispatcherReadyListHead是一個全局變量,存儲了32個鏈表的鏈表頭。那么為什么等待鏈表只有1個,而調度鏈表有32個呢。原因在于運行中的線程是有線程優先級的,這32個鏈表里面存儲的就是不同的優先級的線程。

版本差異

XP只有32個圈,也就是說上面這個數組只有一個,多核也只有一個。W7也是一樣的只有一個圈。如果是64位,那就有64個圈。

服務器版本:KiWaitListHead整個系統只有一個,但KiDispatcherReadyListHead這個數組有幾個CPU就有幾組

總結

  • 正在運行的線程在KPCR中
  • 準備運行的線程在32個調度鏈表里,KiDispatcherReadyListHead是個數組存儲了這32個鏈表頭
  • 等待狀態的線程存儲在等待鏈表里,KiWaitListHead存儲鏈表頭
    數組存儲了這32個鏈表頭
  • 等待狀態的線程存儲在等待鏈表里,KiWaitListHead存儲鏈表頭
  • 這些圈都掛在同一個相同的位置KTHREAD結構體
  • 總結

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

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