所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

怎样把一个线程绑定到固定的cpu上面?

发布时间:2020-04-15 16:25:51

资讯分类:线程  绑定  cpu  固定  线程  亲缘  运行
怎样把一个线程绑定到固定的cpu上面?

实现方法进程与指定cpu绑定

:SetProcessAffinityMask(GetCurrentProcess(),dwMask);

线程与指定cpu绑定:

SetThreadAffinityMask(GetCurrentThread(),dwMask);dwMask为CPU序号的或运算值:1(0001)

代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2

,以此类推。

设置之前最好判断一下系统有几个CPU:

SYSTEM_INFOSystemInfo;

GetSystemInfo(&SystemInfo);CPU个数:SystemInfo.dwNumberOfProcessors

当前启用的CPU序号:

SystemInfo.dwActiveProcessorMask

,Maskrepresentingthesetofprocessorsconfiguredintothesystem.Bit0isprocessor0;

bit31isprocessor31.

CPU亲缘性介绍

按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。

有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插件板上有4个CPU和它自己的内存区。

当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。

注意:(1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。

(2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。

应用场景举例:

将UI线程限制在一个CPU,将其他实时性要求较高的线程限制在另一个CPU。这样,当UI需要占用大量CPU时间时,就不会拖累其他实时性要求较高的线程的执行

。同样可以将UI线程与一些优先级不高但耗时的异步运算线程设置在不同CPU上,避免UI给人卡顿的感觉。

怎样把一个线程绑定到固定的cpu上面?

不会出现问题的,具体过程如下。

假设线程开始运行在core1上,对内存x将旧值b更改成新值a,在完成mov [x], a指令时,a这个值至少已经写到core1上的store buffer里面了。

线程要被迁移到core2,那必须是它被抢占,或主动让出cpu,或者主动睡眠才可以发生迁移到core2. 但不管什么情况,它必须在core1执行完schedule函数之后,才会发生迁移。

而schedule函数有以下一段代码:

注意上述最后两条语句,它会产生一个mb,意味着执行到mb之后,刚才将x修改为a的操作,会从store buffer写到L1 Cache,并且会将invalid message发送到其它核的invalid queue上。

之后线程才被调度出来了。

而线程被core2迁移过来时,它要执行,也必须是另一个线程执行schedule之后才能轮到该线程执行。同样,scheuld函数在core2执行时,因为有mb语句,它必须将本core2的invalid queue上的请求应用到本核的L1 Cache上,才能往前执行,此时Core2上L1 Cache上x的值状态变为invalid。

所以线程在core2执行完schedule后,还没有返回到用户态执行,那此时Cache情况如下:

Core1: x值,有效,为a,Exclusive状态

Core2: x值,无效, 因为收到core1的invalide message并应用到本Cache

然后线程执行到用户态时,访问x变量,本地cache是invalid,会发送读cache请求到core1,core1返回x的值为a给core2,此时core1/core2对x地址的状态均为Share。

所以Linux已 处理好进程调度与Cache的关系了。

留言与评论(共有 0 条评论)
   
验证码:
Top