进程调度课程设计.docx
- 文档编号:2237485
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:15
- 大小:280.99KB
进程调度课程设计.docx
《进程调度课程设计.docx》由会员分享,可在线阅读,更多相关《进程调度课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
进程调度课程设计
进程调度算法的模拟
1设计目的
同时通过用C语言编程实现进程调度的算法,更好地掌握操作系统的原理及实现方法
2任务及要求
2.1用语言来实现对n个进程采用不同调度算法的进程调度。
2.2.每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
(1)进程编号ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。
(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。
(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。
(4)进程总共需要运行时间Alltime,利用随机函数产生。
(5)进程状态,0:
就绪态;1:
运行态;2:
阻塞态。
(6)队列指针next,用来将多个进程控制块PCB链接为队列。
2.3.优先数改变的原则
(1)进程在就绪队列中每呆一个时间片,优先数增加1。
(2)进程每运行一个时间片,优先数减3。
2.4.在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。
3算法及数据结构
3.1算法的整体思想
对于先到先服务算法,只需要给定每个进程的进程号,然后依次顺序执行就可以了。
对于SJF(最短作业优先)调度算法需要判断作业的alltime时间,alltime最小的最先执行,依次按照时间的从小到大执行进程。
对于优先度调度算法,需要先判断优先度的大小,优先度最大的先执行,进程运行完毕以后,按照优先数的改变的原则进行改变,然后继续判断所有的优先数的大小,依旧是优先数最大的先执行,直到执行完毕。
对于RR时间片轮转调度算法,需要依次执行时间片用完即阻塞,转交给下一个进程执行,直到所有进程运行完毕。
3.2先到先服务(FCFS)算法模块
3.2.1功能
模拟进程的先到先服务调度算法,按照进程编号依次运行。
3.2.2数据结构
voidFCFS()
3.2.3算法
voidFCFS()
{
inti=1;
PCB*p,*temp;
while(IsAllFinish()==false)
{
for(p=head->next;p!
=NULL;p=p->next)//寻找状态为ready的第一个进程
{
if(p->status==ready)
{
temp=p;
break;
}
}
if(p==NULL)
return;
for(p=temp->next;p!
=NULL;p=p->next)//寻找到达时间最短的进程
{
if(p->status==ready)
{
if(p->arrive_time
temp=p;
else
if(p->arrive_time==temp->arrive_time)
{
if(p->priority>temp->priority)
temp=p;
}
}
}
temp->status=running;
temp->cpu_time=temp->all_time;
printf("\n第%d步:
\n\n",i++);
output();
temp->status=finish;
}
}
3.3最短作业优先(SJF)算法模块
3.3.1功能
将每个进程与其下一个CPU区间段相关联。
当CPU为可用时,它会赋给具有最短后续CPU区间的进程。
如果两个进程具有同样长度的CPU区间,那么可以使用FCFS调度来处理
3.3.2数据结构
voidSJF()
3.3.3算法
voidSJF()
{
inti=1;
PCB*p,*temp;
temp=head->next;
for(p=temp->next;p!
=NULL;p=p->next)
{
if(p->arrive_time
temp=p;
elseif(p->arrive_time==temp->arrive_time)
{
if(p->priority>temp->priority)
temp=p;
}
}
temp->status=running;
temp->cpu_time=temp->all_time;
printf("\n第%d步:
\n\n",i++);
output();
temp->status=finish;
while(IsAllFinish()==false)
{
for(p=head->next;p!
=NULL;p=p->next)
{
if(p->status==ready)
{
temp=p;
break;
}
}
if(p==NULL)
return;
for(p=temp->next;p!
=NULL;p=p->next)
{
if(p->status==ready)
{
if(p->all_time
temp=p;
elseif(p->all_time==temp->all_time)
{
if(p->priority>temp->priority)
temp=p;
}
}
}
temp->status=running;
temp->cpu_time=temp->all_time;
printf("\n第%d步:
\n\n",i++);
output();
temp->status=finish;
}
}
3.4优先级调度算法模块
3.4.1功能
1.每个进程被赋予一个优先级数字(优先权)
2.CPU分配给优先权高的进程(优先级数字越小,则优先权越大)
3.4.2数据结构
voidPS()
3.4.3算法
voidPS()
{
inti=1;
PCB*p,*temp;
temp=head->next;
for(p=temp->next;p!
=NULL;p=p->next)
{
if(p->arrive_time
temp=p;
elseif(p->arrive_time==temp->arrive_time)
{
if(p->priority>temp->priority)
temp=p;
}
}
temp->status=running;
temp->cpu_time=temp->all_time;
printf("\n第%d步:
\n\n",i++);
output();
temp->status=finish;
while(IsAllFinish()==false)
{
for(p=head->next;p!
=NULL;p=p->next)
{
if(p->status==ready)
{
temp=p;
break;
}
}
if(p==NULL)
return;
for(p=temp->next;p!
=NULL;p=p->next)
{
if(p->status==ready)
{
if(p->priority>temp->priority)
temp=p;
elseif(p->priority==temp->priority)
{
if(p->arrive_time
temp=p;
}
}
}
temp->status=running;
temp->cpu_time=temp->all_time;
printf("\n第%d步:
\n\n",i++);
output();
temp->status=finish;
}
}
3.5时间片段轮转算法模块
3.5.1功能
如果就绪队列中有n个进程,且时间片为q,则每个进程会得到1/n的CPU时间,每个长度不超过q时间单元。
每个进程必须等待CPU的时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止
3.5.2数据结构
voidRR()
3.5.3算法
voidRR()
{
inti=1;
PCB*p,*temp;
while(IsAllFinish()==false)
{
for(p=head->next;p!
=NULL;p=p->next)
{
if(p->status==ready)
{
if(p->cpu_time+4<=p->all_time)
p->cpu_time+=4;
else
p->cpu_time=p->all_time;
p->status=running;
p->priority-=3;
for(temp=head->next;temp!
=NULL;temp=temp->next)
{
if(temp->status==ready)
p->priority+=1;
}
printf("\n第%d步:
\n\n",i++);
output();
if(p->cpu_time==p->all_time)
p->status=finish;
else
p->status=ready;
}
}
}
}
3.6主函数模块
3.6.1功能
用于程序与用户的交互操作,由用户选择模拟实验的算法,并执行相应的算法
3.6.2数据结构
voidmain()
3.6.3算法
voidmain()
{
printf("*********选择调度算法**************\n");
printf("***********************************\n");
printf("**1、先到先服务***\n");
printf("**2、最短作业优先调度***\n");
printf("**3、优先级调度***\n");
printf("**4、轮转法调度***\n");
printf("**0、推出***\n");
printf("***********************************\n");
intflag;
PCB*p;
printf("请选择:
");
scanf("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)