进程和线程的cpu亲和性

进程和线程的cpu亲和性

ID:34718223

大小:54.16 KB

页数:4页

时间:2019-03-10

进程和线程的cpu亲和性_第1页
进程和线程的cpu亲和性_第2页
进程和线程的cpu亲和性_第3页
进程和线程的cpu亲和性_第4页
资源描述:

《进程和线程的cpu亲和性》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、进程和线程的亲缘性(affinity)是指可以将进程或者是线程强制限制在可用的CPU子集上运行的特性,它一定程度上把进程/线程在多处理器系统上的调度策略暴露给系统程序员。CPU的数量和表示在有n个CPU的Linux上,CPU是用0...n-1来进行一一标识的。CPU的数量可以通过proc文件系统下的CPU相关文件得到,如cpuinfo和stat:$cat/proc/stat

2、grep"^cpu[0-9]+"

3、wc-l8$cat/proc/cpuinfo

4、grep"^processor"

5、wc-l8在系统编程中,可以直接调用库调用sysconf获得:sysco

6、nf(_SC_NPROCESSORS_ONLN);进程的亲缘性Linux操作系统在2.5.8引入了调度亲缘性相关的系统调用:intsched_setaffinity(pid_tpid,unsignedintcpusetsize,cpu_set_t*mask);intsched_getaffinity(pid_tpid,unsignedintcpusetsize,cpu_set_t*mask);其中sched_setaffinity是设定进程号为pid的进程调度亲缘性为mask,也就是说它只能在mask中指定的CPU之间进行调度执行;sched_getaffin

7、ity当然就是得到进程号为pid的进程调度亲缘性了。如果pid为0,则操纵当前进程。第二个参数指定mask所指空间的大小,通常为sizeof(cpu_set_t)。第三个参数mask的类型为cpu_set_t,即CPU集合,GNU的c库(需要在include头文件之前定义__USE_GNU)还提供了操作它们的宏:voidCPU_CLR(intcpu,cpu_set_t*set);intCPU_ISSET(intcpu,cpu_set_t*set);voidCPU_SET(intcpu,cpu_set_t*set);voidCPU_ZERO(cpu_set_t*

8、set); 如果我们所关心的只是CPU#0和CPU#1,想确保我们的进程只会运作在CPU#0之上,而不会运作在CPU#1之上。下面程序代码可以完成此事:cpu_set_t set;  int ret, i;   CPU_ZERO(&set);  CPU_SET(0, &set);  CPU_CLR(1, &set);   ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);  if( ret == -1)  {          perror("sched_se");  }  for( i=0; i < 3;

9、 i++)  {       int cpu;         cpu = CPU_ISSET(i, &set);         printf("cpu = %i is %s/n", i, cpu? "set" : "unset");  }Linux只提供了面向线程的调度亲缘性一种接口,这也是上面只提调度亲缘性而不直言进程亲缘性的原因。当前Linux系统下广泛采用的线程库NPTL(NativePosixThreadLibrary)是基于线程组来实现的,同一个线程组中的线程对应于一组共享存储空间的轻量级进程,它们各自作为单独调度单位被内核的调度器在系统范围内调

10、度,这种模型也就是我们通常所说的1-1线程模型。正因如此,目前线程的调度范围(可以用函数pthread_attr_getscope和pthread_attr_setscope获取和设置)只能是系统级而不能是进程级。 c库的GNU扩展所提供的有关线程亲缘性的API如下:intpthread_attr_setaffinity_np(pthread_attr_t*__attr,size_t__cpusetsize,__constcpu_set_t*__cpuset);intpthread_attr_getaffinity_np(__constpthread_attr

11、_t*__attr,size_t__cpusetsize,cpu_set_t*__cpuset);intpthread_setaffinity_np(pthread_t__th,size_t__cpusetsize,__constcpu_set_t*__cpuset);intpthread_getaffinity_np(pthread_t__th,size_t__cpusetsize,cpu_set_t*__cpuset);亲缘性的继承调度亲缘性是被fork出来的子进程所继承的,即使子进程通过exec系列函数更换了执行镜像。因为Linux操作系统下进程和线程的

12、创建都是通过系统调用clone来实现的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。