apue p223
首先是两个概念静态优先级值 “nice” ,动态优先级值“pri” 这都可以在ps命令是查看,nice值影响动态优先级。nice值是有范围的-20~19(0~(2*nzero)-1),如果超过这个值系统也会给你恢复在这范围内。pri越低优先级越高,nice默认0,pri(new) = pri+nice;不一定准确但这是给我的感觉。getpriority可以获取进程得nice值。
动态优先级影响进程的时间片也就是运行时间,这就涉及调度算法了,水平有限。还未接触就只能描述这么多 下面直接上代码和输出结果
#include<errno.h>
2 #include<sys/time.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 #include<errno.h>
6 #include<string.h>
7 #include<sys/resource.h>
8 #include<stdio.h>
9 #include<stdarg.h>
10
11 #if defined(MACOS)
12 #include<sys/syslimits.h>
13 #elif defined(SOLARIS)
14 #include<limits.h>
15 #elif defined(BSD)
16 #include<sys/param.h>
17 #endif
18 //elif else if = = !!
19 unsigned long long count;
20 struct timeval end;
21
//系统错误退出
22 void err_sys(char* s)
23 {
24 fprintf(stderr , "%s : %s \n" ,s , strerror(errno));
25 exit(1);
26 }
27
28 void checktime(char * str)
29 {
30 struct timeval tv;
31 gettimeofday(&tv , NULL); //获取格林威治时间
32
33 if(tv.tv_sec >= end.tv_sec && tv.tv_usec > end.tv_usec){
34 fprintf(stdout , "%s count = %ld getpid= %d \n" ,str , count ,getpid());
35 exit(0);
36 }
37 }
//一般错误退出
void err_quit(char * src , ...)
39 {
40 char buf[512] ={0};
41 va_list ap;
42 va_start(ap , src);
43 vsnprintf(buf , 511 , src , ap);
44 va_end(ap);
45 printf("%s \n " , buf);
46 exit(2);
47 }
48 int main(int argc ,char** argv)
49 {
50 pid_t pid;
51 char* s;
52 int nzero , ret ;
53 int adj = 0 ;
54 setbuf(stdout , NULL); //查阅了一下 应该是清除行缓存属性 让stdout有及时输出不带缓存得属性
55 #if defined(NZERO)
56 nzero = NZERO;
57 #elif defined(_SC_NZERO)
58 nzero = sysconf(_SC_NZERO); //获取系统nzero值
59 #else
60 #error NZERO undefined
61 #endif
62 printf(" NZERO = %d\n" , nzero);
63 if(argc == 2)
64 adj = strtol(argv[1] , NULL , 10); //把输入内容作为10制作转换成10进制 也有截取数字开头只获取数字的作用 不输出错误
65 gettimeofday(&end , NULL);
66 end.tv_sec+=10; //run for 10 seconds
67
68 if((pid = fork()) < 0){
69 err_sys("fork error");
70 }
71 else if(pid == 0){
72 s = "child";
73 printf("current nice value in child is %d , adjusting by %d " , nice(0) + nzero ,adj); //nice 的值为0
74 errno = 0;
75
76 if((ret = nice(adj)) == -1 && errno != 0)
77 err_sys("child set scheduling priority");
78 printf("child set nice value is %d\n" , (ret+nzero));
}else {
80 s = "parent";
81 printf("current nice value in parent is %d\n" , nice(0)+nzero);
82 }
83
84 for(;;){
85 if(++count == 0) //从这里体现出程序运行时间
86 err_quit("%s counter wrap" ,s);
87 checktime(s); //退出条件在里面 输出也在这其中
88 }
89 }
下面是输出结果
2 ot@xc p222]# ./a.out -20
3 NZERO = 20
4 current nice value in parent is 20
5 current nice value in child is 20 , adjusting by -20 child set nice value is 0
6 child count = 229870760 getpid= 5130
7 parent count = 208361304 getpid= 5129
8
9
10 ot@xc p222]# ps -xl
11 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
12
13 0 0 5129 3141 20 0 3920 436 - R+ pts/1 0:03 ./a.out -20
14 5 0 5130 5129 0 -20 3920 232 - R<+ pts/1 0:04 ./a.out -20
15
~
~
~
这里还有一个问题就是在多核心处理器上,体现并不是有那么大的差异,但还是有不同得。因为这是双核,只有两条进程。不能很好得体现。由于这是一个练习demo 并没有很好得程序设计
没有考虑进程回收问题
关于上面得问题可以自己根据以上代码自行修改,fork出3个进程,设置不同的nice值。在我的centos6.5 双核 2.6.32版本下 使用top命令查看cpu使用率nice值为1得只有9%左右
的cpu占有率而正常nice值得则达90%左右。nice影响还是很大的,这其中还涉及不同版本内核调度算法得问题,下面有一个很不错得文章可以读一读
链接:http://www.linuxidc.com/Linux/2016-05/131244.htm