关于APUE 图8-30 nice函数的例子

来源:互联网 发布:大庄家软件官网 编辑:程序博客网 时间:2024/04/29 11:26
#include "apue.h"//自定义重要头文件#include <dirent.h>//目录读取函数#include "myerror.h"//定义自定义出错打印函数#include <sys/wait.h>//进程等待处理#include <errno.h>//出错处理#include <signal.h>#include <fcntl.h>//文件IO操作头文件#include <unistd.h>//Symbolic Constants mode_t#include <sys/stat.h>#include <limits.h>#include "pathalloc.h"#include <sys/time.h>unsigned long long count;struct timeval end;void checktime(char *str){    struct timeval tv;    gettimeofday(&tv , NULL);    if( tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec){        printf("%s count = %lld\n" , str , count);//让程序运行10s就退出        exit(0);    }}int main(int argc , char *argv[]){    pid_t pid;    char *s;    int nzero , ret;    int adj = 0;    setbuf(stdout , NULL);    nzero = sysconf(_SC_NZERO);//nice默认一般是20    printf("NZERO = %d\n" , nzero);    if(argc == 2 )        adj = strtol(argv[1] , NULL , 10);    gettimeofday(&end , NULL);    end.tv_sec += 3;//让程序运行3s停止    if((pid = fork()) < 0)        err_sys("fork error");    else if(pid == 0){        s = "child";        printf("current nice value in child is %d , adjusting by %d\n"               ,nice(0)+nzero , adj );        errno = 0;//清0,好检查这个返回值.        if((ret = nice(adj)) == -1 && errno != 0)            err_sys("child set scheduling pri");        printf("now child nice is %d\n",ret + nzero );//nice函数调用成功返回adj的数值。如adj=3,那么返回3,进程新的nice值等于原来nice值+3;如adj=20,那么返回19,因为nice最大为39 = 2*NZERO-1     }else{        s = "paren";        printf("current nice value in parent is %d\n"               ,nice(0)+nzero);    }    for(;;){        if( ++count == 0)            err_quit("%s counter wrap" , s);        checktime(s);    }}//由此证明Ubuntu上nice数值对进程调度优先级影响并不是那么大.//两个进程做着同样的事情,但是让他们的nice数值不同,这可以比较他们的调度次数,哪个多.那么就是优先级高
  • 执行./apue 输出:
    NZERO = 20
    current nice value in parent is 20
    current nice value in child is 20 , adjusting by 0
    now child nice is 20
    child count = 30094192
    paren count = 30188723
    可以得出,nice相同时候进程调度次数差不多。
  • 执行./apue 20 输出:
    NZERO = 20
    current nice value in parent is 20
    current nice value in child is 20 , adjusting by 20
    now child nice is 39
    child count = 29550495
    paren count = 29476920
    可以得出,nice不同时进程调度次数同样差不多,父子进程占用cup资源也差不多,和APUE上面的运行结果很不一样。正常此种情况会因为子进程nice过大,优先级降低,count数值应该小很多。这就出现了问题,需要深入内核看看真正的进程调度策略才可知晓,立个flag,以后深入内核调度,回来解决这个问题。

未完待续…………………

原创粉丝点击