模拟实现进程调度算法.doc
- 文档编号:584438
- 上传时间:2023-04-29
- 格式:DOC
- 页数:10
- 大小:161.50KB
模拟实现进程调度算法.doc
《模拟实现进程调度算法.doc》由会员分享,可在线阅读,更多相关《模拟实现进程调度算法.doc(10页珍藏版)》请在冰点文库上搜索。
《操作系统》课程实验
实验课题:
模拟实现进程调度算法
姓名:
学号:
年级班级:
08级信息与计算科学
专业方向:
08信本软件方向
指导教师:
实验时间:
2010-11-18
一、实验名称:
模拟实现进程调度算法
二、实验目的:
a、进程调度是处理机管理的核心内容。
观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。
b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。
三、实验要求:
a、使用模块化设计思想来设计。
b、给出主函数和各个算法函数的流程图。
c、学生可按照自身条件,随意选择采用的算法,(例如:
采用冒泡法编写程序,实现短进程优先调度的算法)。
d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
四、实验内容及实验步骤
1、实验内容
a、设计进程控制块PCB表结构,模拟实现进程调度算法:
FIFO,静态优先级调度,时间片轮转调度,短进程优先调度算法,多级反馈队列调度。
(实现其中之一个以上)。
b、编写一个进程调度程序模拟程序。
模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
c、由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。
2、实验步骤
1)打开microsoftvasualC++6.0“开始”菜单—所有程序—单击“microsoftvasualC++6.0”,进入创建页面。
2)单击标题栏“文件”选择“新建”进入界面如下:
选择‘工程,win32consoleapplication’编辑工程名称‘chengkun1’存储在E盘,创建‘创建新工作区’确定。
3)创建文件:
单击标题栏“文件”选择“新建”进入界面类似于上面的界面。
4)在建好的文件中加入附件中的源程序,并进行编译。
五实验原始记录及结果分析
六参考代码
#include
#include
#include
constintMAXPCB=100; //定义最大进程数//定义进程控制块PCB结构体类型
typedefstructPCB_Node{
charsName[20]; //进程名
intiStatus;//进程状态(1就绪2等待3运行)当前程序中暂时全部默认为就绪处理
intiRunTime; //进程运行时间(纳秒)
intiPriority; //进程优先级(0级最高)
intiFinished; //进程是否执行完成标志(1:
已完成;0:
末完成)
intiWaitTime; //进程等待时间(纳秒)
}PCB;
PCBpcbs[MAXPCB]; //PCB数组队列
intiPCBNum; //实际进程数
charsFileName[20]; //进程流文件名
voidInitPCB() //PCB初始化函数
{inti;for(i=0;i {strcpy(pcbs[i].sName,""); pcbs[i].iStatus=-1; pcbs[i].iRunTime=-1; pcbs[i].iPriority=-1; pcbs[i].iFinished=0; pcbs[i].iWaitTime=0;}//for(i=0;i iPCBNum=0;}//voidInitPCB() intReadPCBFile() //读进程流文件数据,存入PCB数组队列pcbs,并输出 { FILE*fp;inti; cout<<" 请输入进程流(文本)文件名(注意: 包括后缀名): "; cin>>sFileName; if((fp=fopen(sFileName,"r"))==NULL) {cout<<" 错误: 进程流文件"< ! "< else{while(! feof(fp)) { fscanf(fp,"%s%d%d%d",pcbs[iPCBNum].sName,&pcbs[iPCBNum].iStatus,&pcbs[iPCBNum].iRunTime,&pcbs[iPCBNum].iPriority); iPCBNum++;} //while(! feof(fp))//输出所读入的进程数据 cout< "< cout<<" 进程名进程状态运行时间优先级"< for(i=0;i {cout<<" "< cout<<" 进程总数: "< return (1);} //if((fp=fopen(sFileName,"r"))==NULL) return(0);}//intReadPCBFile() voidReSetPCB() //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据 { inti;//输出所读入的进程数据 cout< cout< "< cout<<" 进程名进程状态运行时间优先级"< for(i=0;i {pcbs[i].iFinished=0; pcbs[i].iWaitTime=0; cout<<" "< cout<<" 进程总数: "< voidFIFO()//先进先出调度算法 {inti,j; intiSum;//总等待时间//输出先进先出调度算法执行流 cout< cout<<" 先进先出调度算法执行流: "< cout<<" 序号进程名运行时间等待时间"< iSum=0; for(i=0;i {cout<<" "< iSum+=pcbs[i].iWaitTime; //累加总等待时间 for(j=i+1;j { pcbs[j].iWaitTime+=pcbs[i].iRunTime; } } cout<<" 总调度次数: "< cout<<" 总等待时间: "< printf(" 平均等待时间%.2f\n",(float)iSum/(float)iPCBNum); cout< voidPriority() //优先级调度算法 {inti,j; intiCurMin; //当前最低优先级PCB在数组pcbs中的下标 intiPassedTime=0; //已经过的时间 intiSum; //总等待时间 intiQueue[MAXPCB]; //用于存放排序后进程数组下标的数组队列 intiCurPriority=1000; //当前最低优先级 for(i=0;i (选择排序) { iCurPriority=1000; for(j=0;j { if((pcbs[j].iFinished==0)&&(pcbs[j].iPriority { iCurMin=j;iCurPriority=pcbs[j].iPriority; }}//for(j=0;j iQueue[i]=iCurMin; pcbs[iCurMin].iFinished=1; pcbs[iCurMin].iWaitTime+=iPassedTime; iPassedTime+=pcbs[iCurMin].iRunTime;} //for(i=0;i //输出优先级调度执行流 cout< cout<<" 优先级调度执行流: "< cout<<" 序号进程名优先级运行时间等待时间"< iSum=0; for(i=0;i {cout<<" "< iSum+=pcbs[iQueue[i]].iWaitTime; //累加总等待时间 } cout<<" 总调度次数: "< cout<<" 总等待时间: "< printf(" 平均等待时间%.2f\n",(float)iSum/(float)iPCBNum); cout< voidRR() //时间片轮转调度算法 { inti; intiNotEnded=1; //标志: 不是所有进程都已经获得足够时间片运行完成 intiNum; //到目前为止末执行完的进程数 intiRound=0; //轮转周期数 intiSum=0; //总时间片数 floatfBlockTime=10; //时间片的长度(纳秒) cout< "< cin>>fBlockTime; cout< cout<<" 时间片轮转调度执行流(时间片的长度为: "< "< while(iNotEnded==1) { iNotEnded=0; iNum=0; for(i=0;i {if(pcbs[i].iFinished==0) { iNum++; }//if(pcbs[i].iFinished==0) }//for(i=0;i if(iNum>0) { iRound++; //累加轮转周期数 cout< "; for(i=0;i { if(pcbs[i].iFinished==0) { iNotEnded=1; cout< if(pcbs[i].iRunTime<=fBlockTime*(iRound))//i进程在本轮获得一个时间片后能够运行完成 { pcbs[i].iFinished=1;}//if(pcbs[i].iRunTime<=fBlockTime*(iRound+1)) }//if(pcbs[i].iFinished==0) }//for(i=0;i }//while(iNotEnded==1) cout< "< "< cout< voidSPF() //短进程优先调度算法 { inti,j; intiCurMin; //当前最短运行时间PCB在数组pcbs中的下标 intiPassedTime=0; //已经过的时间 intiSum; //总等待时间 intiQueue[MAXPCB];//用于存放排序后进程数组下标的数组队列 intiCurRunTime; //当前最短进程运行时间 for(i=0;i (选择排序) {iCurRunTime=1000000; for(j=0;j {if((pcbs[j].iFinished==0)&&(pcbs[j].iRunTime { iCurMin=j; iCurRunTime=pcbs[j].iRunTime;}}//for(j=0;j iQueue[i]=iCurMin; pcbs[iCurMin].iFinished=1; pcbs[iCurMin].iWaitTime+=iPassedTime; iPassedTime+=pcbs[iCurMin].iRunTime;} //for(i=0;i //输出短进程优先调度执行流 cout< cout<<" 短进程优先调度执行流: "< cout<<" 序号进程名运行时间等待时间"< iSum=0; for(i=0;i {cout<<" "< iSum+=pcbs[iQueue[i]].iWaitTime; //累加总等待时间 } cout<<" 总调度次数: "< cout<<" 总等待时间: "< printf(" 平均等待时间%.2f\n",(float)iSum/(float)iPCBNum); cout< voidVersion() //显示版权信息函数 {cout< cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"< cout<<" ┃ 进程调度算法模拟系统 ┃"< cout<<" ┠───────────────────────┨"< cout<<" ┃ (c)AllRightReserved ┃"< cout<<" ┃ LGY赖国勇 ┃"< cout<<" ┃ Version2010build2.0 ┃"< cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"< cout< }//voidVersion() voidmain() //主函数 { intiInput; //用户输入的整数以选择算法 boolbGoOn; //是否继续进程调度算法模拟的标志 charsGoOn[1]; //用户输入是否继续进程调度算法模拟的字母: y、Y、N、n Version(); //显示版权信息函数 InitPCB(); //PCB初始化函数 bGoOn=true; strcpy(sGoOn,""); if(ReadPCBFile()==1) //标志读进程流文件数据函数执行是否正确 { while(bGoOn) { cout< "< cout<<" 1先进先出调度算法"< cin>>iInput; //从标准输入获取用户输入的整数以选择算法 switch(iInput) {case1: ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据 FIFO(); //先进先出调度算法 break; case2: ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据 Priority(); //优先级调度算法 break; case3: ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据 RR(); //时间片轮转调度算法 break; case4: ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据 SPF(); //短进程优先调度算法 break; default: printf("\n 输入的算法编号错误! ! \n"); return;} //switch(iInput) bGoOn=false; strcpy(sGoOn,""); cout< (Y/N)"< cin>>sGoOn; bGoOn=(sGoOn[0]=='y'||sGoOn[0]=='Y');}//whilebGoOn }//if(ReadPCBFile()==1) }//voidmain()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 实现 进程 调度 算法