進程綁定 CPU 的好處:在多核 CPU 結(jié)構(gòu)中,每個核心有各自的L1、L2緩存,而L3緩存是共用的。如果一個進程在核心間來回切換,各個核心的緩存命中率就會受到影響。相反如果進程不管如何調(diào)度,都始終可以在一個核心上執(zhí)行,那么其數(shù)據(jù)的L1、L2 緩存的命中率可以顯著提高。所以,將進程與 CPU 進行綁定可以提高 CPU 緩存的命中率,從而提高性能。而進程與 CPU 綁定被稱為:
CPU 親和性
。設(shè)置進程的 CPU 親和性
前面介紹了進程與 CPU 綁定的好處后,現(xiàn)在來介紹一下在 Linux 系統(tǒng)下怎么將進程與 CPU 進行綁定的(也就是設(shè)置進程的 CPU 親和性)。Linux 系統(tǒng)提供了一個名為?sched_setaffinity
?的系統(tǒng)調(diào)用,此系統(tǒng)調(diào)用可以設(shè)置進程的 CPU 親和性。我們來看看?sched_setaffinity
?系統(tǒng)調(diào)用的原型:int?sched_setaffinity(pid_t?pid,?size_t?cpusetsize,?const?cpu_set_t?*mask);
下面介紹一下?sched_setaffinity
?系統(tǒng)調(diào)用各個參數(shù)的作用:pid
:進程ID,也就是要進行綁定 CPU 的進程ID。cpusetsize
:mask 參數(shù)所指向的 CPU 集合的大小。mask
:與進程進行綁定的 CPU 集合(由于一個進程可以綁定到多個 CPU 上運行)。
mask
?的類型為?cpu_set_t
,而?cpu_set_t
?是一個位圖,位圖的每個位表示一個 CPU,如下圖所示:例如,將?
cpu_set_t
?的第0位設(shè)置為1,表示將進程綁定到 CPU0 上運行,當(dāng)然我們可以將進程綁定到多個 CPU 上運行。我們通過一個例子來介紹怎么通過?sched_setaffinity
?系統(tǒng)調(diào)用來設(shè)置進程的 CPU 親和性:#define?_GNU_SOURCE
#include?
#include?
#include?
#include?
#include?
#include?
int?main(int?argc,?char?**argv)
{
????cpu_set_t?cpuset;
????CPU_ZERO(