windows下绑定线程(进程)到指定的CPU核心

一个程序指定到单独一个CPU上运行会比不指定CPU运行时快。这中间主要有两个原因:
1)CPU切换时损耗的性能。
2)Intel的自动降频技术和windows的机制冲突:windows有一个功能是平衡负载,可以将一个线程在不同时间分配到不同CPU,从而使得每一个CPU不“过累”。然而,Inter又有一个技术叫做SpeedStep,当一个CPU没有满负荷运行时自动降频从而达到节能减排的目的。这两个功能实际是冲突的:一个程序被分配到多个CPU协同工作->每个CPU都不是满载->每个CPU都会降频->windows发现每个CPU性能都降低了,因此程序执行速度也降低了。

因此,将线程(进程)绑定到指定CPU核心,从而不让windows自作主张帮我们分散任务,从而提高单线程效率是很有必要的。有两种方法实现绑定进程到指定CPU:
1)手工调节:在资源管理器的进程里面,设置相关性,可以设置进程到某个或者某些指定的CPU核心。

这种方法最简便,同样是最优效率的,因为你可以根据当前CPU的负载情况进行选择。
2)代码自动调节:
参考:http://www.cnblogs.com/kex1n/archive/2011/05/09/2040924.html
具体函数为:


1

DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);

其中,第一个参数为线程句柄,第二个参数为一个mask。
如果要知道当前线程的句柄,可以通过函数:GetCurrentThread()得到。否则,在创建多线程的时候,也同样可以得到创建的线程的句柄。
第二个参数为mask,可取值为0~2^31(32位)和0~2^63(64位),每一位代表每一个CPU是否使用。
比如,你要指定进程到第0个CPU上,则mask=0×01
第1个CPU:mask=0×02
第2个CPU:mask=0×04 (注意不是0×03)
第3个CPU:mask=0×08
以此类推。
如果要指定多个CPU:
比如第0、1个:mask=0×03
第1、2个:mask=0×06
以此类推。
如果CPU个数不足,则会进行取模操作。比如一共4个CPU,则mask=0×0010则和0×01一样。
这种方法的好处是多线程时不用每次都手动选择CPU,缺点是万一选到的CPU负载很高,那么程序执行速度就慢了(英雄所见略同所以大家都抢到同一个CPU去了么~~)
效果如下图所示:

还有一个实用的函数来获取当前CPU的核心数量:


1
2
3

SYSTEM_INFO info;
GetSystemInfo(&info);
printf("Number of processors: %d.\n", info.dwNumberOfProcessors);

输出的是逻辑核心数量,比如i3处理器就是双核心四线程,输出4。i5处理器是四核心四线程,输出也是4。
这样就可以方便的知道当前系统一共有多少个CPU了,同时也方便了线程数选择。

转自:http://hymike.net/blog/?p=460

时间: 2024-11-05 01:54:16

windows下绑定线程(进程)到指定的CPU核心的相关文章

windows 下获取当前进程的线程数量

#include <TlHelp32.h> int get_thread_amount() { int i = 0; char Buff[9]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); int processid = GetCurrentProcessId(); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSna

windows下批量杀死进程

有时候由于病毒或其他原因,启动了一系列的进程,并且有时杀了这个,又多了那个.使用命令taskkill可将这些进程一下子全部杀光: C:\Users\NR>taskkill /F /im frontpg.exe 成功: 已终止进程 "FRONTPG.EXE",其 PID 为 3732. 成功: 已终止进程 "FRONTPG.EXE",其 PID 为 24544. 成功: 已终止进程 "FRONTPG.EXE",其 PID 为 3612. 错误

WINDOWS下绑定ARP绑定网关

一.WINDOWS下绑定ARP绑定网关步骤一:在能正常上网时,进入MS-DOS窗口,输入命令:arp -a,查看网关的IP对应的正确MAC地址, 并将其记录下来.注意:如果已经不能上网,则先运行一次命令arp -d将arp缓存中的内容删空,计算机可暂时恢复上网(攻击如果不停止的话).一旦能上网就立即将网络断掉(禁用网卡或拔掉网线),再运行arp -a.步骤二:步骤二:如果计算机已经有网关的正确MAC地址,在不能上网只需手工将网关IP和正确的MAC地址绑定,即可确保计算机不再被欺骗攻击.要想手工绑

Windows下查看8080进程及结束进程命令

Windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       3500 可知,进程号为3500的进程占用了8080端口 可以使用命令 tasklist | findstr “3500”进一步查看3500进程的具体信息. > tasklist | findstr “3500” 结果

定时任务:windows下备份数据文件到指定的目录

#windows下备份数据文件到指定的目录 (1)新建文本文件 echo off echo ------------------ 开始备份日志文件------------------ set ymd=%date:~0,4%%date:~5,2%%date:~8,2% set backup-dir=C:\RTXdbbackup\rtxdb-%ymd% echo 备份目录:%backup-dir%echo -----------------------------------------------

绑定 Nginx 进程到不同的 CPU 上

为什么要绑定 Nginx 进程到不同的 CPU 上 :默认情况下,Nginx 的多个进程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 进程使用硬件的资源不均,因此绑定 Nginx 进程到不同的 CPU 上是为了充分利用硬件的多 CPU 多核资源的目的. [[email protected] ~]# grep -c processor /proc/cpuinfo # 查看CPU核数 2 worker_processes 2; # 2核CPU的配置 worker_cpu_aff

Windows下结束tomcat进程,dos命令

Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator>netstat -ano|findstr 8080 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 8756 TCP 127.0.0.1:8080 127.0.0.1:52309 TIME_WAIT 0 TCP 127.0.0.1:52310 127.0.0.1:8080 TI

windows下利用线程池完成多任务的分配和运行

在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,msdn上也给出了对应的例子:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx 感兴趣的话大家可以去看看,这里我给出一个简单的demo,利用线程池单次调用多次调用,例子如下: [cpp] view plain copy

windows下node.js进程间传递客户端socket的一些规律

最近在update我的一个github项目的时候,想要把原来单一进程的模式改成多进程的模式. 事情是这样的,我做了一个HTTP服务器,支持动态脚本. 在完成了一大堆各种各样的特性后,遇到了一个脚本超时的问题. 在我的HTTP服务器中,将页面分成了Template和Activity两个部分,一个是用做VIEW的,一个是用作MODULE的,也就是类似于ASP啦. 但是,由于NODE.js是单进程的,所以我无法控制Activity中的代码(为用户脚本). 所以,如果Activity中出现死循环,那么整