[精彩] 发一个多CPU中进程与CPU绑定的例子(转)
上一篇 / 下一篇 2009-03-13 11:45:37 / 个人分类:基本概念
TX;I#?aw0转自:http://linux.chinaunix.net/bbs/viewthread.php?tid=90490651Testing软件测试网C V4u&b7[
K
PB
x(at
ho0现在多CPU的趋势越来越大了. 有时候为了更好地操作机器, 需要将某个进程绑定到具体的CPU上去. 下面给出了一个进程绑定到具体的CPU上去的一个例子. 51Testing软件测试网z
qe5irQ"`bl
51Testing软件测试网*Q0B~Tb4b o2oO"sM
51Testing软件测试网\3qI)tu|[
y&y
w
cpu.c51Testing软件测试网R;S(nSl4E*vf
T,cAL%~|*x0[CODE]
VEb?!z)Z0#include<stdlib.h>
h!yTHb)`0#include<stdio.h>
bl.O5g*| g+R0#include<sys/types.h>
#l3BghL`1dt@s0#include<sys/sysinfo.h>
T#r$c'YZ0#include<unistd.h>51Testing软件测试网5oSm1Xx+DB
Ja(C,?:D4Gl0#define __USE_GNU
2`(h,})|g}t
Y w0#include<sched.h>
H6t/S6fE#|2_Rkw0#include<ctype.h>51Testing软件测试网0`1I c ac0I#n8Y,~-Z
#include<string.h>51Testing软件测试网e6o?N\7Z,u
51Testing软件测试网xu%oBJ6N
int main(int argc, char* argv[])
9d5DA5x$W}/@6Ao0{51Testing软件测试网*x\)~V0x"L
Z
int num = sysconf(_SC_NPROCESSORS_CONF);
;j;jO9x]?0 int created_thread = 0;
Ccm%X-k;_3GI0 int myid;
+T6B(]
n%U,S0 int i;
(D]{.`;pn2\0 int j = 0;
)Bj?}U&h1@+lK051Testing软件测试网Jk:c*N{TI
cpu_set_t mask;51Testing软件测试网;b$cV%e)Z?%f?
cpu_set_t get;
}t||X-I9n3A{ j051Testing软件测试网
D:G2}-n}s!KR5vC
if (argc != 2)51Testing软件测试网ig-gd1O
I
{51Testing软件测试网@H9Mk sZfSG
printf("usage : ./cpu num\n");
Y2[sb'xn#b0 exit(1);
T!s'_
c5qL)[0 }51Testing软件测试网!kJiv
P*}s G
51Testing软件测试网oM'|^:jG
myid = atoi(argv[1]);
!M0I~3?+vRE0
{@:xM&e/I4Y*s)ZD.?0 printf("system has %i processor(s). \n", num);
z"M0KS5N.ZJ051Testing软件测试网6b*C#nKT
CPU_ZERO(&mask);51Testing软件测试网6~g:O3Lry'a
CPU_SET(myid, &mask);
1qR*pji.\G051Testing软件测试网lb+W @(@8z
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
W+kH-qbV7W(X
OY%K0 {51Testing软件测试网!m]$I+J4}d)O
printf("warning: could not set CPU affinity, continuing...\n");51Testing软件测试网8B}*I
Iq#sR$P9e2C.t
}51Testing软件测试网)v(Un+im&Bb5G
while (1)51Testing软件测试网W9o9pM4S
{
.u&j^}Ff?b?\&R0
H[gQ&Zq l G0 CPU_ZERO(&get);51Testing软件测试网
g}`2G0J
w b2b D
if (sched_getaffinity(0, sizeof(get), &get) == -1)
fu%n._$w5Nq0 {
!O&@7bdr+y n+V@:b*Z0 printf("warning: cound not get cpu affinity, continuing...\n");51Testing软件测试网/D\vqC:_o
}
\j` f)n
uH4@G0 for (i = 0; i < num; i++)
)j^\fM0?0 {
4m(q}p&T0 if (CPU_ISSET(i, &get))51Testing软件测试网Y!]'l0},T3B%v
CA,e
{51Testing软件测试网9j%r]-L0na,u
printf("this process %d is running processor : %d\n",getpid(), i);51Testing软件测试网+L?8}/~ ^&\ NxGL&cT
}51Testing软件测试网+TUe4l2~
V
}51Testing软件测试网4B"C^A'ZhXa*ZnN4?
}51Testing软件测试网A7v7B
\K\ v B
return 0;
p5F5WK G(K^H*|u[0}
$Phq8M%|UM.wd*f0[/CODE]51Testing软件测试网/^ Y:LVu%@&N3D
51Testing软件测试网T,vKnQQ0s
下面是在两个终端分别执行了./cpu 0 ./cpu 2 后得到的结果. 效果比较明显.
1c!R\y5P0
7lSR^
G^|0[QUOTE]51Testing软件测试网#s|CNQ's,~
Cpu0 : 5.3%us, 5.3%sy, 0.0%ni, 87.4%id, 0.0%wa, 0.0%hi, 2.0%si, 0.0%st
!b-~7@"s9ziL
MI0Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
w)du-@+U Z`0Cpu2 : 5.0%us, 12.2%sy, 0.0%ni, 82.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st51Testing软件测试网[4J!~5bI2o1z
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Su3cv\0kKF(xE0Cpu4 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
pC)LzL0Cpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st51Testing软件测试网1s"z
Zf"W*B ]b
Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st51Testing软件测试网u%O}/fqc3N0C1z.E
Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
-zlVQ y#g"i_0[/QUOTE]
9o${|_0{oj051Testing软件测试网sp)]?8^Md J7Y
XvJ lg\T3M}#l/{0
wawxdyy回复于:2007-07-31 10:24:5551Testing软件测试网 v`Q\9Fu)v5DhU
U@$X%_Vy5{f.Y1l0晕啊,刚才运行了一下,差点死了,呵呵,机器太差了,兄弟能具体说上面那个统计表都是什么意思吗,不太懂,另外像#define __USE_GNU这样的宏在哪能找到帮助51Testing软件测试网r-U!A!}'L!mGZk
(D0Q]GUHn7b!vE0
scutan回复于:2007-07-31 10:54:2651Testing软件测试网}~ V#F i#{M/NJ
51Testing软件测试网U6P qid^;cg6h}
引用:原帖由 wawxdyy 于 2007-7-31 10:24 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6377024&ptid=904906]51Testing软件测试网o$W[z\
晕啊,刚才运行了一下,差点死了,呵呵,机器太差了,兄弟能具体说上面那个统计表都是什么意思吗,不太懂,另外像#define __USE_GNU这样的宏在哪能找到帮助
-H0J?| t051Testing软件测试网$s!~-dO5SS
0E%I:J(T9A:X0
^%mO%d$k^8jN h4Y0那个是在运行top命令之后再按1就出现了对每个CPU的统计.
/GU#w[Xi{'}*G0us 用户空间占用CPU百分比
H5oFk}(['o ]0sy 内核空间占用CPU百分比
'N,k.P ZB!JB7U9Ux0ni 用户进程空间内改变过优先级的进程占用CPU百分比
6m\1X4p}o8B0id 空闲CPU百分比 51Testing软件测试网Z+ArT.Qf(p-f
wa 等待输入输出的CPU时间百分比
7k[ L@Dp@9g0后面两个我也不是太清楚,麻烦清楚的朋友说一下. 51Testing软件测试网%d%`i&t{$u7u
51Testing软件测试网bn t:VOR7hmI
使用#define __USE_GNU是为了使用CPU_SET()等宏. 具体在/usr/include/sched.h中有如下的定义.
1In/H-}$FS;^.VE0因为我开始编写的时候没有加这个宏, 出现了错误, 后来查看了这个定义才知道要使用这个东西.
_p&} |7p!h0[CODE]
_.s"l+K p;Y%B?0#ifdef __USE_GNU
Nz#F8M*N f0/* Access macros for `cpu_set'. */
M7UCt)XQkyl0#define CPU_SETSIZE __CPU_SETSIZE51Testing软件测试网9p0r%MW3er
#define CPU_SET(cpu, cpusetp) __CPU_SET (cpu, cpusetp)