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/html
目的: 爲了可以讓程序擁有更好的性能,有時候須要將進程或線程綁定到特定的CPU,這樣能夠減小調度的開銷和保護關鍵進程或線程。linux
進程綁定到特定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);
參數ui
pid:進程的id號,若是pid爲0,則表示本進程
cpusetsize:mask的大小
mask:運行進程的CPU,能夠經過如下函數操做maskspa
#define CPU_SET(cpu, cpusetp) //設置cpu #define CPU_CLR(cpu, cpusetp) //刪除cpu #define CPU_ISSET(cpu, cpusetp) //判斷cpu #define CPU_ZERO(cpusetp) //初始化爲0
示例代碼:.net
#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核心上運行的了。code
THE END!htm