Windows操作系统多核CPU内核线程管理方法

发布者:平安守护最新更新时间:2014-11-25 来源: 21ic关键字:多核  CPU  Windows 手机看文章 扫描二维码
随时随地手机看文章

1 引言

本文分析了Windows 系统的进程调度机制,并设计了一种基于Windows 操作系统内核驱动的多核CPU 线程管理方法,实现了一个基于Windows 内核驱动的线程管理服务系统,它能让用户根据每一个任务线程对CPU 资源的需要程度和对实时性的要求,在多核CPU上合理为线程分配CPU 核。

Windows 内核调度结构体关系图
Windows 内核调度结构体关系图
图1 Windows 内核调度结构体关系图

2 Windows 系统的进程调度方法分析

Windows NT 中的每一个进程都是EPROCESS 结构体。此结构体中除了进程的属性之外还引用了其它一些与实现进程紧密相关的结构体。例如,每个进程都有一个或几个线程,线程在系统中就是ETHREAD 结构体。简要描述一下存在于这个结构体中的主要的信息,这些信息都是由对内核函数的研究而得知的。首先,结构体中有KPROCESS 结构体,这个结构体中又有指向这些进程的内核线程(KTHREAD)链表的指针(分配地址空间),基优先级,在内核模式或是用户模式执行进程的线程的时间,处理器affini ty(掩码,定义了哪个处理器能执行进程的线程),时间片值。在ETHREAD 结构体中还存在着这样的信息:进程ID、父进程ID、进程映象名。

在E P R O C E S S 结构体中还有指向P E B 的指针。

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) ,亲缘性掩码的形式的二进制数如下式所示:

0000000000000000000000000000XXXXB

其中自右向左,每一位代表0 到31 号CPU是否可用,由于本机只有四个CPU, 所以只有前四个位可用,X 为1则代表当前任务可执行在此位代表的CPU 上,X 为0 则代表当前任务不可执行在此位代表的CPU 上, 例如:

00000000000000000000000000000010B

代表当前任务只能执行在1 号 CPU 上(CPU 下标记数从0 开始),又如0x00000004 代表当前任务只能执行在2 号CPU 上,0x00000003 代表当前任务可以运行在0号和1 号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,那么0x01&0x03=0x01,这样执行体线程会被装入CPU1的KPRCB 结构中得以执行,调度程序不会把这个线程交给CPU2 去执行。此过程如图2 所示。这就是为线程选择指定CPU 核的原理。

Windows 内核亲缘性调度原理图
Windows 内核亲缘性调度原理图
图 2 Windows 内核亲缘性调度原理图。

那么控制线程在指定CPU 上运行的突破口就是修改Windows 内核结构体KTHREAD 下的Affinity 域。然而Windows 内核结构被放在虚拟内存线性地址的高2G(不同版本Windows 下也可能是1G)地址空间,用户模式下的应用程序是无法访问这段内存空间的,所以必须编写Windows 驱动程序,来访问Windows 内核内存空间, 这也是本文将要描述的重点。

3 线程管理服务系统

整个系统的结构如图3 所示。该系统由两大部分组成,分别是内核模式下的管理服务系统设备驱动程序,和用户模式下的管理服务系统应用程序。管理服务系统应用程序通过调用Win32 子系统API,向内核下的管理服务系统驱动程序传递IRP,内核收到IRP 后,跟据收到的IRP 的内部信息,执行相应的派遣函数,对相应内存进行读写,从而给管理服务系统应用程序提供可用的系统信息。

管理系统总体结构图
管理系统总体结构图
图3 管理系统总体结构图。

3.1 内核模式下读取系统信息

线程管理服务系统驱动程序中,读取系统信息的方法用到了微软没有公开文档的内核服务函数,ZwQuerySystemInformATIon,这个函数被封装在ntdll.dll模块中,通过链接ntdll.lib 可得到此函数地址。通过一个枚举量SystemProcessInformaTIon 来得到进程线程相关信息,填入到第二个输入参数SYSTEM_PROCESS_INFORMATION结构中, 这样就获得了当前系统关于进程线程的信息。[page]

3.2 内核模式下枚举系统进程线程

 SYSTEM_PROCESS_INFORMATION结构中存储了进程及其线程的所有相关信息,表1 列出了它的具体内容,包括结构内域的地址偏移, 数据类型和描述。

