linux下关于进程优先级

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值