1 概述

  CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。SylixOS支持对称多处理器(Symmetric Multi-Processor),其线程是调度的最小单位,SylixOS可以对应用层线程,内核线程以及中断设置CPU亲和性,即将不同线程绑定到不同CPU,充分发挥多核处理器并行处理的优势。

2 SylixOS设置CPU亲和性

  SylixOS中每个线程都有一个对应的线程控制块,线程控制块中与CPU亲和性最高的是CPU位掩码,这个位掩码由 n 位组成,与系统中的 n 个逻辑处理器一一对应。 具有 4 个物理 CPU 的系统可以有 4 位。如果这些 CPU 都启用了超线程,那么这个系统就有一个 8 位的位掩码。

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

2.1 线程与CPU绑定

  SylixOS兼容POSIX标准,应用层线程和内核线程的CPU亲和性设置可以使用POSIX接口。pthread_setaffinity_np函数的第三个参数即为CPU掩码。如程序清单2-1所示。

程序清单2-1  线程与CPU绑定

int pthread_setaffinity_np (pthread_t  thread, size_t setsize, const cpu_set_t *set)函数名称: pthread_setaffinity_np功能描述: 设置线程调度的 CPU 集合输 入  : pid           进程 / 线程 ID         setsize       CPU 集合大小         set           CPU 集合输 出  : ERROR or OK

2.2 中断与CPU绑定

   SylixOS中断源的CPU亲和性设置与线程的CPU亲和性设置函数接口相似,如程序清单2-2所示。

程序清单2-2  中断与CPU绑定

ULONG API_InterSetTarget (ULONG  ulVector, size_t  stSize, const PLW_CLASS_CPUSET  pcpuset)函数名称: API_InterSetTarget功能描述: 设置指定中断向量目标 CPU输 入  : ulVector      中断向量号         stSize        CPU 掩码集内存大小         pcpuset       CPU 掩码输 出  : ERROR CODE

3 示例

  示例环境:ZYNQ7000 双核。

3.1 绑定程序示例

  1.SylixOS在/proc/kernel/affinity文件中记录了CPU亲和性信息,如图3-1所示,可以看到除空闲任务绑定到对应CPU上,别的任务CPU亲和性标记为*表示任务可以在所有CPU上运行。

图3-1  运行测试程序前CPU亲和性信息

  2.运行如程序清单3-1所示测试程序,将主线程绑定到CPU1,子线程绑定到CPU0。

程序清单3-1  CPU绑定测试程序

#include 
#include 
void* task (void* arg) {    while(1) {        printf("Hello SylixOS!\n");        sleep(1);    }     return NULL;}int main (int argc, char **argv){    pthread_t         tid;    pthread_attr_t    attr;    cpu_set_t         cpuset;        pthread_attr_init(&attr);    pthread_create(&tid, &attr, task, NULL);            /*     * 主线程绑定到CPU1     */    CPU_ZERO(&cpuset);    CPU_SET(1, &cpuset);    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);        /*     * 子线程绑定到CPU0     */    CPU_ZERO(&cpuset);    CPU_SET(0, &cpuset);    pthread_setaffinity_np(tid, sizeof(cpu_set_t), &cpuset);        while(1) {        sleep(5);    }     pthread_join(tid, NULL);     return  (0);}

  3. 再查看/proc/kernel/affinity文件中的CPU亲和性信息,如图3-2所示,可以看到执行测试程序后,主线程绑到到CPU1,子线程绑定到CPU0。

图3-2  运行测试程序后CPU亲和性信息

  4.输入ts命令查看线程信息,如图3-3所示,可以看到主线程确实在CPU1上运行,子线程在CPU0上运行,符合测试程序结果。

图3-3  ts命令查看线程信息

3.2 绑定程序示例

  SylixOS提供ints命令可以查看中断向量的信息,如图3-4所示,红框标记的数值为系统启动后对应中断在对应CPU的中断响应次数。

图3-4  中断向量信息

  将部分中断与CPU1绑定后,再执行ints命令,如图3-5所示,可以看到后续的中断响应次数仅在CPU1上累加,CPU0上数值不变表明中断不再由CPU0处理。

图 3-5  中断绑定到CPU1后的中断向量信息

  注意:时钟中断的CPU亲和性由硬件决定,不能将其绑定到CPU1。

4 参考资料

  《SylixOS应用开发手册》

  《管理处理器的亲和性》   https://www.ibm.com/developerworks/cn/linux/l-affinity.html