文章目录

  • 前言
  • 等待链表
  • 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就有几组

总结

  1. 正在运行的线程在KPCR中
  2. 准备运行的线程在32个调度链表里,KiDispatcherReadyListHead是个数组存储了这32个链表头
  3. 等待状态的线程存储在等待链表里,KiWaitListHead存储链表头
    数组存储了这32个链表头
  4. 等待状态的线程存储在等待链表里,KiWaitListHead存储链表头
  5. 这些圈都挂在同一个相同的位置KTHREAD结构体

进程线程002 等待链表 调度链表相关推荐

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

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

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

    一.回顾 进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程所有的线程. 对进程断链,程序可以正常运行,原因是CPU执行与调度是基于线程的,进程断链只是影响一些遍历系统进程 ...

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

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

  4. 进程线程006 Windows线程切换-线程优先级

    文章目录 内容回顾 调度链表 如何高效查找 如果没有就绪线程怎么办 内容回顾 之前我们已经了解过,有三种情况会导致线程切换: 当前线程主动调用API:API函数–>KiSwapThread–&g ...

  5. Python之进程+线程+协程(multiprocessing多进程模块)

    前几篇的多线程模块的各种规则和用法,本篇则是关于多进程模块的内容 1.multiprocessing的介绍 在Python中,由于有GIL解释器锁的存在,多线程就根本不是本质意义上的多线程,而是一个主 ...

  6. 操作系统系列笔记(四) - 进程,线程及CPU调度

    进程和线程 进程 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 进程包含了正在运行的一个程序的所有状态信息, 代码, 数据, 状态寄存器, 通用寄存器, 进程占用系统资源等 进 ...

  7. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_1整起(进程线程协程并发并行、进程线程切换进程间通信、死锁\进程调度策略、分段分页、交换空间、OS三大调度机制)

    PART0:OS,这货到底是个啥? OS,是个啥? OS的结构们: 存储器: 存储器的层次结构: 内存:我们的程序和数据都是存储在内存,我们的程序和数据都是存储在内存,每一个字节都对应一个内存地址.内 ...

  8. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  9. linux 编程 调度,Linux的进程线程及调度

    搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...

最新文章

  1. (转)理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER
  2. 1 分钟 Serverless 极速抽盲盒,自己部署自己抽
  3. LDAP 查询基本知识
  4. 入门训练 A+B问题 c语言
  5. 设计模式笔记零:设计模式简介
  6. 基于SSM的猫头鹰在线视频网站
  7. 395.至少有K个重复字符的最长子串
  8. 字符串拆分成泛型列表
  9. 项目实战——高拓展的实时聊天系统
  10. 无极浏览器(教学专用浏览器)官方版 v5.0.0.15
  11. 老毛子Padavan网段LAN修改
  12. CSS+html制作简历表
  13. quicktime for java,QuickTime是什么意思
  14. 支付宝(Alipay)支付,超详细使用教程讲解!
  15. 电视收视率评估工具推荐
  16. 基于Matlab人脸识别签到系统(GUI界面)
  17. HNUST OJ 2293 贪吃蛇吃苹果
  18. Spring的Tomcat服务关闭后,Quartz进程无法正常关闭,出现内存泄露
  19. springboot 发送邮件问题(阿里云企业邮箱)
  20. 360FLEX与会者的演讲资源链接

热门文章

  1. ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)来比较各模型性能
  2. DL之SSD:SSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. Python IDE之Pydev: 基于Eclipse搭建python的编译环境(Eclipse+pydev)简介、安装、使用的详细攻略
  4. 成功解决 gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) - (device: 0, name: GeForce 94
  5. 源码:我的关于NLP的博客(持续更新中...)
  6. iOS 设置状态栏样式
  7. python读取文件的常用方法
  8. 262K Color
  9. 2008-08-24
  10. Centos7开启SSH服务