报告模板101张三102李四进程模拟调度程序.docx
《报告模板101张三102李四进程模拟调度程序.docx》由会员分享,可在线阅读,更多相关《报告模板101张三102李四进程模拟调度程序.docx(18页珍藏版)》请在冰豆网上搜索。
报告模板101张三102李四进程模拟调度程序
东莞理工学院城市学院
《操作系统》课程设计
题目:
进程调度模拟程序
专业:
软件工程
年级:
2012级班
小组成员:
张三、李四
指导教师:
彭义春老师
时间:
2014.12.22—2014.12.24
地点:
图书馆T604
东莞理工学院城市学院计算机与信息科学系制
2014年12月
摘要
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致他们互相争夺处理机。
另外,系统进程也同样需要使用处理机。
但是处理机在某一时刻只能执行一个进程,这就引入了进程调度这一机制!
进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
进程调度的主要功能是按照一定的策略选择一个处于就绪状态的进程,使其获得处理机执行。
应根据不同的系统设计目的,选择最佳合适的饿进程调度算法。
常用的进程调度算法有:
先来先服务调度算法,优先级调度算法,时间片轮转算法!
目录
1.概述4
2.课程设计任务及要求5
2.1设计任务5
2.2设计要求5
3.算法及数据结构6
3.1算法的总体思想6
3.2数据结构模块8
3.3进程的初始化模块9
3.4优先级调度算法模块10
3.5时间片轮转调度模块10
3.6先来先服务(FCFS)模块11
3.7主函数模块11
4.程序设计与实现13
4.1程序流程图13
4.2程序代码(要注释)13
4.3实验结果15
5.结论18
6.收获、体会和建议19
7.参考文献20
1.概述
在多道程序环境下,主存仲有着多个进程,其数目往往多于处理机数目,要使这多个进程哪能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。
分配处理机的任务是有处理机调度程序完成的。
由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。
2.课程设计任务及要求
2.1设计任务
编写一个进程调度程序,允许多个进程共享进程调度程序。
分工:
叶东山:
查找资料,编写最高优先数优先的调度算法和时间片轮转调度算法。
遇到问题的时候跟同伴讨论一下,或请教其他的同学,实现以上的算法。
根据老师的要求来修改程序。
黎佩珊:
查找相关资料,然后编写先来先服务和主函数的算法。
实现到算法之后,再和东山的合并,得到整体的程序。
提出要进一步修改反面的内容,协助东山一起修改程序。
2.2设计要求
进程调度算法:
采用
(1)最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),
(2)时间片轮转法,(3)先来先服务算法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数、到达时间、时间片以及需要的运行时间由随机数产生。
3.算法及数据结构
3.1算法的总体思想
图1-1优先级调度算法流程图
图1-2时间轮转法进程调度算法流程
图1-3先来先服务调度算法流程图
3.2数据结构模块
3.2.1功能
进程的结构体声明与函数的声明
3.2.2数据结构
structProcess{
intid;//进程名标识
charNAME[9];//进程标识符
intPRIO;//进程优先数
intSERVICETIME;//服务时间
intSERVICETIME2;//服务时间
intARRIVETIME//到达时间
intBEGINTIME;//开始时间
intCOUNT;//计数器
intFINISHTIME;//完成时间
intNEEDTIME;//进程到完成还要的CPU时间
intROUND;//进程轮转时间片
floatTURNTIME;//周转时间
floatPTURNTIME;//带权周转时间
charSTATE;//进程的状态
structProcess*next;//链指针
};
3.3进程的初始化模块
3.3.1功能
用于由用户输入进程数以后,对进程的初始化,并利用随机函数,随机生产进程的优先数、到达时间、服务时间。
3.3.2数据结构
voidinput(Processp[])//输入进程个数然后产生随机数
3.3.3算法
voidinput(Processp[])
{
//printf("\n请输入进程个数(0");
//scanf("%d",&NUMBER);
intt=1;
while(t==1)//判断输入的进程个数以及输入形式是否正确
{
printf("\n请输入进程个数(0");
scanf("%d",&NUMBER);
if(NUMBER>=0&&NUMBER<=50&&getchar()=='\n')
{break;}
else
{printf("输入有误!
请重新输入!
\n");
setbuf(stdin,NULL);//清除缓存
}
}
printf("\n");
for(inti=0;i{p[i].id=i+1;
printf("\t进程名:
pro%d",i);
p[i].ARRIVETIME=(int)(20.0*rand()/(RAND_MAX+200.0));//随机产生NUMBER个到达时间
printf("\t到达时间:
%d",p[i].ARRIVETIME);
p[i].SERVICETIME=(int)(40.0*rand()/(RAND_MAX+200.0));//随机产生NUMBER个服务时间
printf("\t服务时间:
%d\n",p[i].SERVICETIME);
p[i].SERVICETIME2=p[i].SERVICETIME;
printf("\n");
}
PAN=(int)(40.0*rand()/(RAND_MAX+200.0));//随机产生时间片大小
printf("\t时间片大小:
\t%d\n",PAN);
}
3.4优先级调度算法模块
3.4.1功能
1.每个进程被赋予一个优先级数字(优先权)
2.CPU;分配给优先权高的进程(优先级数字越小,则优先权越大)
3.4.2数据结构
voidPRIORITY(Processp[])//优先级别调度算法
3.4.3算法
/*优先级调度算法*/的部分代码
voidPRIORITY(Processp[]){//优先级优先调度
inti,j,min;
intb=0,z;
floatsum1,sum2;
min=p[0].ARRIVETIME;
for(j=NUMBER-1;j>=0;j--){
for(i=0;ip[i].PRIO=(int)(30.0*rand()/(RAND_MAX+200.0));//进程优先数
if(p[i].ARRIVETIME>p[i+1].ARRIVETIME){//根据按到达时间排序
3.5时间片轮转调度模块
3.5.1功能
如果就绪队列中有n个进程,且时间片为q,则每个进程会得到1/n
的CPU时间,每个长度不超过q时间单元。
每个进程必须等待CPU的时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止。
3.5.2数据结构
voidROUNDSCH(Processp[])//时间片轮转法
3.5.3算法
/*RR时间片调度算法*/的部分代码
voidROUNDSCH(Processp[])//时间片轮转调度
{inti,j,k,min,time;
floatsum1,sum2;
boolflag=true;
for(j=NUMBER-1;j>=0;j--)//对随机产生的进程进行排序以到达时间从小到大排序
{
for(i=0;i{
if(p[i].ARRIVETIME>p[i+1].ARRIVETIME)//如果第i个进程到达时间大于第i+1个
{
min=p[i].ARRIVETIME;//将第i个跟第i+1个进程的到达时间调换
3.6先来先服务(FCFS)模块
3.6.1功能
模拟进程的先到先服务调度算法,按照进程编号一次运行。
3.6.2数据结构
voidFCFS(Processp[])//先来先服务调度算法
3.6.3算法
/**先来先服务算法**/的部分代码
voidFCFS(Processp[]){
inti,j,min;
floatsum1,sum2;
for(j=NUMBER-1;j>=0;j--){
for(i=0;iif(p[i].ARRIVETIME>p[i+1].ARRIVETIME)//比较谁先来到时间小者先到则先服务
3.7主函数模块
3.7.1功能
用于程序与用户的交互操作,由用户选择模拟实验的算法,并执行相应的算法。
3.7.2数据结构
main()//主函数
3.7.3算法
intmain(){
intt=1;
intn;
input(p);
printf("\n\n");
while(t==1)//循环选择输入界面
{printf("\t请选择调度算法:
\n\n");
printf("\t1.先到先服务\n\n\t2.时间片轮转法\n\n\t3.优先级优先调度\t\n\n\t0.退出\n\n");
while(t==1)
{printf("请选择调度算法:
");
scanf("%d",&n);
if(n>=0&&n<=3&&getchar()=='\n')//判断如果输入的数字在0-3内则跳出循环
{break;}
else//重新输入
{printf("输入有误!
请重新输入!
\n");
setbuf(stdin,NULL);
}
}
switch(n)//选择算法程序{
case1:
//FCFS算法调度
printf("\n以下是先到先服务调度:
");
FCFS(p);break;
case2:
//时间片轮转调度
printf("\n以下是时间片轮转调度:
(时间片大小PAN=%d)",PAN);
ROUNDSCH(p);break;
case3:
//优先级别调度
printf("\n以下是优先级优先调度:
");
PRIORITY(p);break;
case0:
exit(0);//退出
}
printf("按任意键继续进行....\n");
getchar();
t=1;
}}
4.程序设计与实现
4.1程序流程图
图2-1主程序流程图
4.2程序代码
#include
#include
#include
#include
#defineN50
intNUMBER;//进程个数
intPAN;//时间片大小
structProcess
{
intid;
charNAME[9];//进程标识符
intPRIO;//进程优先数
intSERVICETIME;//服务时间
intSERVICETIME2;//服务时间
intARRIVETIME;//到达时间
intBEGINTIME;//开始时间
intCOUNT;//计数器
intFINISHTIME;//完成时间
intNEEDTIME;//进程到完成还要的CPU时间
intROUND;//进程轮转时间片
floatTURNTIME;//周转时间
floatPTURNTIME;//带权周转时间
charSTATE;//进程的状态
structProcess*next;//链指针
};
Processp[N];
voidinput(Processp[])
{
intt=1;
while(t==1)//判断输入的进程个数以及输入形式是否正确
{
printf("\n请输入进程个数(0");
scanf("%d",&NUMBER);
if(NUMBER>=0&&NUMBER<=50&&getchar()=='\n')
{
break;
}
else
{
printf("输入有误!
请重新输入!
\n");
setbuf(stdin,NULL);//清除缓存
}
}
printf("\n");
for(inti=0;i{
p[i].id=i+1;
printf("\t进程名:
pro%d",i);
p[i].ARRIVETIME=(int)(20.0*rand()/(RAND_MAX+200.0));//随机产生NUMBER个到达时间
printf("\t到达时间:
%d",p[i].ARRIVETIME);
p[i].SERVICETIME=(int)(40.0*rand()/(RAND_MAX+200.0));//随机产生NUMBER个服务时间
printf("\t服务时间:
%d\n",p[i].SERVICETIME);
p[i].SERVICETIME2=p[i].SERVICETIME;
printf("\n");
}
PAN=(int)(40.0*rand()/(RAND_MAX+200.0));//随机产生时间片大小
printf("\t时间片大小:
\t%d\n",PAN);
}
voidROUNDSCH(Processp[])//时间片轮转调度
{
inti,j,k,min,time;
floatsum1,sum2;
boolflag=true;
for(j=NUMBER-1;j>=0;j--)//对随机产生的进程进行排序以到达时间从小到大排序
p[0].BEGINTIME=p[0].ARRIVETIME;//把第0个进程的到达时间赋给开始时间
if(p[0].SERVICETIME%PAN==0){//若果第0个进程服务的时间是时间片的倍数
p[0].COUNT=p[0].SERVICETIME/PAN;//把执行的次数赋给计数器
p[0].FINISHTIME=p[0].COUNT*NUMBER*PAN;//计算完成时间
voidFCFS(Processp[])//先到先服务调度
{
inti,j,min;
floatsum1,sum2;
for(j=NUMBER-1;j>=0;j--)
voidPRIORITY(Processp[])//优先级优先调度
{
inti,j,min;
intb=0,z;
floatsum1,sum2;
min=p[0].ARRIVETIME;
for(j=NUMBER-1;j>=0;j--)
intmain()//主函数
{
intt=1;
intn;
input(p);
printf("\n\n");
while(t==1)//循环选择输入界面
4.3实验结果
(1)进程初始化:
(2)先来先服务调度算法
(3)时间片轮转调度算法:
(4)优先级调度算法:
5.结论
高优先级,系统将处理机让给优先级高的进程先运行,此处采用抢占方式,由于具有降低优先级的任务长时间占用共享资源,造成申请该资源的优先级最高的进程始终处于等待状态,此时其他比占用资源优先级高但比等待资源进程优先级低的进程将获得处理器的使用权,并先于优先级最高的处于等待状态的进程先结束。
时间片轮转调度是最公平的一种算法,保证系统有合理的响应时间,系统将所有的就绪进程按先来先服务算法的原则,排成一个队列,每次调度时,系统把处理机分配给队列首进程,并让其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序根据这个请求停止该进程的运行,将它送到就绪队列的末尾,再把处理机分给就绪队列中新的队列首进程,同时让它也执行一个时间片。
先来先服务FCFS进程调度算法采用非抢占方式,实现方法比较简单,按照先后顺序来执行,比较有利于长进程,而不利于短进程。
6.收获、体会和建议
张三。
XXXXXXXXXXXXXXXXXXXXXXX(每个人至少200字)
李四。
XXXXXXXXXXXXXXXXXXXXXXX
7.参考文献
[1]李善平等.Linux操作系统及实验教程[M].机械工业出版社,1999.10。
[2]刘乃琦,蒲晓蓉;操作系统原理、设计及应用[M].北京;高等教育出版社2008.5。
[3]黄廷辉,陈智勇,许倩霞;《操作系统原理》课程改革初探[J];桂林电子工业学院学报;2002
[4]陈淑燕,温小玲;随机函数在操作系统实验中的应用[J];实验技术与管理;2002年02。
[5]RichardStallman&RolandPesch&StanShebs,DebuggingwithGDB[EB/OL],http:
//www.gnu.org/manua,2004。