DPC的有效定义:它们是驱动程序可以通过该方法再IRQL DISPATCH_LEVEL上请求回调到任意线程上下文的方法。DPC对象本身仅是具有LIST_ENTRY,回调指针,回调的某些上下问以及一些控制数据。
       DPC实际上要排队到特定的处理器,这是通过将DPC对象链接到位于目标处理器控制块(PRCB)中的DPC列表来完成的。对于O/S而言,确定DPC对象排队的处理器。
       默认情况下,DPC排队到调用KeInsertQueueDpc的处理器(当前处理器)。
       驱动程序可以使用功能KeSetTargetProcessorDpc指示给定处理器用于特定DPC对象。

一旦DPC对象已排队到处理器,则随后将同一DPC对象排队的尝试将被忽略,直到DPC对象被出队(windows执行其回调)。这就是KeInsertQueueDpc的BOOLEAN返回值所指示的:
TRUE表示Windows将DPC排队到目标处理器,而FALSE表示DPC对象已经排队到某个处理器。

因为DPC数据结构仅具有单个LIST_ENTRY字段,因此一次只能出现在单个队列中。

将DPC对象插入到目标处理器的DOC列表的开头还是结尾是DPC优先级功能的一方面。
可以使用功能KeSetImportanceDpc设置给定DPC对象的重要性。通过此DDI,可以指示DPC对象的重要性为低,中或高。
在高版本中,可以将重要性设置为"中高"。低,中和中高重要性DPC放置在DPC队列的末端,而高重要性DPC放置在队列的前面。

DISPATCH_LEVEL软件中断

将DPC排队到目标处理器后,通常会在处理器上生成DISPATCH_LEVEL软件中断。在DPC对象排队时是否请求DISPATCH_LEVEL软件中断的选择主要基于:
       DPC的重要性,DPC的目标处理器,DPC列表在目标处理器上的深度以及 目标处理器上DPC列表的"排水率"。

如果DPC对象的目标处理器是当前处理器,并且DPC对象除了低优先级以外还具有其他重要性,则请求DISPATCH_LEVEL软件中断。
       对于低重要性DPC,仅当操作系统认为处理器没有足够快地服务DPC时才请求软件中断,这是因为DPC队列变大或没有以足够快的速率耗尽。
       如果其中任何一个为真,则即使DPC的重要性不高,也会请求中断。

如果DPC对象的目标处理器不是当前处理器,则决策过程将有所不同。因为在另一个处理器上请求中断将设计昂贵的处理器间中断(IPI),所以请求该中断的情况收到限制。
       在vista之前,仅当DPC的重要性很高或目标处理器上的DPC队列太深时才发出IPI请求。
       Vista将中等重要性的DPC添加到检查中,并通过要求目标处理器处于空闲状态以请求DISPATCH_LEVEL软件中断,进一步减少了IPI的数量。

在调用KeInsertQueueDpc时,系统可能处于两种情况:第一种情况将以IRQL<DISPATCH_LEVEL运行,在这种情况下,将立即发送DISPATCH_LEVEL中断。
       第二种情况是当前处理器的IRQL>=DISPATCH_LEVEL,在这种情况下,中断将一直待处理,直到IRQL即将返回到IRQL<DISPATCH_LEVEL。

在耗尽DPC列表之前,windows希望确保它具有一个新的执行堆栈,以便DPC例程可以运行。
       在当前堆栈没有太多剩余空间的情况下,这可能会减少堆栈溢出的事件。
       每个PRCB还包含一个指向先前分配的DPC堆栈的指针,windows会在调用任何DPC之前切换到该堆栈。

从空闲线程发送,要么将出现另一个DPC,该请求将请求DISPATCH_LEVEL中断,并且DPC将被随后的流水队列拾起或者将出现空闲循环,并注意到DPC队列不为空。

空闲循环的一部分工作是检查DPC队列并确定其是否为空。
       如果发现队列不为空,它将开始通过使条目出队并调用回调来耗尽队列。

在这种情况下,堆栈不会切换,因此DPC实际上在空闲线程的堆栈上执行。
       因为空闲循环本身使用的线程栈很少,所以在这种情况下,进行交换栈的工作没有太多用处。

