进程调度算法模拟程序设计.docx
《进程调度算法模拟程序设计.docx》由会员分享,可在线阅读,更多相关《进程调度算法模拟程序设计.docx(12页珍藏版)》请在冰豆网上搜索。
进程调度算法模拟程序设计
华北科技学院计算机学院综合性实验
实验报告
课程名称操作系统B
实验学期2011至2012学年第二学期
学生所在系部计算机学院
年级09专业班级网络工程B093
学生姓名李金栋学号2
任课教师杜杏菁
实验成绩
计算机学院制
《操作系统B》课程综合性实验报告
开课实验室:
基础实验室七2012年5月10日
实验题目
进程调度算法模拟程序设计
一、实验目的
通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。
二、设备与环境
1.硬件设备:
PC机一台。
2.软件环境:
安装Windows操作系统或Linux操作系统,并安装相关的程序开发环境,如C/C++/Java等编程语言环境。
三、实验内容
(1)用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
✧进程标识数ID。
✧进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
✧进程已占用CPU时间CPUTIME。
✧进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
✧进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
✧进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
✧进程状态STATE。
✧队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
✧进程在就绪队列中呆一个时间片,优先数增加1。
✧进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。
四、实验结果及分析
1.主程序流程图:
2.关键算法:
(1)PCB结构:
设置进程ID、剩余服务时间、剩余阻塞时间、NEXT指针四项记录。
typedefstructPCBType
{
intid;
intallTime;/*剩余服务时间*/
intblockTime;/*剩余阻塞时间*/
structPCBType*next;
}Process;
(2)创建新进程:
使用函数creatProcess()创建一个进程的PCB,并挂接在队列一的末尾。
voidcreatNew()
{
charchoose[8];
do
{
printf("\n请输入新进程信息:
\n");
printf("----------------------------\n");
firstRear->next=creatProcess();
firstRear=firstRear->next;
printf("----------------------------\n");
printf("是否继续创建新进程?
:
");
scanf("%s",choose);
while(strcmp(choose,"y")&&strcmp(choose,"Y")&&strcmp(choose,"n")&&strcmp(choose,"N"))
{
printf("输入有误,请重新输入!
\n");
printf("是否继续创建新进程?
:
");
scanf("%s",choose);
}
}while(!
strcmp(choose,"y")||!
strcmp(choose,"Y"));
}
(3)改变进程所在队列:
对头指针只需改变其NEXT指针指向,对尾指针则需使用指针的指针。
voidchangeQueue(Process*oldHead,Process**oldRear,Process**newRear)
{
(*newRear)->next=oldHead->next;
*newRear=(*newRear)->next;
oldHead->next=oldHead->next->next;
if(NULL==oldHead->next)/*若摘去进程后队列为空,则复位尾指针*/
(*oldRear)=oldHead;
(*newRear)->next=NULL;
}
(4)搜索并阻塞进程:
使用两个辅助指针实现阻塞进程的队列转换。
intsearchBlock(Process*head,Process**rear,intid)
{
Process*p=head;
Process*q=NULL;
if(*rear!
=head)
{
while(p!
=*rear)
{
q=p;
p=p->next;
if(id==p->id)
{
printf("请输入阻塞时间(1-8):
");
scanf("%d",&p->blockTime);
while(p->blockTime<1||p->blockTime>8)
{
printf("输入有误,请重新输入!
\n");
printf("请输入阻塞时间(1-8):
");
scanf("%d",&p->blockTime);
}
printf("----------------------------\n");
changeQueue(q,rear,&blockRear);
return1;
}
}
}
return0;
}
3.运行结果及分析:
(1)显示进程信息及选单:
显示各队列中进程的ID、剩余服务时间和阻塞服务时间,并显示菜单供用户选择。
(2)创建进程:
获取新进程的ID及所需服务时间总量,并为其创建PCB,可循环创建多个进程。
上图表示的是第一次调度前后的结果,第一队的时间片是1,第二队列的时间片是2,以此类推,一共有4个队列。
(3)阻塞进程:
获取要阻塞进程的ID并搜索该进程进行阻塞,可循环阻塞多个进程。
(4)进程执行完毕提示:
当某一进程执行完毕时,释放其PCB并显示相应的提示信息。
(5)程序结束提示:
当所有进程执行完毕时,释放所有队列元素并显示提示信息。
4.实验感想:
(1)编写代码时,应将相同操作提取为函数供其它代码调用,以提高程序代码的复用率并使程序结构简洁明了。
(2)程序执行中应在合适的时间给予用户恰当的提示信息,并对用户的输入信息进行格式检查,以保证程序正常运行。
(3)在结构化程序设计过程中,应遵循自顶向下的原则,先确定程序的整体结构,再实现具体细节,以保证程序结构的完整合理。
(4)多级反馈调度算法能够及时响应用户的请求,满足各种类型用户的需要,故被现代操作系统广泛采用。
(5)通过编写多级反馈队列调度算法,加深了对进程调度的理解,对于其基于时间片的算法原理,能够转化成实在的程序算法并验证。
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
实验结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日