Date: 2018.8.25
1、參考
https://linux.die.net/man/3/cpu_zero
http://www.man7.org/linux/man-pages/man3/CPU_SET.3.html#top_of_page
https://www.linuxidc.com/Linux/2015-04/116867.htm
http://blog.163.com/liaoxiangui@126/blog/static/7956964020127204171138/
https://blog.csdn.net/honey_yyang/article/details/7848608/
2、將進程綁定到特定CPU核心上
目的: 為了能夠讓程序擁有更好的性能,有時候需要將進程或線程綁定到特定的CPU,這樣可以減少調度的開銷和保護關鍵進程或線程。
進程綁定到特定CPU
Linux提供一個接口,可以將進程綁定到特定的CPU:
#define _GNU_SOURCE
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
參數
pid:進程的id號,如果pid為0,則表示本進程
cpusetsize:mask的大小
mask:運行進程的CPU,可以通過以下函數操作mask
#define CPU_SET(cpu, cpusetp) //設置cpu
#define CPU_CLR(cpu, cpusetp) //刪除cpu
#define CPU_ISSET(cpu, cpusetp) //判斷cpu
#define CPU_ZERO(cpusetp) //初始化為0
示例代碼:
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <sched.h>
void WasteTime()
{
int abc = 10000000;
while(abc--)
{
int tmp = 10000*10000;
}
sleep(1);
}
int main(int argc, char **argv)
{
cpu_set_t mask;
while(1)
{
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
WasteTime();
CPU_ZERO(&mask);
CPU_SET(1, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
WasteTime();
CPU_ZERO(&mask);
CPU_SET(2, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
WasteTime();
CPU_ZERO(&mask);
CPU_SET(3, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
perror("sched_setaffinity");
}
WasteTime();
}
}
對於arm設備指定cpu核心的方法:
#if CONFIG_CORE
#define _GNU_SOURCE //啟動CPU_ZERO和CPU_SET等系統函數
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#inlcude <sched.h>
#include <pthread.h>
#include <fcntl.h>
#inlcude <unistd.h>
#include <errno.h>
static void __setAffinity_CPU_0(pid_t tid)
{
cpu_set_t cs;
CPU_ZERO(&cs);
CPU_SET(&cs,0);//設置CPU核心為0
sched_setaffinity(tid,sizeof(cs),&cs);
}
#endif
int main(int argc, char **argv)
{
#if CONFIG_CORE
int coreindex = 3;
pid_t tid = null;
tid = syscall(SYS_gettid);
setAffinity_CPU(tid, coreindex);
#endif
}
//指定cpu核
pid_t tid = syscall(SYS_gettid);//獲取當前進程pid
__setAffinity_CPU_0(tid);//指定在CPU為0的核上運行,不指定時,運行的cpu隨機分配,在不同的核上運行性能會有所差異。
結果查看:
查看具體進程情況可以在執行時在另一個窗口使用top -h來查看線程的情況,查看各個核上的情況請使用top命令然后按數字“1”來查看。這樣就可以知道當前進程是在哪個CPU核心上運行的了。
THE END!