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