NT 内核进程调度分析笔记.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NT 内核进程调度分析笔记

NT 内核进程调度分析笔记 NT 内核的进程调度分析笔记 2008-11-26 10:55:34 来源:白细胞   文章作者:sinister  信息来源:白细胞  Author: sinister  Email: sinister@  Homepage:  Date: 2005-11-16  2005-2-15  众所周知 nt kernel 是多 ...   文章作者:sinister   信息来源:白细胞   Author: sinister   Email: sinister@   Homepage:   Date: 2005-11-16   2005-2-15   众所周知 nt kernel 是多任务抢占试方式运行的,在非 SMP 系统上,每个进程分配特   定的CPU 时间片来达到执行目的,这样看上去就象多个任务在同时运行。而 nt kernel   又是以线程调度为核心的,这样线程切换了也就意味着当前进程的切换。系统不断重复   这个过程,来使每个进程得以运行。在介绍流程前,需要先了解几个系统内部结构:KPC   R、ETHREAD、EPROCESS、可以说,涉及到进程调度的函数基本都是对这几个重要结构的   设置和填充。关于各结构的细节,对系统内核有所了解的人自然都很熟悉,我就不再多   废话了。这里是结合进程调度来说。KPCR 这个结构存放的是当前 CPU 所正在处理的各   种信息,其中包括了当前正在运行的线程 ETHREAD 结构。而 ETHREAD 结构又和 EPROC   ESS 结构是相互关联的。这也就是很多核心函数通过 KPCR 启始地址 0xFFDFF000 + 偏   移就能够得到当前正在运行的线程和进程的原因,如 KeGetCurrentThread()、IoGetCu   rrentProcess() 等。这也表明在非 SMP 系统上,某时间段内当前 CPU 处理的进程只   可能有一个。当进行进程调度时系统将根据当前所存活的进程来选择让哪个线程 ETHR   EAD 结构来替换 KPCR 中的 ETHREAD,使其变为正在运行的状态。那么又是如何触发进   程调度请求能让所有进程均得以执行的呢?开始已经提到过,每个进程分配特定的 CPU   时间片来达到执行目的,而系统的 CPU 时钟中断确定了每个进程分配的时间片。也就   是当系统 CPU 时钟中断触发时,产生的进程调度请求。在详细分析调度流程和各函数   分支前,我们先来看一下大致的流程。首先当 CPU 时钟中断触发时,系统将调用 KiDi   spatchInterrupt(),比较当前进程分配的时间片,如用完后会调用 KiQuantumEnd()   根据各线程优先级等信息用特定的调度算法选择新的线程(ETHREAD),然后将其返回   值,一个 ETHREAD 结构作为参数,来调用 SwapContext() 设置 ETHREAD,EPROCESS 中   的各项参数,并替换 KPCR 中的相应结构完成线程切换,调度到另一个进程(EPROCESS)   的线程(ETHREAD)继续执行。(当线程等待某一事件(Event)或信号量(Semaphore)   时会自动放弃当前时间片) 。通过上面的大致分析,我们可以看出和进程调度密切相关   的几个函数,KiDispatchInterrupt() 和 SwapContext(),下面我们将就这两个关键的   调度函数进行详细的分析。   首先来看下 KiDispatchInterrupt() 函数,当调用此函数时,首先得到当前 KPCR 自身   结构和DCP链表头,并比较当前是否有 DPC 正在处理,如果有 DPC 正在处理,则设置   DPC 异常炼。如果没有,则直接跳转到比较 KPCR 中 QuantumEnd 值,QuantumEnd 表示   当前 KPCR 中正在处理的线程时间片总数。此值是是根据当前运行线程 ETHREAD-Quant   um 中的值来填充的,就是说 KPCR 中 QuantumEnd 值不为0并不代表当前线程不允许切   换,此时还需要调用 KiQuantumEnd() 来近一步判断是否允许切换。所以当前值不为0时   则跳转到 KiQuantumEnd() 函数处做进一步判断。KiQuantumEnd() 函数会取当前线程   (ETHREAD)结构中的 Quantum 值来进行判断是否为0,根据线程优先等参数调用 KiFind   ReadyThread() 函数来选择一个新的线程填充 KPCR中的 NextThread ,并将 NextThread   作为函数返回值,跳转到相应地址继续进行线程切换。如果返回值返为空,则表示无

文档评论(0)

htfyzc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档