SYSTEM_PROCESS_INFORMATION的第一个DWORD型是下一个进程 SYSTEM_PROCESS_INFORMATION相对于当前结构地址的偏移量,可以通过地址偏移来遍历所有的进程结构,当遇到某一个进程结构的0 x 0 0 0 0 处的DWORD 型值为0 时,说明这个结构体是系统内最后一个结构体。线程管理服务在它的派遣函数中通过这种方式遍历所有进程,从中提取有用的信息,填入两个自定义结构体中。如图 4 所示,描述了一个具有两个线程的进程的数据结构,首先在MY_PROCESS_INFO 结构中填入进程的相关信息,然后根据此进程所有的线程数,向系统申请足够大的分页内存空间,PVOID 型指针指向的是第一个线程结构所在的地址空间,然后向线程结构体中_MY_THREAD_INFO 中填入线程信息,再由线程结构体中的PVOID 型指针指向第二个线程结构体所在的地址空间,以此类推,最后一个线程结构体的PVOID型指针指向NULL。这样一个过程描述了一个进程及其所属的所有线程的枚举过程,通过对所有进程的遍历,可以得到系统中的一个完整的进程线程表,存在一段分页内存中,这样在应用程序中便可以得到这些信息。

表1 SYSTEM_PROCESS_INFORMATION 结构

SYSTEM_PROCESS_INFORMATION 结构

进程线程的两种数据结构


SYSTEM_PROCESS_INFORMATION 结构

进程线程的两种数据结构

图4 进程线程的两种数据结构。

3.3 线程管理服务系统应用程序设计

进程管理服务系统应用程序是要通过调用Win 32子系统的API 函数DeviceIoControl 来向线程管理服务系统驱动程序发送IRP 的,然后在IRP 结束之后把驱动程序中读出的所有有用进程线程信息填入到指定的内存中。这样线程管理服务系统应用程序就可以根据所获得的系统信息句柄来对线程CPU 亲缘性属性进行设置。首先为DeviceIoControl 中的InputBuffer 申请一段内存空间传入给驱动程序,驱动程序读取内核空间进程线程信息写入到这段内存中,应用程序读到信息并显示给用户。

在系统中应用程序为每一个CPU 维护一个结构体,内容包括该CPU 是否运行实时线程,该CPU 上运行的线程数(如果是实时线程CPU线程数为1),以及在此CPU上运行的线程结构数组的首地址。系统通过对此CPU 结构数组的解析来对线程进行管理。并通过DeviceIoControl函数把设置后的CPU 结构交给驱动程序内核。

3.4 修改Windows 内核结构体

在驱动程序读回应用程序下用户的设置结果后,就需要按照用户的设定修改KTHREAD 下的Affinity 域的掩码值了。首先要找到KTHREAD 的线性内存空间,PsGetCurrentProcess()内核函数可以返回内核下当前进程空间的E P R O C E S S 结构。E P R O C E S S 结构下的ActiveProcessLinks 域是LIST_ENTRY 结构,通过它可以遍历所有的ETHREAD 结构,那么那到KTHREAD 下的Affinity 域就不难了,可以使用两个循环嵌套来得到所有线程的Affinity 域并将其值设为应用程序中用户的设定值。线程CPU 掩码就被成功的修改了。当CPU 被设定为运行实时线程的CPU 时,在它上面运行的线程只能是一个实时线程,这时的运行线程数被设定为1; 当CPU被设定为非实时线程的时候,上面有可能除了任务线程运行之外,还有Windows 系统进程下的线程。

4 软件使用及性能测试

4.1 驱动的加载及软件的使用

 首先需要把本系统的驱动sys 文件加载到Windows的服务管理器中,加载成功后打开应用程序,用户可以通过应用程序中显示出的当前系统内的进程和线程进行选择,并在GUI 图形界面中对其CPU 占用率及CPU亲缘性进行设置。

4.2 设置 CPU 亲缘性测试

 测试运行在双核CPU 的PC 机上,系统运行一个要测试的任务线程(任务线程为一个108 次加法运算),四个其它线程(为测试方便,设为while 循环线程),限定了循环线程的CPU 亲缘性掩码为0x0001,任务线程的CPU亲缘性为0x0002,这样任务线程与其它线程分别在两个核上运行,分别测试了任务线程单独运行,任务线程与其它线程不设定CPU 亲缘性,任务线程与其它线程设定CPU 亲缘性三种情况下下任务线程的运行总时间如表2 所示。

