当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由nice值决定的、nice值越小,优先级越高。可以看做越友好那么调度优先级越低。进程可以通过nice函数获取更改它的nice值,进程只能影响自己的nice值,不能影响其他进程的nice值

#include <unistd.h>

int nice(int incr)

incr参数被增加到调用进程的nice值上,如果nice值太大,系统直接将它降到最大合法值。

可以通过nice命令来查看系统的默认nice值。一般都是为0

root@zhf-maple:/home/zhf/桌面# nice

0

使用ps -l也可以查看当前进程的nice值。NI就是nice值

root@zhf-maple:/home/zhf/桌面# ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0  6678  6668  0  80   0 - 15612 wait   pts/0    00:00:00 su

4 S     0  6679  6678  0  80   0 -  5850 wait   pts/0    00:00:00 bash

4 R     0  6900  6679  0  80   0 -  8809 -      pts/0    00:00:00 p

下面的这个程序我们通过改变2个并行运行进程的nice值,运行程序10秒,期间对各个进程进行计数。最后统计进程的计数值

unsigned long long count;  #设置全局变量进行进程的计数

struct timeval end;

#checktime判断进程的运行时间

void checktime(char *str){

struct timeval tv;

gettimeofday(&tv,NULL);

if (tv.tv_sec >  end.tv_sec && tv.tv_sec >= end.tv_usec){

printf("%s count =%lld\n",str,count);

exit(0);

}

}

void schedule_try(){

pid_t pid;

char *s;

int adj=0;

int ret;

int nzero=20;

gettimeofday(&end,NULL);

end.tv_sec+=10;

if((pid=fork()) == 0){

s="child";

printf("current nice value in child is %d,adjusting by %d\n",nice(0)+nzero,adj);

ret=nice(adj);

printf("now child nice value is %d\n",ret+nzero);

}

else{

s="parent";

printf("current nice value in parent is %d\n",nice(0)+nzero);

}

for(;;){

if (++count == 0)

printf("error occured");

checktime(s);

}

}

首先设置adj也就是nice值的调整量为0.此时父子进程的nice值都为20.

运行结果如下:可以看到由于父子进程的nice都为20.因此在10秒内父子进程的计算基本上差不多。可以认为父子进程占用了相同的CPU资源。

除了nice函数,我们还可以通过getpriority/setpriority函数来获取和设置进程的优先级

#include <sys/resource.h>

int getpriority(int which, int who);

int setpriority(int which,int who,int value);

1、PRIO_PROCESS,一个特定的进程,此时who的取值为进程ID

2、PRIO_PGRP,一个进程组的所有进程,此时who的取值为进程组的ID

3、PRIO_USER,一个用户拥有的所有进程,此时who的取值为实际用户ID

getpriority的用法:

void schedule_try2(){

pid_t pid;

int prio;

pid=fork();

if (pid == 0){

prio=getpriority(PRIO_PROCESS,getpid());

printf("The priority of child is %d\n",prio);

}

}

所以nice函数也可以用getpriority和setpriority来实现

int  nice( int  increment)

{  

 int oldprio = getpriority( PRIO_PROCESS,  getpid());

 return setpriority(PRIO_PROCESS, getpid(), oldprio + increment);

}

最新文章

  1. C#获取json字符串指定的值
  2. MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet(转载)
  3. CodeForces Round 198
  4. poj 1985 Cow Marathon 树的直径
  5. java中对浮点数精度的处理DecimalFormat
  6. easyui返回数据类型
  7. Delphi NativeXml用法攻略
  8. TEA加密算法的文件加密和解密的实现
  9. TinyXML用法小结
  10. HDU 5834 Magic boy Bi Luo with his excited tree
  11. KMP算法学习(详解)
  12. 201521123059 《Java程序设计》第十二周学习总结
  13. MySQL数据库基础(一)(启动/停止、登录/退出、语法规范及最基础操作)
  14. 附近的人,附近的卖家(geohash+前缀树)
  15. 电子产品使用感受之——为什么我那么喜欢2015年的11.6寸MacBook Air?
  16. Centos配置tomcat服务并且开机自启动
  17. POJ 1964&HDU 1505&HOJ 1644 City Game(最大0,1子矩阵和总结)
  18. Java打印整数的二进制表示(代码与解析)
  19. JS操作CSS随机改变网页背景
  20. [hadoop]hadoop学习路线

热门文章

  1. 我攻克了oom
  2. java计算时间差 Java问题通用解决代码
  3. xml格式发送
  4. angularjs中的时间格式化过滤
  5. 解决ubuntukylin 13.10安装wine时无法解决软件包依赖问题
  6. 第八章 委托,lamdbda 表达式和事件
  7. xml初学简单介绍
  8. 【安装.net framework4.0】之安装失败,“安装时发生严重错误”
  9. 中国版Office 365混合部署功能
  10. python selenium2示例 - email发送