时间片轮转、强占式短进程优先算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:
课程设计
题目进程调度模拟设计——时间片轮转、强
占式短进程优先算法
学院计算机科学与技术学院
专业
班级
姓名
指导教师吴利军
2013 年 1 月16 日
课程设计任务书
学生姓名:
指导教师:吴利军工作单位:计算机科学与技术学院
题目: 进程调度模拟设计——时间片轮转、强占式短进程优先算法初始条件:
1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)
指导教师签名:年月日
系主任(或责任教师)签名:年月日
进程调度模拟设计
时间片轮转、强占式短进程优先算法一、需求分析
本次课程设计需要通过设计一个模拟进程调度的系统,来实现进程调度过程的模拟,对进程调度的功能以及进程调度的算法有更加深层次的理解。
时间片轮转法的基本思路是每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。这样让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。
在批处理为主的系统中,如果采用FCFS方式进程作业调度,虽然系统开销小,算法简单,但是,如果估计执行时间很短的作业时在那些长作业的后面到达系统的话,则必须等待长作业执行完成之后才有机会获得执行。这将造成不必要的等待和不公平,最短作业优先法就是选择那些估计需要执行时间最短的作业投入执行,为它们创建进程和分配资源。直观上说,采用最短作业优先的调度算法,可使得系统在同一时间内处理的作业个数最多,从而吞吐量也就大于其它调度方式。
按照需求有以下条件:
进程PCB(包含进程名、到达时间、预计运行时间等)
调度算法(时间片轮转、强占式短进程优先)
为完成这两种算法的调度模拟,需要用高级语言编程完成模拟操作,能够处理以下的情形:
(1)能够选择不同的调度算法(要求中给出的调度算法)
(2)能够输入进程的基本信息,如进程名、到达时间和运行时间等
(3)根据选择的调度算法显示进程调度队列
(4)根据选择的调度算法计算平均周转时间和平均带权周转时间该设计中的进程调度模拟系统在使用时,用户可以输入各进程信息(包含进程名、到达时间、估计运行时间);输入完毕确认后,可选择两种调度算法中的一种执行,查看结果可得到相应算法的调度序列,每个进程的到达时间、预计运行时间、开始时间、结束时间和周转时间、带权周转时间,以及平均周转时间和平均带权周转时间。
二、功能设计
2.1 进程信息的描述和实现
此次课程设计中,进程作为基本数据处理单元,需要对进程的基本信息进行相关的描述。进程的基本信息包括进程进程名、到达的时间、预计的进程运行时间、进程开始运行时间、进程仍需运行的时间、进程完成的时间、进程运行的次数等。在此,定义一个类来抽象进程。并在此基础上进行其他操作。数据结构方
案声明如下:
class ProcePcb {
public :
ProcePcb (string name,int sub,int exe,int id) :
pro_name(name),time_submit(sub),time_exe (exe),pro_id(id),
time_start(0),time_end(0),time_wait(0),pro_ state(READY),time_left(exe),
time_turn(0),time_aver(0.0){} //默认构造函数
ProcePcb () :
pro_name (string(" ")), time_submit(0),time_exe(0),pro_id(-1),
time_end(0),time_start(0),time_wait(0),pro_ state(READY),time_left(0),
time_turn(0),time_aver(0.0) {} //Getters and Setters
string getPro_name () { return pro_name ;}
int getTime_submit () { return time_submit ;}
int getTime_exe () { return time_exe ;}
int getPro_id () { return pro_id ;}
int getTime_start () { return time_start ; }
int getTime_wait () { return time_start ; }
int getPro_state () { return pro_state ;}
int getTime_left () { return time_left ;}
int getTime_turn () { return time_turn ;}
int getTime_aver () { return time_aver ;}
void setTime_start (int start) { time_start = start ; } //设置开始时间
void setTime_left (int left) { time_left = left ;}
void setTime_end (int end) { time_end = end ; } //设置结束时间
void setPro_state (int state) { pro_state = state ;} //设置进程的状态
//..打印进程的信息
void PrintPcbInfo () ; //
//..进程执行模拟
bool ProceExe(int) ; //参数为时间单位,返回CPU是否执行完毕
//内部逻辑计算包括周转时间以及带权周转时间的计算
void CalTimeLogic() ;
protected:
//进程的名字
string pro_name ;
//提交时间--用十进制封装
int time_submit ; //从时间的1开始计时
//进程所需的运行时间
int time_exe ;
//进程ID -- 系统生成
int pro_id ;
//开始执行的时间
int time_start ;
//结束的时间
int time_end ;
//等待的时间
int time_wait ;
//进程的状态(就绪,执行,完成)
int pro_state ;
//...上下文封装
int time_left ; //还需多少时间单位,初始化为所需的执行时间
//周转时间
int time_turn ;
//带权周转时间
float time_aver ;
} ;