进程调度算法模拟程序设计.docx

上传人:b****7 文档编号:11227652 上传时间:2023-02-25 格式:DOCX 页数:12 大小:135.43KB
下载 相关 举报
进程调度算法模拟程序设计.docx_第1页
第1页 / 共12页
进程调度算法模拟程序设计.docx_第2页
第2页 / 共12页
进程调度算法模拟程序设计.docx_第3页
第3页 / 共12页
进程调度算法模拟程序设计.docx_第4页
第4页 / 共12页
进程调度算法模拟程序设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

进程调度算法模拟程序设计.docx

《进程调度算法模拟程序设计.docx》由会员分享,可在线阅读,更多相关《进程调度算法模拟程序设计.docx(12页珍藏版)》请在冰豆网上搜索。

进程调度算法模拟程序设计.docx

进程调度算法模拟程序设计

华北科技学院计算机学院综合性实验

实验报告

 

课程名称操作系统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

算法正确

界面美观,布局合理

程序结构合理

操作熟练

语法、语义正确

解析完整

实验结果正确

文字流畅

报告规范

题解正确

其他:

 

评价教师签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1