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