表2
表2
从表2 分析, 设定任务线程的CPU 亲缘性与其它线程所占用的CPU 分开,真正意义上的实现了任务的异步执行,非常有效的提高了实时线程对CPU 资源的使用率。

5 结束语

  本文分析了Windows 系统的内核进程线程调度表2CPU 亲缘性设定三种情况下任务线程运行时间表机制,并在此基础上设计了一种基于Windows 操作系统内核驱动的多核CPU 线程管理方法, 实现了这样一个软件系统。首先在Windows 内核层获取系统进程线程信息,然后再把信息传入应用层,由应用层上的应用程序根据获取的信息句柄,对进程进行操作,用户在图形界面下按照仿真任务对CPU 资源的不同需求,进行相应的设置,可以为指定线程设置CPU 亲缘性的功能。在一定程度上为Windows 系统下的任务合理地分配了CPU 资源,为对实时性要求较高的任务提供了一个可靠的运行环境。

关键字:多核  CPU  Windows 引用地址:Windows操作系统多核CPU内核线程管理方法

上一篇:嵌入式GPS数据采集系统的设计与实现
下一篇:基于CORBA平台的嵌入式控制器

推荐阅读最新更新时间:2024-03-16 13:47

基于双CPU实时图像监控系统的设计
图像监控以其直观、方便、信息内容丰富而被广泛应用于许多场合。在电子技术与通讯技术的发展过程中,图像监控系统的技术水平直接反映了不同阶段电子与通讯的技术状况。上世纪90年代末,随着多媒体技术、视频压缩编码技术和网络通讯技术的发展,数字视频监控系统迅速崛起。在数字图像监控系统中,嵌入式监控系统主要由嵌入式处理器、以太网接口控制器等相关支撑硬件及嵌入式操作系统组成。 1 设计方案 采用TI公司的TMS320VC5471为处理器,此芯片是一种双内核器件,内部集成了一个带程序和数据存储器(均为RAM)的TMS320C54x DSP子系统和一个带仿真工具的ARM7TMRISC微控制器核。在双CPU系统中,ARM7TDMI作为主CPU,负责
[应用]
高通:我们准备好为诺基亚 Windows Phone 提供芯片
    高通(Qualcomm)在诺基亚 Symbian 系统红火的那几年里,并没有成为最大的芯片供应商。但现在,它正努力成为 Windows Phone 7 时代里最大的赢家。     上周四,高通 CFO Bill Keitel 指出,当初在 Windows Phone 7 身上下的赌注,可以全部赚回来了。目前,高通是微软认证的唯一芯片供应商。     Keitel  还说:“在诺基亚和微软宣布结盟的当天,高通办公室和走廊里都是欢声笑语。我们非常愿意支持他们。”     事实上,高通和诺基亚在经历了几年前的专利之战后,现在的关系正逐步改善。高通甚至在 MeeGo 系统的移植工作上花费了很大的力气。    
[手机便携]
Windows RT平板不需要桌面模式的四个理由
    上个月的IFA 2012柏林国际电子消费展上,三星发布了旗下首个Windows RT平板Ativ Tab。作为主攻内容消费市场的Windows RT平板将搭载ARM处理器和苹果iPad已经Android厂商的平板设备一较高下。不过IFA 2012上Ativ Tab的上市却也让消费者看到了原本宣告在Windows RT中将取消的桌面模式再度出现,显然微软在这方面下了很大的决心,但仍旧有不少用户建议微软在Windows RT设备上直接过滤掉桌面模式一边更好的适配触控界面,那么为何Windows RT对桌面模式的需求并不强烈呢? Metro应用将会占据支配地位 桌面模式的好处在于可以让Windows 8在x86架构下获得强有力的生
