Windows进程与线程学习笔记(四)—— 等待链表&调度链表

要点回顾

  1. 进程结构体 _EPROCESS +0x050_EPROCESS +0x190 这2个链表圈着当前进程所有的线程
  2. 对进程断链,程序可以正常运行,原因是CPU执行与调度是基于线程的,进程断链只是影响一些遍历系统进程的API,并不会影响程序执行
  3. 对线程断链也是一样的,断链后在Windbg或者OD中无法看到被断掉的线程,但并不影响其执行(线程仍然在跑)

33个链表

  1. 线程有3种状态:就绪等待运行
  2. 正在运行中的线程存储在KPCR中,就绪等待的线程全在另外的33个链表中:
    1个等待链表,32个就绪链表
  3. 等待链表调度链表都使用了 _KTHREAD +0x060 这个位置,也就是说,线程在某一时刻,只能属于其中一个圈

等待链表

描述

  1. 等待链表是一个双向链表
  2. 它有两个成员,一个向后遍历,一个向前遍历
  3. 当线程调用了Sleep() 或者 WaitForSingleObject()等函数时,就挂到这个链表(查看等待线程)

在WinDbg中查看

kd>dd KiWaitListHead

KiWaitListHead

kd>dt _KTHREAD

KTHREAD

实验:分析等待链表中的线程所属的进程

第一步:查看所属线程结构体:

EHTREAD

第二步:查看所属进程结构体

EPROCESS

调度链表

描述

  1. 调度链表共有32个双向链表
  2. 线程在调度链表的中下标表示线程级别(0~31)
  3. XP中,调度链表共有32个圈;在64位操作系统(如win7 64位)中,调度链表共有64个圈
  4. 单核CPU操作系统中,无论是XP还是win7,都只有一组调度链表
  5. 但是在服务器版本系统中:等待链表只有一个,调度链表的数量等于CPU的数量

在WinDbg中查看

dd KiDispatcherReadyListHead L70

KiDispatcherReadyListHead

总结

  1. 线程总数 = 1个等待链表 + 调度链表数量*CPU数量 + 1个正在运行的线程
  2. 无论是等待链表还是调度链表,在线程结构体中都位于 _KTHREAD +0x060 这个位置
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值