linux c编程:进程控制(四)进程调度

当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由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

扫描二维码关注公众号,回复: 971584 查看本文章

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);

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

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

3PRIO_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函数也可以用getprioritysetpriority来实现

int  nice( int  increment)

{  

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

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

}

猜你喜欢

转载自www.cnblogs.com/zhanghongfeng/p/9069398.html