[手机便携]
单片机的单CPU仿真器的设计
摘要:本文基于对8051单片机存储空间结构的深层次分析,提出了一种基于单片机的单CPU仿真器设计方案。该方案实用廉价,工程实践性强,可用于设计新的教学设备。 引言 单片机以它的廉价、体积小、可塑性强、稳定性高的特性,有着广阔的市场前景。 在用单片机开发产品时,虽然许多厂家设计了可编程ISP单片机,但是从安全与便捷方面考虑,单片机仿真器仍然是开发人员不可或缺的工具。单片机仿真器在产品开发阶段可用来替代单片机进行软硬件调试,从而迅速发现、纠正程序中的错误,大大缩短单片机开发的周期。但实际中仿真器过于昂贵,因此,设计制作出一款廉价且实用的仿真器有着广泛的市场。 传统的单片机仿真器硬件系统一般有三种实现方法。一、采用专用仿真的单片
[单片机]
晶心科技成为第一家采用RISC-V的主流CPU IP公司
【台湾 新竹】亚洲致力于发展高效率、低功耗、小面积、客户芯片出货量达20亿颗的嵌入式处理器核心领先供货商晶心科技,今日发表最新一代的AndeStar™处理器架构,并成为商用主流CPU IP公司中第一家纳入美国加州大学柏克利分校所开发的开源RISC-V 指令集架构的公司。这名为AndeStar™ V5的晶心第五代指令集架构支持64位处理器以及广为业界关注的RISC-V指令集架构, 使开放、精简、模块化及可扩充的RISC-V架构正式进入主流SoC应用。 AndeStar这个12来年不断演进的生态系统环境包括许多先进的架构设计,例如能以最少执行码达到最强运算效能的高度优化编译程序,以及CoDense™、 PowerBrake、Stack
[嵌入式]
中国的高科技产业,到底处于世界什么水平?
中国高科技龙头企业之一的中兴通信,因为涉嫌违反美国对伊朗的出口管制政策,遭到了美国的定点打击。这是中美贸易战的一个小回合,但是,中兴居然没有还手之力,公司突然全线陷入了溃败边缘。原因是,中兴依然“缺芯少魂”,核心技术,依然依赖美国。 单芯片Transceiver方案提升了基站芯片的门槛,使得国产厂商更加难以切入。基站芯片的自给率几乎为0,成为了中兴通讯本次禁运事件里最为棘手的问题。 美国可谓是一剑封喉。 去年12月,在广州一个论坛上,我有幸见到中兴某位高层,他展示了一个漂亮的PPT,列举中兴的AI优势,并雄心勃勃地讲述“智能城市”规划。多说一句,此人表现强势,没有顾及其他嘉宾的感受,自说自话地炫耀。 也是在这个论坛上,有学者断
[网络通信]
FPGA+CPU可让数据中心的图像处理性能大幅提升
图片逐渐成为互联网主要的内容构成,相应的图片处理需求也在高速成长,移动应用与用户生产内容(UGC)正在驱动数据中心图像处理的业务负载快速增加。本文深维科技联合创始人兼CEO樊平详细剖析了图片加速的必要性、当前实际的图片解决方案与部署方式以及如何通过FPGA+CPU异构计算的方案维护用户体验与服务成本新平衡。 1.为什么需要图片加速? 目前,图片处理的需求正在快速成长,即源于用户生成内容,视频图片抓取等方式的图片缩略图生成,像素处理,图片转码、智能分析处理需求不断增加。众多应用迫切需要高性能,高性价比的图片处理解决方案。 在这种情况下,数据中心面临着一个核心的考验--即用户体验与服务成本之间的平衡。总地来
[嵌入式]
FPGA+<font color='red'>CPU</font>可让数据中心的图像处理性能大幅提升
HSA标准问世 CPU/GPU协同处理效能激增
    异质系统架构(HSA)第一项标准可望在今年内发布。HSA基金会创始会员之一的超微(AMD)日前透露,该会将于今年底前公布首项晶片异质运算标准--HSA统一记忆体架构(hUMA),加速中央处理器(CPU)和绘图处理器(GPU)内部快取(Cache)共用记忆体的设计架构成形,让两大异质晶片的协同运作能更加顺畅,进而提升系统效能。 超微软体与架构运算方案总监楚含进指出,hUMA系SoC设计的重大技术突破,将使晶片运算效能激增。 超微大中华区游戏、软体暨异质运算技术总监楚含进表示,行动运算装置处理器正面临平行处理效率不佳、异质核心资料互传缓慢、绘图运算负荷及整体功耗大增等诸多瓶颈;而一味扩充CPU、GPU核心数量的传统方式,提升效能
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved