一、cpu亲缘性
进程绑定CPU亲缘性,使得进程只能在指定的cpu上进行调度或者运行。
绑定cpu亲缘性的好处:每个CPU本身自己会有cache,如果调度到其他cpu上,CPU cache命中率就低了,设置CPU亲缘性,程序就会一直在指定的cpu运行,从而避免因切换带来的CPU的L1/L2 cache失效。从而进一步提高应用程序的性能。
二、fork用法
此图来源 linuxC中fork()函数详解
三、设置进程与cpu的亲缘性
#include <stdio.h> #define __USE_GNU #include <sys/syscall.h> #include <unistd.h> #include <pthread.h> void process_affinity(int num) { //gettid();//和下面这行的一摸一样的用法 pid_t selfid = syscall(__NR_gettid);//获取当前的pid cpu_set_t mask;//定义一个cpu集合 CPU_ZERO(&mask);//初始化cpu集合 CPU_SET(1, &mask);//将索引为1的cpu加入到cpu集合中(比如总过有4个cpu,那么0,1,2,3. 1就是第二个cpu) //selfid sched_setaffinity(0, sizeof(mask), &mask);//将当前线程与 cpu集合中的 cpu核设置亲缘cpu,也就是说只允许cpu集合中的cpu对该进程进行调度 while(1) ; } int main() { // 4 int num = sysconf(_SC_NPROCESSORS_CONF);//获取cpu核数 int i = 0; pid_t pid = 0; for (i = 0;i < num/2;i ++) {//创建 cpu核数 一半的进程 来测试以下 pid = fork(); if (pid <= (pid_t)0) {//子进程,直接退出。 主进程继续循环,来创建子进程 break; } } if (pid == 0) {//子进程中,它们当前的pid为0,也就是对子进程设置亲缘性 process_affinity(num); } while (1) usleep(1); }