zoukankan      html  css  js  c++  java
  • 等待链表,调度链表

    在进程结构体Eprocess(offset 0x50和offset 0x190)是两个链表,里面圈着当前进程所有的线程

    如下图

     线程的三种状态:就绪、等待、运行

    正在运行中的线程就存储在KPCR中,就绪和等待的线程全存在另外的33个链表中。其中一个等待链表,32个就绪链表

    这些链表都是用了_KTHREAD(0x60)这个位置,也就是说,线程在某一时刻,只能属于其中一个圈

    在用windbg查看时,这个些链表的每个成员其实都是LIST_ENTRY结构体

     等待链表

    调用了Sleep或WaitForSingleObject等函数,就挂到这个链表

    查看等待链表

    0: kd> dd KiWaitListHead
    8055d4a8  8a0f6728 8a099940 00000011 00000000

    调度链表

    调度链表有32个圈,就有优先级:0-31 0最低 31最高 默认优先级一般是8

    改变优先级就是从一个圈里面卸下来挂到另外一个圈上

    这32个圈是正在调度的线程:包括正在运行的和准备运行的

    例如:1个CPU和10个线程正在运行,那么某一时刻,正在运行的线程在KPCR中,其他9个在这32个圈中

    查看调度链表

    0: kd> dd KiDispatcherReadyListHead L70
    8055df80  8055df80 8055df80 8055df88 8055df88
    8055df90  8055df90 8055df90 8055df98 8055df98
    8055dfa0  8055dfa0 8055dfa0 8055dfa8 8055dfa8
    8055dfb0  8055dfb0 8055dfb0 8055dfb8 8055dfb8
    8055dfc0  8055dfc0 8055dfc0 8055dfc8 8055dfc8
    8055dfd0  8055dfd0 8055dfd0 8055dfd8 8055dfd8
    8055dfe0  8055dfe0 8055dfe0 8055dfe8 8055dfe8
    8055dff0  8055dff0 8055dff0 8055dff8 8055dff8
    8055e000  8055e000 8055e000 8055e008 8055e008
    8055e010  8055e010 8055e010 8055e018 8055e018
    8055e020  8055e020 8055e020 8055e028 8055e028
    8055e030  8055e030 8055e030 8055e038 8055e038
    8055e040  8055e040 8055e040 8055e048 8055e048
    8055e050  8055e050 8055e050 8055e058 8055e058
    8055e060  8055e060 8055e060 8055e068 8055e068
    8055e070  8055e070 8055e070 8055e078 8055e078

    总结

    这些圈都挂一个相同的位置,就是_KTHREAD(0x60)

  • 相关阅读:
    ssh2中的添,删,查,改。
    struts2中数据的传输
    SSH2中的笔记
    struts2中的拦截器
    struts.xml中的配置内容
    【spring源码分析】二、Aware
    【spring源码分析】一、BeanPostProcessor
    java常用名词缩写
    解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    springboot使用redis缓存
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14262709.html
Copyright © 2011-2022 走看看