【48812】Windows操作体系多核CPU内核线程办理方法

日期: 2024-08-27 作者: 固态硬盘

简介

  CPU 的某些核独立履行使命,然后有效地进步软件的实时性成为可能。本文介绍一种在

  本文剖析了Windows 体系的进程调度机制,并规划了一种依据Windows操作体系内核驱动的多核CPU 线程办理方法,完成了一个依据Windows 内核驱动的线程办理服务体系,它能让用户依据每一个使命线程对CPU 资源的需求程度和对实时性的要求,在多核CPU上合理为线程分配CPU 核。

  Windows NT 中的每一个进程都是EPROCESS 结构体。此结构体中除了进程的特点之外还引用了其它一些与完成进程严密相关的结构体。例如,每个进程都有一个或几个线程,线程在体系中便是ETHREAD 结构体。扼要描绘一下存在于这个结构体中的首要的信息,这一些信息都是由对内核函数的研讨而得知的。首要,结构体中有KPROCESS 结构体,这个结构体中又有指向这些进程的内核线程(KTHREAD)链表的指针(分配地址空间),基优先级,在内核方式或是用户方式履行进程的线程的时刻,处理器affini ty(掩码,界说了哪个处理器能履行进程的线程),时刻片值。在ETHREAD 结构体中还存在着这样的信息:进程ID、父进程ID、进程映象名。

  ETHREAD 结构体还包含有创立时刻和退出时刻、进程ID 和指向EPROCESS 的指针,发动地址,I/O 恳求链表和KTHREAD 结构体。在KTHREAD 中包含有以下信息:内核方式和用户方式线程的创立时刻,指向内核仓库基址和极点的指针、指向服务表的指针、基优先级与当时优先级、指向APC 的指针和指向T E B 的指针。

  KTHREAD 中包含有许多其它的数据,经过调查这一些数据可以剖分出KTHREAD 的结构。图1 描绘了这些结构体之间的联系。

  经过遍历KPROCESS 结构体中的ETHREAD,找到体系中当时一切的KTHREAD 结构,这个结构中的偏移量为0x124 处的Affinity 域(Windows XP sp3)即为设置CPU 亲缘性掩码的内存地址。在此要点解说CPU 亲缘性的概念,CPU 亲缘性便是指在体系中可以将一个或多个进程或线程绑定到一个或多个处理器上运转,这是期待已久的特性。也便是说:“ 在1号处理器上一向运转该程序”或者是“在一切的处理器上运转这些程序,而不是在0 号处理器上运转”。然后, 调度器将遵从该规矩,程序仅仅运转在答应的处理器上。在Windows操作体系上,给程序员设定CPU 亲缘性的接口是用一个32 位的双字型数表明的, 它被称为亲缘性掩码(Affinity bitMask)。亲缘性掩码是一系列的二进制位,每一位代表一个CPU 单元是否可履行当时使命。例如一个在具有四个CPU 的PC 机上( 或四核CPU) ,亲缘性掩码的方式的二进制数如下式所示:

  其间自右向左,每一位代表0 到31 号CPU是否可用,因为本机只要四个CPU, 所以只要前四个位可用,X 为1则代表当时使命可履行在此位代表的CPU 上,X 为0 则代表当时使命不行履行在此位代表的CPU 上, 例如:

  Windows 的进程调度代码是在它的SySTem 进程下的,所以它不归于任何用户进程上下文。调度代码在恰当的时时机切换进程上下文,这儿的切换进程上下文是指进程环境的切换, 包含内存中的可履行程序, 供给程序运转的各种资源.进程具有虚拟的地址空间,可履行代码, 数据, 目标句柄集, 环境变量, 根底优先级, 以及最大最小作业集等的切换。而Windows 最小的调度单位是线程, 只要线程才是真实的履行体,进程仅仅线程的容器。Windows 的调度程序在时刻片到期,或有切换线程指令履行(如Sleep,KeWaitForSingleObject 等函数)时, 将会从进程线程行列中找到下一个要调度的线程履行体,并装入到KPCR(Kernel s Processor CONtr ol Re g i o n , 内核进程操控区域) 结构中,CPU 依据KPCR 结构中的KPRCB 结构履行线程履行体代码。而在多核CPU 下,当Windows 调度代码履行时,从当时要调度履行的KTHREAD 结构中取出Affinity,并与当时PC 机上的硬件装备数据中的CPU 掩码作与操作,成果写入到指定的CPU,例如双核CPU 的设备掩码为0x03,假如当时KTHREAD 里的Affinity 为0x01,那么0x010x03=0x01,这样履行体线的KPRCB 结构中得以履行,调度程序不会把这个线 所示。这便是为线程挑选指定CPU 核的原理。