首页 热点专区 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

实现FCFS和SJF调度算法

2022-05-05 来源:要发发教育
操作系统实验报告

实验一:作业调度 学院:软件学院 专业:软件工程 班级:软件工程12-01

姓名:***

学号:541213460157

实验一:作业调度

实现FCFS和SJF调度算法

【实验题目】:编写程序,实现FCFS和SJF算法,模拟作业调度过程,加深对作业调度的理解。 【实验内容】

实现FCFS和SJF调度算法。

– 数据结构设计1. 设计作业控制块(JCB>的数据结构

– 应包含实验必须的数据项,如作业ID、需要的服务时间、进入系 统时间、完成时间,以及实验者认为有必要的其他数据项。 2. 实现排序算法<将作业排队)

– 策略1:按“进入系统时间”对作业队列排序(FCFS>

– 策略2:按“需要的服务时间”对作业队列排序<1)每个作业用一个JCB表示,如果模拟FCFS,按策略1将作业排队,如果模拟SJF,按策略2将作业排队b5E2RGbCAP <2)选择队首的作业,将其从后备队列移出。

<3)<作业运行过程,在本实验中,无需实现,可认为后备队列上的 作业一但被调度程序选出,就顺利运行完毕,可以进入第4步) <4)计算选中作业的周转时间 <5) 进行下一次调度<去往第2步) 4.实现结果输出

– 输出作业状态表,展示调度过程 • 初始作业状态<未调度时) • 每次调度后的作业状态 5.撰写实验报告

– 包含实验要求中1~4项内容,要求有设计图<结构图/流程图)和源代码。

– 注明使用的编程语言和环境。 注意事项

• 实验中注重实现算法本质<先来先服务,短作业优先)。 • 两个算法可以使用一套程序,差别只在队列的排序方式。 • 这两个算法也可适用于进程调度。关于作业调度和进程调度的区别,只要求概念上理解清楚,不要求实现。

