- 论坛徽章:
- 0
|
有些时候我们希望我们的程序中的线程真正意义上的异步运行,而不是伪异步,实际上却在一个物理cpu上执行,那么也许我们便会用到cpu绑定的问题了.
下面是我自己测试用的cpu绑定用的实例,用户空间和内核空间各一个例子:
user space:
int main(int argc, char* argv[])
{
unsigned long new_mask = 12;
unsigned int len = sizeof(new_mask);
unsigned long cur_mask;
pid_t p = 0;
int ret;
ret = sched_getaffinity(p,len,&cur_mask);
printf(" %d, cur_mask = %08lx\n",ret,cur_mask);
ret = sched_setaffinity(p,len,&new_mask);
printf(" %d, new_mask = %08lx\n",ret,new_mask);
ret = sched_getaffinity(p,len,&cur_mask);
printf(" %d, cur_mask = %08lx\n",ret,cur_mask);
return 0;
}
例子中new_mask中的最后面几位每一位都代表了一个cpu了,例如我用的是4cpu的,那么第一个cpu便是0x00000001,第二个cpu是0x00000002,依次是0x00000004,0x00000008
如果new_mask的值设置为3的话,那就代表是第一个和第二个cpu,线程只允许运行在这两个cpu上.pid_t p的值设置为0代表当前的线程.
kernel space:
cpumask_t my_mask;
int mycpu = 1;
printk("\nbefore:%08lx\n",current->cpus_allowed.bits[0]);
cpus_clear(my_mask);
printk("clear:%08lx\n",my_mask.bits[0]);
cpu_set(mycpu,my_mask);
printk("set :%08lx\n",my_mask.bits[0]);
current->cpus_allowed = my_mask;
内核空间和用户空间有所不同的是,这里的int mycpu代表的是第几个物理cpu而不是具体的long类型中的第几位,也就是说mycpu = 0 对应着用户空间的 0x00000001 .而mycpu = 1 对应着用户空间的 0x00000002,这样也许就比较容易理解了.
在google搜索了好久,没有找到比较具体的解释,所以就自己简单的写了这么个东西,希望可以给大家带来一点点的帮助
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35053/showart_285398.html |
|