windows下绑定线程(进程)到指定的CPU核心
来源:互联网 发布:jquery.form.js data 编辑:程序博客网 时间:2024/05/23 17:36
一个程序指定到单独一个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
具体函数为:
其中,第一个参数为线程句柄,第二个参数为一个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的核心数量:
2
3
GetSystemInfo(&info);
printf("Number of processors: %d.\n", info.dwNumberOfProcessors);
输出的是逻辑核心数量,比如i3处理器就是双核心四线程,输出4。i5处理器是四核心四线程,输出也是4。
这样就可以方便的知道当前系统一共有多少个CPU了,同时也方便了线程数选择。
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心 http://blog.csdn.net/beyond_cn/article/details/15813361
- windows下绑定线程(进程)到指定CPU
- 如何绑定进程到指定的CPU
- 设置cpu亲和性---即 绑定特定的进程线程到指定的cpu
- LINUX将制定的线程号、进程号绑定到指定CPU核上
- linux绑定进程到指定cpu
- linux绑定进程到指定cpu
- 将进程绑定到指定CPU
- C#线程绑定到指定cpu
- linux线程绑定到指定cpu运行
- SMP系统linux下的进程绑定指定cpu
- Linux下CPU绑定线程、进程
- 如何将一个进程(线程)绑定到一个固定的CPU核上?
- Linux 下绑定进程到 CPU
- 01背包和完全背包代码
- 如何看待阿里的去IOE
- hdu 1711 水kmp
- iOS开发之高效绘图,通过一个绘图应用进行讲解
- JAVA CAS原理深度分析
- windows下绑定线程(进程)到指定的CPU核心
- maven 配置 ,eclipse创建maven web 项目
- CSS3时钟
- Activity进入与退出动画之xml实现
- Ajax实例
- 为什么国内的网盘公司都在 TB 的级别上竞争,成本会不会太高?
- 兼容性较好的图片上传预览
- tomcat server.xml中文版
- 【UNET自学日志】Part 13 僵尸的ID