对于dpc的初步理解相关推荐

  1. 如何让人大致理解RxJava思想:第一节 初步理解RxJava

    如何让人大致理解RxJava思想:第一节 初步理解RxJava 首先,我们需要明确,一个人不可能一口气吃成一个胖子,你不可能仅仅花5分钟看完我这篇文章,然后一拍桌子,大叫一声,我知道了,然后赢取白富美 ...

  2. JAVA 枚举类的初步理解

    JAVA 枚举类的初步理解 现在Java的枚举类在真实项目中已经用的比较频繁,比静态常量更好用,也更有限定性,enum类可以用来表示有限的类对象,比如星期.月份.性别或者项目中的产品类型 像诸如此类的 ...

  3. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  4. 初步理解pagerank算法

    初步理解pagerank算法 第一次写不是课程要求的博客,可能有不严谨的地方,如果有写错的希望能在评论区指出. 算法思想 pagerank算法用于网页排序,根据给网页的重要程度给各个网页打分,根据分数 ...

  5. Adaboost算法的初步理解

    菜鸟初次接触Adaboost,虽然算法流程比较清晰简单,但对于其中的理论,存在着不少疑惑之处,如下所示: 1)如何训练得到的弱分类器,我们需要训练出多少个弱分类器进行后续的计算?对若分类器有什么要求吗 ...

  6. 我对SNS游戏的初步理解

    国庆期间,我专门研究了一款SNS游戏,巴别小精灵,这是一款背单词的游戏.算是一款交互式英语学习的应用.一点初步理解和体会,与大家分享. SNS游戏的特点 (1)      异步性 (2)      真 ...

  7. Hamiltonian Monte Carlo抽样算法的初步理解

    Hamiltonian Monte Carlo抽样算法的初步理解 接受拒绝采样算法 MCMC回顾 Hamiltonian dynamics 拉格朗日方程 从牛顿方程出发推导拉格朗日方程 勒让德变换 哈 ...

  8. 红黑树插入操作的初步理解

    红黑树插入操作的初步理解 文章目录 红黑树插入操作的初步理解 红黑树的特征 红黑树的插入节点总是红色的 红黑树的修正 变色 左旋 右旋 插入操作 插入操作的代码实现 红黑树和AVL树的对比 参考链接 ...

  9. wmts格式说明_WMTS服务初步理解与读取

    WMTS 服务初步理解与读取 当前在网络地图服务中,大部分都会采取缓存技术来替代实时对数据进行可视化,用以提高地图响应能 力.介绍 OGC 提出的缓存技术标准的 WMTS 服务. WMTS 简介 WM ...

最新文章

  1. 清华学长手把手带你做UI自动化测试
  2. 关闭linux服务器电源,linux关闭ACPI电源管理模块
  3. 大数据学习笔记1000条
  4. SAP与Ariba在数据分析领域的互补共赢
  5. 单片机数码管从00到99C语言_MSP430单片机轻松入门与实践 — 畅学单片机
  6. 自动化运维的正确姿势,你试了也会上瘾 | 社区福利
  7. maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法
  8. UDP协议的收发操作
  9. Java开发笔记(一百三十二)Swing的表格
  10. Mac 下利用 FileMerge 进行代码比较、合并
  11. [娱乐]华为HWT文件手动修改字体名称
  12. 认识电子计算机评课稿,《走进计算机》评课稿.docx
  13. 计算机取小数点后的小数 公式,excel表格公式计算后取小数点后的位数 | excle小数个数...
  14. 双绞线的制作方式详解
  15. 《关于雪糕刺客与雪糕护卫激发中国人的创作灵感这件事》
  16. New File(.)
  17. 网友发帖问阿里P7和协和主治医师谁更成功,BAT员工纷纷嘲笑.
  18. Hadoop HDFS 基本命令
  19. 关于“AHCI模式”解析
  20. 活动策划书用什么计算机软件,各行业主流设计软件有哪些?(设计人员请进)...

热门文章

  1. ELL解决:libstdc++.so.6: version `CXXABI_1.3.9' not found (required by bin/opencv_test_core)?
  2. Friendship of Frog
  3. 【jvm系列-01】初识虚拟机与java虚拟机
  4. 固高Otostudio软件使用基础知识
  5. springboot整合 swagger2
  6. AutoJs学习-免ROOT免无障碍画圆球
  7. 在高数中学到的sinc函数有两种定义
  8. 实时系统中的MCS模式和Sporadic Server算法
  9. 涨跌停计算器_在线涨跌计算器
  10. 浙大29岁“粉色系”博导获百万大奖:希望做好学生的导师而不是“老板”