#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
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_t 和rwlock(read write lock)的機制, 但在效能上 rwlock 要等lock被解鎖後才能動作,所以在 kernel 2.6 下加入了 RCU 的機制, 透過 COPY 的方式建立新的pointer, 不需要等lock解鎖就可執行,等執行完後在update 之前的pointer, 所以再效能上可降低 wait unlock 的時間.
sample code 4 CPU_SET
訂閱:
張貼留言 (Atom)
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