首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

高分求解释一道操作系统的实验题,想的小弟我蛋疼啊求解释

2012-06-05 
高分求解释一道操作系统的实验题,想的我蛋疼啊,求解释说明:这是我们操作系统的一道实验题,是关于进程调度

高分求解释一道操作系统的实验题,想的我蛋疼啊,求解释
说明:这是我们操作系统的一道实验题,是关于进程调度算法的,以下是老师给出的一道参考程序:

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <sched.h>#include <sys/resource.h>#include <sys/time.h>#include <unistd.h>int main(int argc,char *argv[]) {    int i;    int pid[3];    struct sched_param p[3];    for(i=0;i<3;i++) {        if((pid[i] = fork()) > 0) {            p[i].sched_priority = (argv[i+1] != NULL)?atoi(argv[i+1]):10;            //调试代码            if(argv[i+4] != NULL) {                printf("here!---%d\n",atoi(argv[i+4]));            }            sched_setscheduler(pid[i],(argv[i+4] != NULL) ? atoi(argv[i+4]):SCHED_OTHER,&p[i]);            setpriority(PRIO_PROCESS,pid[i],(argv[i+1] != NULL) ? atoi(argv[i+1]):10);            //测试代码            if(argv[i+1] != NULL) {                printf("priority is %d\n",atoi(argv[i+1]));            }        }else {            sleep(1);            for(i=0;i<10;i++) {                printf("CHild PID= %d priotity = %d\n",getpid(),getpriority(PRIO_PROCESS,0));                sleep(1);            }            exit(EXIT_SUCCESS);        }    }    printf("My child %d policy is %d\n",pid[0],sched_getscheduler(pid[0]));    printf("My child %d policy is %d\n",pid[1],sched_getscheduler(pid[1]));    printf("My child %d policy is %d\n",pid[2],sched_getscheduler(pid[2]));    return(0);}

这个程序实现的结果是父进程创建三个子进程,然后通过传递六个参数分别指定每个进程的进程调度策略和优先级,我传递的参数为5 18 -10 0 0 1,运行结果如下:
here!---0
priority is 5
here!---0
priority is 18
here!---1
priority is -10
My child 5181 policy is 0
My child 5182 policy is 0
My child 5183 policy is 0
CHild PID= 5181 priotity = 5
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5182 priotity = 18
CHild PID= 5181 priotity = 5
CHild PID= 5183 priotity = 0
CHild PID= 5181 priotity = 5
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5181 priotity = 5
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5181 priotity = 5
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5181 priotity = 5
CHild PID= 5183 priotity = 0
CHild PID= 5182 priotity = 18
CHild PID= 5181 priotity = 5
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5181 priotity = 5
CHild PID= 5183 priotity = 0
CHild PID= 5182 priotity = 18
CHild PID= 5183 priotity = 0
CHild PID= 5182 priotity = 18
CHild PID= 5181 priotity = 5
CHild PID= 5183 priotity = 0
CHild PID= 5182 priotity = 18
CHild PID= 5181 priotity = 5


我不明白的问题有两个:
1.明明优先级我设了个-10,但是在执行的时候却没有-10的,变成了0!
2.进程调度策略我设置了 0 0 1,前两个表示默认的,第三个表示FIFO,但是在最开始的时候,显示三个child的策略都是默认的啊,中么回事啊,亲?
备注:我调试的时候把参数打印出来,优先级是有-10的啊,是不是setpriority方法哪里有错啊!!
求帮忙啊。

[解决办法]
if((pid[i] = fork()) > 0) {

你设置的是父进程的, 从来没设置过子进程的。
[解决办法]
有两份PID数据,你设置的是父进程中数据,没有设置子进程
[解决办法]
fork()父进程返回子进程pid,子进程返回0
[解决办法]
子进程里面只打印,没设置,看看else分支里面的代码
[解决办法]
1楼正解
!!!!!

热点排行