q=(pcb*)malloc(sizeof(pcb));
scanf("%s",q->name);
scanf("%d",&q->needtime);
q->cputime=0;
q->count=0;
q->process=ready;
q->next=NULL;
if(i==0){
p=q;
t=q;
}
else{
t->next=q;
t=q;
}
i++;
}
returnp;
}
voidcpu_round(pcb*q){
if(q->needtime==1)
q->cputime++;
else
q->cputime+=2;
q->needtime-=2;
if(q->needtime<0){
q->needtime=0;
}
q->count++;
q->process=execute;
}
pcb*get_next(pcb*k,pcb*head){
pcb*t;
t=k;
do{
t=t->next;
}while(t&&t->process==finish);
if(t==NULL){
t=head;
while(t->next!
=k&&t->process==finish){
t=t->next;}}
returnt;}
voidset_state(pcb*p){
while(p){
if(p->needtime==0){
p->process=finish;
}
if(p->process==execute){
p->process=ready;}
p=p->next;}}
voiddisplay_round(pcb*p){
printf("namecputimeneedtimecountstate\n");
while(p){
printf("%s",p->name);
printf("");
printf("%d",p->cputime);
printf("");
printf("%d",p->needtime);
printf("");
printf("%d",p->count);
printf("");
switch(p->process){
caseready:
printf("ready\n");break;
caseexecute:
printf("execute\n");break;
caseblock:
printf("block\n");break;
casefinish:
printf("finish\n");break;}
p=p->next;}}
voidround_cal(){
pcb*p;
pcb*r;
p=get_process_round();
intcpu=0;
r=p;
while(!
process_finish(p)){
if(r->needtime==1)
cpu+=1;
else
cpu+=2;
cpu_round(r);
r=get_next(r,p);
printf("cputime:
%d\n",cpu);
display_round(p);
set_state(p);
sleep
(2);}
free_process(p);}
main(){
display_menu();
intk;
scanf("%d",&k);
switch(k){
case1:
priority_cal();break;
case2:
round_cal();break;
case3:
break;
default:
printf("YOUHAVENOTCHOOSEANYALGORITHM!
\n");
}
}
运行后结果如下:
[root@rhel5hbzy~]#gcc-ochulijichuliji.c
[root@rhel5hbzy~]#./m
CHOOSETHEALGORITHM:
1PRIORITY
2ROUNDROBIN
3EXIT
1
inputnameandtime
jing2
aaaa8
bbbb5
ffff4
ggg6
cputime:
1
namecputimeneedtimeprioritystate
jing-1145execute
aaaa*0842ready
bbbb20050finish
ffff20050finish
ggg0644ready
rtyucputime:
2
namecputimeneedtimeprioritystate
jing*2042execute
aaaa*0842ready
bbbb20050finish
ffff20050finish
ggg0644ready
5cputime:
3
namecputimeneedtimeprioritystate
jing*2042finish
aaaa*0842ready
bbbb20050finish
ffff20050finish
ggg1541execute
2cputime:
4
namecputimeneedtimeprioritystate
jing*2042finish
aaaa'1739execute
bbbb20050finish
ffff20050finish
ggg1541ready
cputime:
5
namecputimeneedtimeprioritystate
jing*2042finish
aaaa'1739ready
bbbb20050finish
ffff20050finish
ggg2438execute
cputime:
6
namecputimeneedtimeprioritystate
jing*2042finish
aaaa$2636execute
bbbb20050finish
ffff20050finish
ggg2438ready
cputime:
7
namecputimeneedtimeprioritystate
jing*2042finish
aaaa$2636ready
bbbb20050finish
ffff20050finish
ggg3335execute
cputime:
8
namecputimeneedtimeprioritystate
jing*2042finish
aaaa!
3533execute
bbbb20050finish
ffff20050finish
ggg3335ready
cputime:
9
namecputimeneedtimeprioritystate
jing*2042finish
aaaa!
3533ready
bbbb20050finish
ffff20050finish
ggg4232execute
cputime:
10
namecputimeneedtimeprioritystate
jing*2042finish
aaaa4430execute
bbbb20050finish
ffff20050finish
ggg4232ready
cputime:
11
namecputimeneedtimeprioritystate
jing*2042finish
aaaa4430ready
bbbb20050finish
ffff20050finish
ggg5129execute
cputime:
12
namecputimeneedtimeprioritystate
jing*2042finish
aaaa5327execute
bbbb20050finish
ffff20050finish
ggg5129ready
cputime:
13
namecputimeneedtimeprioritystate
jing*2042finish
aaaa5327ready
bbbb20050finish
ffff20050finish
ggg6026execute
cputime:
14
namecputimeneedtimeprioritystate
jing*2042finish
aaaa6224execute
bbbb20050finish
ffff20050finish
ggg6026finish
3
cputime:
15
namecputimeneedtimeprioritystate
jing*2042finish
aaaa7121execute
bbbb20050finish
ffff20050finish
ggg6026finish
cputime:
16
namecputimeneedtimeprioritystate
jing*2042finish
aaaa8018execute
bbbb20050finish
ffff20050finish
ggg6026finish
Allprocesseshavefinished
[root@rhel5hbzy~]#rtyu2
bash:
rtyu2:
commandnotfound
[root@rhel5hbzy~]#3
bash:
3:
commandnotfound
三、分析与体会
多道程序设计中,通常是若干个进程同时处于就绪状态,必须依照某种策略来决定哪个进程优先占有处理机。
因而引起进程调度。
本实验模拟单处理机情况下的处理机调度问题,使我加深了对进程调度的理解。
通过本次试验,使我加深了对进程调度的具体细节的理解,掌握LINUX系统结构、实现处理机和各种典型的算法,系统了解了操作系统的设计和实验思路,动手能力更强了。