免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1912 | 回复: 1
打印 上一主题 下一主题

大家帮忙解释下---关于多CPU中进程与CPU绑定的例子 谢谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-15 21:09 |只看该作者 |倒序浏览
cpu.c

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<sys/types.h>
  4. #include<sys/sysinfo.h>
  5. #include<unistd.h>

  6. #define __USE_GNU
  7. #include<sched.h>
  8. #include<ctype.h>
  9. #include<string.h>

  10. int main(int argc, char* argv[])
  11. {
  12.         int num = sysconf(_SC_NPROCESSORS_CONF);
  13.         int created_thread = 0;
  14.         int myid;
  15.         int i;
  16.         int j = 0;

  17.         cpu_set_t mask;
  18.         cpu_set_t get;

  19.         if (argc != 2)
  20.         {
  21.                 printf("usage : ./cpu num\n");
  22.                 exit(1);
  23.         }

  24.         myid = atoi(argv[1]);

  25.         printf("system has %i processor(s). \n", num);

  26.         CPU_ZERO(&mask);
  27.         CPU_SET(myid, &mask);

  28.         if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
  29.         {
  30.                 printf("warning: could not set CPU affinity, continuing...\n");
  31.         }
  32.         while (1)
  33.         {

  34.                 CPU_ZERO(&get);
  35.                 if (sched_getaffinity(0, sizeof(get), &get) == -1)
  36.                 {
  37.                         printf("warning: cound not get cpu affinity, continuing...\n");
  38.                 }
  39.                 for (i = 0; i < num; i++)
  40.                 {
  41.                         if (CPU_ISSET(i, &get))
  42.                         {
  43.                                 printf("this process %d is running processor : %d\n",getpid(), i);
  44.                         }
  45.                 }
  46.         }
  47.         return 0;
  48. }
复制代码
上段代码中有几个地方不明白,请大家帮忙解释,谢谢了~~
1)created_thread ------------------------这个变量好像没有用到,为什么?是某些函数调用需要的变量吗?

2)char* argv[]-----------------------------这个字符指针数组表示意思?

3)atoi(argv[])--------------------------------------这个函数表示什么意思?是获取进程id的吗?

4)CPU_SET(myid, &mask)函数应该是将进程号为myid的进程加入到mask掩码指定的CPU中运行???

5)CPU_ZERO(&get);这里将CPU集合清空,怎么后面还有CPU_ISSET(i, &get)函数???这时cpu i肯定不在 &get里面了吧?

以上几个问题,看的不是很明白,希望大家指点一下咯。


另外,如果我想绑定具体的进程到某个CPU,例如现有进程a、b、c、d,现在我想绑定a、b、c到CPU 0上,进程d绑定CPU 1上,该怎么做?假如我不知道进程a、b、c、d

的进程号的情况下。

如果不是进程,是可执行的应用程序可以吗?比如四个不同阶数矩阵乘法。

最近看到这个,觉得很有兴趣,想问问大家,谢谢了~~~

论坛徽章:
0
2 [报告]
发表于 2010-08-27 16:55 |只看该作者
1) 这个变量在你的代码里面确实没有被赋值...
2)argv是保存命令行变量的,形象的说
    e.g.   ./hello cjx
    argv[0]为hello
    argv[1]为cjx
3)atoi将字符串转换为整形
4)#define CPU_SET(cpu, cpusetp)   __CPU_SET (cpu, cpusetp)
   是对应cpu的id
5)CPU_ZERO(&mask);
     CPU_SET(myid, &mask);
     CPU_ZERO用来清空mask,初始化前的置空操作,后面有set进行赋值
6)sched_setaffinity中pid为0,代表把当前进程绑定到某mask对应的CPU上去,而且,你也可以通过system()执行脚本 ps | grep "proc A/B/C/D"

大体上就说这些吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP