2010年9月4日 星期六

SMP @ Linux Kernel case study

在多核心架構下,除了可以用 sched.h 底下的 CPU_SET 來指定 schedule list上的 schedule processor 要給那個CPU使用外.還要考慮CPU lock/schedule 的機制.一但多個CPU Access 相同的 Memory Address時,就需要 lock priority 來確保 Memory Address 不會被 overwrite. 在Linux kernel 上提供了 spinlock_trwlock(read write lock)的機制, 但在效能上 rwlock 要等lock被解鎖後才能動作,所以在 kernel 2.6 下加入了 RCU 的機制, 透過 COPY 的方式建立新的pointer, 不需要等lock解鎖就可執行,等執行完後在update 之前的pointer, 所以再效能上可降低 wait unlock 的時間. sample code 4 CPU_SET
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>

#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>

int main(int argc, char* argv[])
{
        int num = sysconf(_SC_NPROCESSORS_CONF);
        int created_thread = 0;
        int myid;
        int i;
        int j = 0;

        cpu_set_t mask;
        cpu_set_t get;

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

        myid = atoi(argv[1]);

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

        CPU_ZERO(&mask);
        CPU_SET(myid, &mask);

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

                CPU_ZERO(&get);
                if (sched_getaffinity(0, sizeof(get), &get) == -1)
                {
                        printf("warning: cound not get cpu affinity, continuing...\n");
                }
                for (i = 0; i < num; i++)
                {
                        if (CPU_ISSET(i, &get))
                        {
                                printf("this process %d is running processor : %d\n",getpid(), i);
                        }
                }
        }
        return 0;
}
code reference [精彩] 发一个多CPU中进程与CPU绑定的例子 Refs: Linux RCU机制详解 Read-copy-update

1 則留言:

  1. cpu_set
    http://kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

    SCHED_SETAFFINITY(2)
    http://kernel.org/doc/man-pages/online/pages/man2/sched_getaffinity.2.html

    回覆刪除