一、回顾

进程结构体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)等待链表,调度链表相关推荐

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

    Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...

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

    文章目录 前言 等待链表 33个链表 调度链表 版本差异 总结 前言 进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程的所有线程. 对进程断链,程序可以正常运行,原因是C ...

  3. 4.等待链表与调度链表

    等待链表 kd>dd KiWaitListHead 比如:线程调用了Sleep()或者WaitForSingleObject()等函数时,就挂到这个双向链表, (查看等待线程) kd> d ...

  4. c++ 链表_链表(单向链表的建立、删除、插入、打印)

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 链表(单向链表的建立.删除.插入.打印) 1.链表一般分为: 单向链表 双 ...

  5. 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定

    链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定 链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过! 本人写该程序完全是为学习交流之用,还望大家多多 ...

  6. 数据结构与算法笔记(三)—— 链表(单链表、循环链表、双向链表)

    一.前沿 1.1.为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活. 链表结构可以充分利用计算机内存空间,实现灵活的内 ...

  7. 七十、反转和合并链表、 链表有环的判断

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...

  8. c++ 怎样连接两个链表_LeetCode | 链表的入口,一文帮你搞定“环形链表”(python版,最简单解析)...

    链表节点的定义 链表作为一种数据结构,由链表节点互相连接构成. 链表节点包含自身的数据和一个指向下一节点的指针. """ Definition of ListNode & ...

  9. 数据结构之链表--单链表

    Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西. 这次我将要介绍的是链表.链表有单链表,单向循环链表,双向链表,双向循环链表 ...

最新文章

  1. NeurIPS 2019 | 17篇论文,详解图的机器学习趋势
  2. AngularJs 1.5 $location获取url参数
  3. 数据库跟尾过多的错误,能够的原因阐发及处置惩罚设备
  4. 最全python爬虫库安装详解
  5. Git -- 如何删除本地仓库
  6. 构建高可用linux和鸟哥,构建高可用Linux服务器
  7. 在tomcat下context.xml中配置各种数据库连接池(转)
  8. 要想完全放弃Windows使用Linux需要多少勇气?
  9. hdu 1907John博弈
  10. FFmpeg系列-2-命令行工具之FFmpeg
  11. matlab设计用户界面,MATLAB程序设计教程(11)—MATLAB图形用户界面设计
  12. 基于nRF24L01的一对多节点通信(一收多发)
  13. 贴片电阻封装规格及阻值标注方法
  14. erp采购总监个人总结_ERP沙盘实训采购总监总结,学到了很多知识,受益匪浅
  15. 设置vs2107背景图片
  16. 如何进行用户画像分析
  17. 父类与子类的执行顺序
  18. 为什么敲了许多年的代码,却仍然在原地踏步?| 程序员有话说
  19. 如何让vim编辑器永久显示行号
  20. jzoj 5970.【北大2019冬令营模拟12.1】space 莫比乌斯反演

热门文章

  1. serializable接口_Java Serializable:明明就一个空的接口嘛
  2. Python之pyarrow:pyarrow的简介、安装、使用方法之详细攻略
  3. AI:2020年6月21日北京智源大会演讲分享之14:00-14:25 张铭教授《基于知识图谱的机器学习》
  4. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下
  5. 3dmax2014:打开3dmax2014软件时,出现许可证检出失败 错误20
  6. python爬虫抖某音爬取视频 Airtest+fiddler
  7. 五分钟搞定 Linux 文档全部知识,就看这篇文章
  8. 转 多租户SaaS架构
  9. 10分钟开始.Net Core
  10. 使用@required注解完成依赖检查