网站大量收购闲置独家精品文档,联系QQ:2885784924

多核处理器linux的进程绑定处理器核运行.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多核处理器linux的进程绑定处理器核运行

多核处理器Linux的进程绑定核运行 名词CPU affinity:中文称作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。 一、Linux代码中绑定多核运行 1、如果自己写代码,要把进程绑定到CPU,该怎么做?可以用sched_setaffinity函数。在Linux上,这会触发一次系统调用。 int sched_setaffinity(pid_t pid, unsigned int len, unsigned long *mask); sched_setaffinity 的第一个参数是pid (进程ID),设置进程为pid的这个进程,让它运行在mask所设定的CPU上。如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上;第二个参数cpusetsize是mask所指定的数的长度。通常设定为sizeof(cpu_set_t);如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行。 int sched_getaffinity(pid_t pid, unsigned int len, unsigned long *mask); 该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中,即获得指定pid当前可以运行在哪些CPU上。同样,如果pid的值为0.也表示的是当前进程。 void CPU_ZERO (cpu_set_t *set) 这个宏对 CPU 集 set 进行初始化,将其设置为空集。 void CPU_SET (int cpu, cpu_set_t *set) 这个宏将 cpu 加入 CPU 集 set 中。 void CPU_CLR (int cpu, cpu_set_t *set) 这个宏将 cpu 从 CPU 集 set 中删除。 int CPU_ISSET (int cpu, const cpu_set_t *set) 如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。 Example:我是在一个虚拟机上运行的程序,机器CPU是双核的,我设置虚拟机模拟四核。在linux上执行top指令看结果,点击“1”查看每个CPU核的运行情况。 /* Short test program to test sched_setaffinity * (which sets the affinity of processes to processors). * Compile: gcc sched_setaffinity_test.c * -o sched_setaffinity_test.o -lm * Usage: ./sched_setaffinity_test.o * * Open a top-window at the same time and see all the work * being done on CPU 0 first and after a short wait on CPU 1,2,3. * Repeat with different numbers to make sure, it is not a * coincidence. */ #include stdio.h #include math.h #include sched.h double waste_time(long n) { double res = 0; long i = 0; while(i n * 200000) { i++; res += sqrt(i); } return res; } int main(int argc, char **argv) { unsigned long mask = 1; /* 二进制1,processor 0 */ /* bind process to processor 0 */ if (sched_setaffinity(0, sizeof(mask), mask) 0) { perror(sched_setaffinity); } /* waste some time so the work is visible with top */ printf (result: %f\n, waste_time (2000)); mask = 2; /*二进制10, process switches to processor 1 now */ if (sched_setaffinity(0, sizeof(mas

文档评论(0)

wujianz + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档