设计作业控制块(JCB>的数据结构

每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。具体结构如下: p1EanqFDPw typedef struct jcb{

char name[10]。 /* 作业名 */ char state。 /* 作业状态 */

int ts。 /* 提交时间 */ float super。 /* 优先权 */

int tb。 /* 开始运行时间 */ int tc。 /* 完成时间 */ float ti。 /* 周转时间 */ float wi。 /* 带权周转时间 */

int ntime。 /* 作业所需运行时间 */

char resource[10]。 /* 所需资源 */ struct jcb *next。 /* 结构体指针 */ } JCB。

JCB *p,*tail=NULL,*head=NULL。

作业的状态可以是等待W(Wait>、运行R(Run>和完成F(Finish>三种状态之一。每个作业的最初状态总是等待W。,组成一个后备队列等待,总是首先调度等待队列中队首的作业。 DXDiTa9E3d 本实验采用链表的形式存放各后备队列当中的作业控制块,各个等待的作业按照提交时刻的先后次序排队。当一个作业进入系统时,就为其动态建立一作业控制块编程语言:c++

编程环境:Visual C++ 6.0 程序代码: FCFS:

#include

using namespace std。 class Fcfs { private:

int num[10]。 //作业编号 double arriveTime[10]。 //到达时间

double startTime[10]。 //开始时间,进内存时间 double workTime[10]。 //工作时间 double finishTime[10]。 //完成时间

double cirTime[10]。 //存放每一个作业的周转时间 // double freeTime[10]。 //上一个作业已结束,但下一个作

业还未到,存放这一段空闲时间 jLBHrnAILg public:

Fcfs(int n> //n为作业数目 {

cout<<\"默认第一个作业的到达时间为0。\"< {

num[i]=i+1。 //给作业编号 cout<<\"第\"<>arriveTime[i]。 if(i==0>

arriveTime[i]=0。 //默认第一个

作业的到达时间为0

cout<<\"请输入该作业的执行时间:\"。 cin>>workTime[i]。 if(i==0> { }

else if(arriveTime[i]<=finishTime[i-1]>

startTime[i]=0。

finishTime[i]=workTime[i]。 //freeTime[i]=0。

//如果后一个作业已到,而前一个作业未结束 xHAQX74J0X

{

startTime[i]=finishTime[i-1]。

//则后一个作业的开始时间为上一个作业的结束时间LDAYtRyKfE

finishTime[i]=startTime[i]+workTime[i]。

//freeTime[i]=0。 //前一个一结束就开

始工作,没有空闲时间

}

else if(arriveTime[i]>finishTime[i-1]> {

//freeTime[i]=arriveTime[i]-

finishTime[i-1]。//计算空闲时间,前一个作业已完成,但后一个作业还没到,中间空闲时间 Zzz6ZB2Ltk

startTime[i]=arriveTime[i]。 //由于来的时候前一个作业已完成,则该作

业的开始时间即为它的到达时间

finishTime[i]=startTime[i]+workTime[i]。 }

//计算平均周转时间

double getAverageCir(int n> //n为作业数 { }

//打印输出

double averageCir,sumCir=0。 for(int i=0。i

sumCir+=cirTime[i]。 }

}

cirTime[i]=finishTime[i]-arriveTime[i]。

averageCir=sumCir/n。 return averageCir。

void print(int n> //n为作业数 {

cout<<\"num\\"<<\"arrive\\"<<\"start\\"<<\"work\\"<<\"finis

h\\"<<\"cir\\"< dvzfvkwMI1

cout<{

<\"\\"<}

}

cout<cout<<\"平均周转时间:\"<<}。 int main(> {

int n。 //n为作业数目 cout<<\"请输入作业数目:\"。 cin>>n。 Fcfs f=Fcfs(n>。 f.print(n>。

} SJF:

return 0。

#include using namespace std。 class SJF{ private:

int num[10]。 //作业编号

double arriveTime[10]。 //到达时间

double startTime[10]。 //开始时间,进内存时间 double workTime[10]。 //工作时间 double finishTime[10]。 //完成时间

double cirTime[10]。 //存放每一个作业的周转时间

public:

SJF(int n> //n为作业数目 {

int i。

cout<<\"默认第一个作业的到达时间为0。\"< {

num[i]=i+1。 //给作业编号

cout<<\"第\"<cout<<\"请输入该作业的到达时间:\"。 cin>>arriveTime[i]。 if(i==0>

arriveTime[i]=0。 //默认第一个作业的到

达时间为0

cout<<\"请输入该作业的执行时间:\"。 cin>>workTime[i]。 if(i==0> {

startTime[i]=0。

finishTime[i]=workTime[i]。 cirTime[i]=finishTime[i]-

arriveTime[i]。

}

else //排序 {

for(int j=1。j //i=当前作业数

目-1,这里不能用num[i]表示当前作业数 起泡排序法EmxvxOtOco

{

for (int k=1。k<=i-j。k++>

if(workTime[k]>workTime[k+1]>

{

double temp。 temp=num[k]。 num[k]=num[k+1]。 num[k+1]=temp。 temp=arriveTime[k]。

arriveTime[k]=arriveTime[k+1]。

arriveTime[k+1]=temp。 temp=workTime[k]。

workTime[k]=workTime[k+1]。

}

for(i=1。i //排序后计算各作业的开始、结

}

}

}

workTime[k+1]=temp。

束、周转时间

{

startTime[i]=finishTime[i-1]。

finishTime[i]=startTime[i]+workTime[i]。

}

}

cirTime[i]=finishTime[i]-arriveTime[i]。

//计算平均周转时间

double getAverageCir(int n> //n为作业数 { }

//打印输出

void print(int n> //n为作业数 {

double averageCir,sumCir=0。 for(int i=0。i

sumCir+=cirTime[i]。

averageCir=sumCir/n。 return averageCir。

cout<<\"num\\"<<\"arrive\\"<<\"start\\"<<\"work\\"<<\"finis

h\\"<<\"cir\\"<cout<for(int i=0。i {

<\"\\"< { }

实例截图:

五个进程,到达时间分别为5,10,13,20 服务时间分别为6,2,4,6 设置选择量n, 当n=1时,选择FCFS

cout<<\"-----短作业优先-----\"<>n。 SJF f=SJF(n>。 f.print(n>。 return 0。 }

}

cout<cout<<\"平均周转时间:\"<<当n=2时,选择SJF

当n=3时,同时分别调用FCFS和SJF n不为1或2或3时提示错误,重新输入n; 1-FCFS 算法

2-SJF算法

实验总结:

本次实验题目为作业调度。实现实现FCFS和SJF调度算法。能初步掌握FCFS和SJF调度算法。

对于FCFS和SJF调度算法的思路清晰,只是将其转化为代码形式,在脑海中,没有思路。经过查阅资料和与同学们交流,逐渐形成了一定的模块化思路。结合相关程序,在调试程序的过程中,意识到书写格式规范化及其重要性。明白了其中的功能。FCFS与SJF各有优缺点。对于FCFS,当先执行的是长作业时,由于FCFS对短作业长时间等待,不利于短作业。对于SJF,必须预知作业的运行时间,当短作业过多时,则不利于长作业。采用SJF算法时,人机无法实现交互。由于没有考虑到作业紧迫性,不能保证作业能够及时得到处理。选择哪一种算法,则根据具体情况而定。kavU42VRUs 申明:

所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

因篇幅问题不能全部显示,请点此查看更多更全内容