一、实验步骤
1、在文档右边的虚拟化操作系统中,打开桌面的 Xfce 终端,输入cd Desktop
2、输入touch 4-1.c
3、输入gedit 4-1.c
4、在 gedit 里面输入源代码,点击 save 保存
5、关掉 gedit 编辑器
6、输入gcc -o 4-1 4-1.c
7、在桌面的 Xfce 终端继续输入命令./4-1
8、按要求输入并运行,观察结果
9、理解与分析源代码,反复调试运行
10、按要求修改程序,增加时间片轮转调度法
11、修改程序:将时间片改为2
二、实验结果
三、实验改进
1、增加时间片轮转调度法;时间片为1;进程运行一次后直接挂入就绪队列队尾。
修改的程序代码:
1)增加函数insert2/轮转法的插入算法,直接插入就绪队列的队尾/ insert2(PCB q)
{
PCB *p1,*s,*r;
int b;
s=q;
p1=ready;
r=p1;
while (p1!=NULL)
{
r=p1;
p1=p1->next;
}
r->next=s;
s->next=NULL;
}
2)增加函数create2/轮转法创建初始PCB信息
void create2(char alg)
{
PCB p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("输入进程号和运行时间:n");
for(i=1;i<=N;i++)
{
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->count=0;
p->round=1;
if(ready!=NULL)
insert2(p);
else
{
p->next=ready;
ready=p;
}
}
//clrscr();
printf("
printf("****n");
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
3)增加函数roundrun/轮转片调度算法
roundrun(char alg)
{
while(run!=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
if(run->needtime==0)
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL)
firstin();
}
else
if (ready!=NULL)
{
run->state='W';
insert2(run);
firstin();
}
prt(alg);
}
}
4)修改主函数
main()
{
char algo;
//clrscr();
printf("选择算法:P/R(优先数算法/时间片轮转算法)n");
scanf("%c",&algo);
//algo='p';
printf("输入进程数:n");
scanf("%d",&N);
if(algo=='P'||algo=='p')
{
create1(algo);
priority(algo);
}
else
if(algo=='R'||algo=='r')
{
create2(algo);
roundrun(algo);
}
}
2、修改程序:将时间片改为2。
p->round=1改为:p->round=2
52792965