模拟实现进程调度算法.doc
- 文档编号:163270
- 上传时间:2022-10-04
- 格式: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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 实现 进程 调度 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)