操作系统进程模拟调度课程设计短作业优先先来先服务最高响应比优先级Word格式文档下载.docx
《操作系统进程模拟调度课程设计短作业优先先来先服务最高响应比优先级Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统进程模拟调度课程设计短作业优先先来先服务最高响应比优先级Word格式文档下载.docx(28页珍藏版)》请在冰点文库上搜索。
时间片轮转法,短作业优先算法,动态优先级算法。
(2)可选择进程数量。
(3)本程序包括三种算法,用C++语言实现,执行时在主界面选择算法,进入子页面后输入进程数,执行,显示结果
工
作
量
要求设计说明书的字数在3000字以上。
划
2015.6.12-6.13根据课程设计的要求,查找相关资料,完成需求分析;
2015.6.13-6.13进行系统的概要设计;
2015.6.14-6.15进行系统的详细设计和源代码的书写;
2015.6.16-6.17对系统进行调试分析,写出课程设计报告。
考
资
料
[1]龚沛曾等编.C/C++程序设计教程.北京:
高等教育出版社,2004.
[2]谭浩强编著.C程序设计(第二版).北京:
清华大学出版社,1999.
[3]张尧学等编著.计算机操作系统教程.北京:
清华大学出版社,2011.
[4]孟庆昌等编.操作系统.北京:
电子工业出版社,2009.
[5]刘腾红等编著.操作系统.北京:
中国铁道出版社,2008.
[6]汤子瀛等编著.计算机操作系统.西安:
西安电子科技大学出版社,2011
指导教师签字
教研室主任签字
2015年05月18日
指导教师评语:
成绩:
年月日
安徽理工大学课程设计(论文)成绩评定表
问题描述
本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力
需求分析
设计要求:
先来先服务调度法,短作业优先调度算法,最高优先数优先调度算法。
(3)本程序包括三种算法,用C++语言实现,执行时在主界面选择算法,进入子页面后输入进程数,执行,显示结果。
概要设计
图1
1、先来先服务调度算法
实验步骤:
(1)初始化进程信息。
(2)按先来先服务算法将进程排成就绪队列。
(3)检查所有队列是否为空,若空则结束,否则将队首进程调入执行。
(4)检查该运行进程是否运行完毕,若运行完毕,将此进程状态改为完成;
否则,继续运行直到此进程运行完为止,才运行就绪队列的下一个进程。
(5)重复步骤(3)、(4),直到就绪队列为空。
图2
2、短作业优先调度算法
(2)按各个进程运行所需时间由短到长排列成就绪队列。
(4)检查该运行进程是否运行完毕,若运行完毕,将此进程状态改为完成,插入另一个完成进程队列;
否则,重新对它们时间由短到长进行排序,插入就绪队列适当位置后等待CPU。
图3
3、最高优先数优先调度算法(即把处理机分配给优先数最高的进程)
(2)将各个进程按优先数从高到低排列成就绪队列。
否则,将该进程的优先数减1,然后重新对它进行排序,插入就绪队列适当位置后等待CPU。
详细设计
1、功能模块设计
(1)主要函数(三种算法的核心函数相同):
a.主函数
b.初始化进程函数
c.使用户输入仅为正整数的函数
d.排序函数
e.就绪函数
f.查看函数
g.显示函数
2、数据结构设计
(1)先来先服务调度算法:
typedefstructpcb/*定义结构体数组,内部包含进程的信息*/
{
charname[10];
/*定义进程名*/
intarrivetime;
/*定义到达时间*/
intneedtime;
/*定义进程需要运行的时间*/
intruntime;
/*定义进程已用CPU时间*/
charstate;
/*定义进程的运行状态*/
structpcb*link;
/*进程块的后继指针,用于连接进程队列*/
}PCB;
(2)短作业优先调度算法:
(3)最高优先数优先调度算法:
typedefstructpcb/*定义结构体数组,内部包含进程的信息*/
intsuper;
/*定义到达时间*/
/*定义进程已用CPU时间*/
/*进程块的后继指针,用于连接进程队列*/
2、函数功能描述
a.main()主函数:
掌控整个程序的运行过程,是程序的主体部分。
b.input()初始化进程函数:
初始化各个进程的基本信息:
如进程个数、进程名、进程需运行的时间、进程的到达时间、进程的已运行时间、进程的状态。
c.geti()使用户输入仅为正整数的函数:
使用户输入的进程个数、进程需运行的时间、进程的到达时间都为正整数。
d.sort()排序函数:
按到达时间从先到后排列成就绪队列,进而等待运行。
e.running()就绪函数:
进程运行时间到,则置就绪状态。
若已运行时间已达到需运行时间,则此进程已完成;
若未达到,则继续运行直到时间达到为止。
f.check()查看函数:
查看哪个进程正在执行,哪些进程在就绪队列中,哪些进程已经完成。
g.disp()显示函数:
显示各个进程的信息。
如进程个数、进程名、进程需运行的时间、进程的优先数、进程的已运行时间、进程的状态。
使用户输入的进程个数、进程需运行的时间、进程的优先数都为正整数。
按优先数由高到低排列成就绪队列,进而等待运行。
若已运行时间已达到需运行时间,则此进程已完成,插入另一个完成队列中;
若未达到,则优先数减1,重新插入就绪队列中排序等待运行。
调试分析
三种算法演示过程
(1)先输入各个进程的信息
(2)进程运行的具体情况(部分调试结果)
用户手册
按照屏幕提示操作即可
第一步输入进程数目
第二步详细输入每个进程的信息
确认后则程序运算并显示最重结果。
如果需要再次进行操作,可以输入Y以继续,如下图,会清屏并跳转到输入进程界面。
测试结果
图4
设计体会
这次实验使我加深对处理机进程调度机制的理解,对进程的概念有了更深一层次的认识。
通过实现不同调度算法来实现调度进程,比较了不同调度算法的优缺点,掌握进程状态转换过程和处理机调度策略的实现。
在编程中我不仅对课本内容有了更好的理解也提高了自己的编程能力。
参考文献
附录
源代码:
#include<
stdio.h>
windows.h>
string.h>
conio.h>
/*conio.h是一个包含一些字符处理函数的头文件,如getch(),
getch()是无显示的从键盘接收一个字符,有显示的接收是getchar()*/
typedefcharstring[10];
/*//定义string为含有10个字符元素的字符数组类型*/
structtask{
stringname;
/*作业号*/
floatarrTime;
/*作业到达时间*/
floatserTime;
/*作业要求服务时间*/
floatwaiTime;
/*等待时间*/
floatbegTime;
/*开始运行时间*/
floatfinTime;
/*结束运行时间*/
floatturTime;
/*周转时间*/
floatwTuTime;
/*带权周转时间*/
floatpriority;
/*优先权*/
intfinish;
/*是否已经完成*/
}JCB[5];
intnum;
voidinput()
inti;
system("
cls"
);
printf("
\nPleaseinputtasknumber:
"
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
{
printf("
\nPleaseinputtaskNO.%d:
\n"
i);
Thenameoftask:
scanf("
%s"
JCB[i].name);
Thetimearrive:
%f"
&
JCB[i].arrTime);
Thetimeneed:
JCB[i].serTime);
JCB[i].priority=0;
JCB[i].finish=0;
}
}
intFCFS()
intcurrent;
inti,j;
i<
i++)
if(!
JCB[i].finish)
{
current=i;
/*找到第一个还没完成的作业*/
break;
}
for(j=i;
j<
j++)/*和后面的作业比较*/
JCB[j].finish&
&
JCB[j].arrTime<
JCB[current].arrTime)
current=j;
/*找出先来的未完成作业*/
returncurrent;
/*返回当前作业*/
intSJF(intpre)
/*找到第一个还没完成的作业*/
for(j=i;
if(!
JCB[j].finish)/*还没完成(运行)*/
if(JCB[current].arrTime<
=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/
{
if(JCB[j].arrTime<
=JCB[pre].finTime&
JCB[j].serTime<
JCB[current].serTime)
current=j;
/*找出到达时间在上一个作业完成之前,服务时间比较小的未完成作业*/
}
else/*如果作业是在上一个作业完成之后到达*/
/*找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime)/*如果同时到达*/
if(JCB[j].serTime<
JCB[current].serTime)
current=j;
/*找出服务时间比较短的一个*/
/*返回当前作业*/
intHRN(intpre)
intcurrent=1;
/*优先权=(等待时间+服务时间)/服务时间*/
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime;
/*等待时间=上一个作业的完成时间-到达时间*/
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
j++)/*和后面的作业比较*/
=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/
JCB[j].priority>
JCB[current].priority)
/*找出到达时间在上一个作业完成之前,优先权高的作业*/
else/*如果作业是在上一个作业完成之后到达*/
/*找出比较早到达的一个*/
if(JCB[j].arrTime==JCB[current].arrTime)/*如果同时到达*/
if(JCB[j].priority>
JCB[current].priority)
/*返回当前作业*/
voidruning(inti,inttimes,intpre,float&
staTime,float&
endTime)
if(times==0)
JCB[i].begTime=JCB[i].arrTime;
JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
JCB[i].turTime=JCB[i].serTime;
JCB[i].wTuTime=1.0;
staTime=JCB[i].begTime;
else
if(JCB[i].arrTime>
JCB[pre].finTime)
JCB[i].begTime=JCB[i].arrTime;
else
JCB[i].begTime=JCB[pre].finTime;
JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;
JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;
if(times==num-1)
endTime=JCB[i].finTime;
JCB[i].finish=1;
voidprint(inti,inttimes)
namearrTimeserTimebegTimefinTimeturTimewTuTime\n"
%9s%9.2f%9.2f%9.2f%9.2f%9.2f%9.2f\n"
JCB[i].name,JCB[i].arrTime,JCB[i].serTime,
JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);
voidcheck()
floatstaTime,endTime;
floatA,B;
floatsumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;
intcurrent=0,times=0,pre=0;
JCB[pre].finTime=0;
\n--FCFS-----------------------------------------------------------------\n"
for(times=0;
times<
times++)
current=FCFS();
runing(current,times,pre,staTime,endTime);
print(current,times);
pre=current;
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
aveTurTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
(total)%9.2f%9.2f%9.2f%9.2f\n"
staTime,endTime,aveTurTime,aveWTuTime);
-------------------------------------------------------------------------\n"
JCB[i].finish=0;
//floatstaTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;
//intcurrent=0;
times=0;
pre=0;
\n--SJF------------------------------------------------------------------\n"
current=SJF(pre);