图解:进程怎么绑定 CPU
扫描二维码
随时随地手机看文章
进程绑定 CPU 的好处:在多核 CPU 结构中,每个核心有各自的L1、L2缓存,而L3缓存是共用的。如果一个进程在核心间来回切换,各个核心的缓存命中率就会受到影响。相反如果进程不管如何调度,都始终可以在一个核心上执行,那么其数据的L1、L2 缓存的命中率可以显著提高。所以,将进程与 CPU 进行绑定可以提高 CPU 缓存的命中率,从而提高性能。而进程与 CPU 绑定被称为:
CPU 亲和性
。设置进程的 CPU 亲和性
前面介绍了进程与 CPU 绑定的好处后,现在来介绍一下在 Linux 系统下怎么将进程与 CPU 进行绑定的(也就是设置进程的 CPU 亲和性)。Linux 系统提供了一个名为sched_setaffinity
的系统调用,此系统调用可以设置进程的 CPU 亲和性。我们来看看 sched_setaffinity
系统调用的原型:int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
下面介绍一下 sched_setaffinity
系统调用各个参数的作用:pid
:进程ID,也就是要进行绑定 CPU 的进程ID。cpusetsize
:mask 参数所指向的 CPU 集合的大小。mask
:与进程进行绑定的 CPU 集合(由于一个进程可以绑定到多个 CPU 上运行)。
mask
的类型为 cpu_set_t
,而 cpu_set_t
是一个位图,位图的每个位表示一个 CPU,如下图所示:例如,将
cpu_set_t
的第0位设置为1,表示将进程绑定到 CPU0 上运行,当然我们可以将进程绑定到多个 CPU 上运行。我们通过一个例子来介绍怎么通过 sched_setaffinity
系统调用来设置进程的 CPU 亲和性:#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
cpu_set_t cpuset;
CPU_ZERO(