zoukankan      html  css  js  c++  java
  • CPU亲和性(affinity)sched_setaffinity() 和 sched_getaffinity() CPU_SET()与CPU_ZERO()

    CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间的运行而不被迁移到其他处理器的倾向性。
    linux内核进程调度器天生具有软CPU亲和性(affinity)的特性,着意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。

    Linux内核还包含一些机制,它让开发人员可以编程实现硬CPU亲和性(affinity)。着意味着应用程序可以显示的指定进程在那个(或那些)处理器上运行。

    在Linux内核中,所有的进程都有一个相关的数据结构,称为task_struct。这个结构非常重要,原因有:其中与亲和性(affinity)相关度最高的是cpus_allowed位掩码。这个位掩码由n位组成,这与系统中的n位逻辑处理器一一对应。具有4个物理CPU的系统可以有4位。如果这些CPU都启用了超线程,那么这个系统就有一个8位的位掩码。

    如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运行。因此,如果一个进程可以在任何 CPU 上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是 1。实际上,这就是 Linux 中进程的缺省状态。

    如果为给定的进程设定给定的位,那么这个进程可以在相关的CPU上运行,所以如果一个进程可以在任何CUP上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是1。实际上这就是Linux的缺省状态。

    一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
    ·CPU_ZERO() 清空一个集合
    ·CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
    ·CPU_ISSET()检查一个CPU号是否在这个集合中.

    下面两个函数就是用来设置获取线程CPU亲和力状态:
    ·sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的进程此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.
    sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程

    而mask的表现是如此的:如果是0X23,转换成二进制则为00100011,则表明进程绑定在0核、1核和5核上。

    绑核需要注意是,子进程会继承父进程的绑核关系。

    转载:https://blog.csdn.net/ma950924/article/details/81773719

  • 相关阅读:
    Android(java)学习笔记197:ContentProvider使用之内容观察者02
    数据库连接池--druid
    在java中导出excel
    对excel进行封装
    创建excel,合并单元格,设置单元格样式
    认识Excel并创建一个excel(网址:http://poi.apache.org/)
    认识单元测试(jar包资源网址:http://search.maven.org/)
    Echarts在java中使用
    认识Echarts(网址:http://echarts.baidu.com/tutorial.html#ECharts%20%E7%89%B9%E6%80%A7%E4%BB%8B%E7%BB%8D)
    制作缩略图
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/13611359.html
Copyright © 2011-2022 走看看