(1)、当前线程主动调用API:
API函数->KiSwapThread->KiSwapContext->SwapContexti

(2)、当前线程时间片到期:
KiDispatchInterrupt->KiQuantumEnd->SwapContext

(3)、有备用线程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt->SwapContext

在KiSwapThread与KiQuantumEnd函数中都是通过KiFindReadyThread来找下一个要切换的线程, KiFindReadyThread是根据什么条件来选择下一个要执行的线程呢?

调度链表(32个)

kd> dd KiDispatcherReadyListHead
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

KiFindReadyThread查找方式:
按照优先级别进行查找: 31…30…29…28…

也就是说,在本次查找中,如果级别31的链表里面有线程,那么就不会查找级别为30的链表!

如何高效查找

调度链表有32个,每次都从头开始查找效率太低,所以Windows都过一个 DWORD类型变量的变量来记录:

当向调度链表(32个)中挂入或者摘除某个线程时,会判断当前级别的链表是否为空,为空将DWORD变量对应位置0,否则置1。

.如下图:

第30位与28位是有等待调度的线程的,这个变量:_kiReadySummary

向等待链表挂入或者删除,它是根据判断链表中两个的成员是否一样且是否与当前的地址相同来判断它是否为空,如果两成员一样并且不等于当前地址说明这两个中有一个等待调度的线程

多cpu会随机寻找KiDispatcherReadyListHead指向的数组中的线程。线程可以绑定某个cpu (使用api: setThreadAffinityMask)

如果没有就绪线程怎么办
PrcbData:
+0x004 CurrentThread : Ptr32 KTHREAD //当前线程
+0x008 NextThread : Ptr32 KTHREAD //备用线程
+0x00C IdleThread :Ptr32 KTHREAD //空闲线程

如果cpu里没有等待调度的线程它就会跑IdleThread这条线程,每一个KPCR里都会指定一个空闲线程。

CPU一但开始就不能停,就算没有等待调度的线程,也要执行空闲线程。

11.Windows线程切换_线程优先级相关推荐

  1. 6.windows线程切换_主动切换

    ida 分析KiSwapThread sub esp, 10h mov [esp+10h+var_4], ebx ;保存当前线程寄存器现场 mov [esp+10h+var_8], esi mov [ ...

  2. 7.Windows线程切换_时钟中断切换

    绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的. 如何中断一个正在执行的程序? 异常 比如缺页,或者INT N指令 中断 比如时钟中断 系统时钟 ...

  3. 8.Windows线程切换_时间片管理

    时钟中断会导致线程进行切换,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换: 当前的线程CPU时间片到期 有备用线程(KPCR.PrcbData.NextThread) ...

  4. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  5. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  6. 线程打印_线程知识回顾

    1.程序_进程_线程 2.在 Java 中创建线程的两种方式 1) 继承 Thread 2) 实现 Runnable 接口 3.线程的生命周期 4.同步与死锁---过多的同步就会导致死锁 1) 同步方 ...

  7. educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)

    这篇文章主要从4个角度来讲多线程间的通信: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 等待/通知机制的实现: (1)wa ...

  8. mysql 关闭线程池_线程池安全的关闭方式

    对于一些定时任务或者网络请求服务将会使用线程池,当应用停机时需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题. 关闭线程池我们可以选择什么都不做,JVM 关闭时自然的 ...

  9. threadpoolexecutor创建线程池_线程池ThreadPoolExecutor源码分析

    什么是线程池 创建线程要花费昂贵的资源和时间,如果任务来了才创建那么响应时间会变长,而且一个进程能创建的线程数量有限.为了避免这些问题,在程序启动的时候就创建若干线程来响应出来,它们被称为线程池,里面 ...

最新文章

  1. c语言程序设计数据输入的,1.2 C语言的发展与特点免费阅读_C语言程序设计教程免费全文_百度阅读...
  2. atlas mysql 数据库同步_Atlas实现数据库读写分离
  3. python中字符串的常见操作方法
  4. python爬虫 -- 正则表达式 与 Re模块的介绍
  5. learnpython3thehardway视频_LearnPython3theHardWay__Excercise 13 Parameters, Unpacking, Variables
  6. excel使用MySQL数据,如何使用mysql完成excel中的数据生成
  7. android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item
  8. 本周三、四两场直播丨云时代的数据管理;PG与openGauss的分区特性
  9. chrome postman插件_接口测试工具之Postman(原创)
  10. poj 2051 Argus
  11. Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网
  12. tabbar角标 小程序_【沃行课堂】恭喜你遇到“坑”,小程序踩坑指南
  13. Atitit 职位的规划与来源 1.1. 职位任命多元化 1 1.2. 上级任命 1 1.3. 自我推荐 1 1.4. 他人推荐, 1 1.5. 可以下级选举 1 1.6. 缺席任命 1 1.7.
  14. 主键外键超键候选键区别以及联系
  15. 从另外一个角度来学习大数据入门教学
  16. 图表数据分析怎么做,举实例给你说清楚
  17. 9.1练习题3 梦中的统计 题解
  18. 遗传算法入门(连载之十) 神经网络入门(连载预告)
  19. Android黄油计划之Choreographer原理解析
  20. HTML5训练营,360奇舞特训营(一):HTML

热门文章

  1. TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型、测试并进行生成过程全记录
  2. DL框架之Caffe:深度学习框架之Caffe的简介、安装、使用方法详细攻略
  3. DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率
  4. Deap: python中的遗传算法工具箱
  5. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
  6. Leetcode 之Count and Say(35)
  7. dede_arctype|栏目表
  8. SharePoint 2007/2010 的SPGridView 控件常见的两个问题
  9. 关于STM32的IAP与APP互相跳转
  10. STM32 CAN 过滤器、滤波屏蔽器配置总结