课 程 设 计
题 目
进程调度模拟设计——先来先
服务、强占式短进程优先算法
学 院
计算机科学与技术
专 业
计算机科学与技术
班 级
姓 名
指导教师
2011 年 1 月 19 日
1
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位: 计算机科学与技术学院
题 目: 进程调度模拟设计——先来先服务、强占式短进程优先算法
初始条件:
1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程
调度算法有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴ 能够选择不同的调度算法(要求中给出的调度算法);
⑵ 能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶ 根据选择的调度算法显示进程调度队列;
⑷ 根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴ 课程设计目的与功能;
⑵ 需求分析,数据结构或模块说明(功能与框图);
⑶ 源程序的主要部分;
⑷ 测试用例,运行结果与运行情况分析;
⑸ 自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:周 1、周 2:完成程序分析及设计。
周 2、周 3:完成程序调试及测试。
周 4、周 5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按 0 分记)
指导教师签名:
2011 年 1 月 日
系主任(或责任教师)签名:
2011 年 1 月 日
2
先来先服务,强占式短进程优先算法
1. 课程设计目的与功能
1.1 课程设计的目的
通过课程设计所给的题目,深入了解操作系统的本质及精髓,对所给的两种
算法有比较深刻的认识
1.2 课程设计的功能
⑴ 能够选择不同的调度算法(要求中给出的调度算法);
⑵ 能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶ 根据选择的调度算法显示进程调度队列;
⑷ 根据选择的调度算法计算平均周转时间和平均带权周转时间
2. 需求分析,数据结构或模块说明
2.1 需求分析
通过设计一个模拟进程调度的系统,来实现进程调度,对进程调度的功能以及进程调度算法
有一个更加深入的理解。
进程 PCB(包含进程名、到达时间、预计运行时间)
调度算法(先来先服务、强占式短进程优先)
能够处理以下的情形:
(1)能够选择不同的调度算法(要求中给出的调度算法)
(2)能够输入进程的基本信息,如进程名、到达时间和运行时间等
(3)根据选择的调度算法显示进程调度队列
(4)根据选择的调度算法计算平均周转时间和平均带权周转时间
此次做的进程调度模拟系统,用户可以输入各进程信息(包含进程名、到达
时间、估计运行时间);输入完毕确认后,可选择两种调度算法中的一种执行,
查看结果可得到相应算法的调度序列,每个进程的到达时间、预计运行时间、开
始时间、结束时间和周转时间、带权周转时间,以及平均周转时间和平均带权周
转时间。
3
2.2 对调度算法的描述和实现
进程基本信息所构成的模块作为基本单元,并且相关调度算法的侧重进
程基本信息点不同,所以要根据其调度算法的特点来结合基本信息进行对应
的设计。此次课程设计要求的调度算法描述如下:
2.2.1 先来先服务调度算法
先来先服务调度算法是以进程的到达时间为判断标准,按各个进程的到
达时间先后顺序进行调度。
要实现此先来先服务调度算法以及考虑程序的简洁性,用一个数据结构如
优先级队列,容器等来存储进程基本信息,并要对所有的进程按其到达时
间先后顺序进行排序,实现依次取出的进程是所有未运行进程中到达时间
最早的进程。
2.2.2 强占式短进程优先调度算法
此调度算法和先来先服务调度算法相区别,强占式短进程优先调度算法
对强占式短进程优先调度算法而言,其本质特征便是按进程的预计运行时
间长短进行排序,先执行短进程。
若内存中运行的进程优先级比就绪队列中的某进程优先级低(即运行的
进程预计运行时间比就绪队列中的某进程长),此运行的进程让出内存并
进入就绪队列,优先级更高的短进程强占内存资源并运行直到结束或者遇
到优先级更高的进程强占为止。
2.3 数据结构
此次程序从大的方面来说是利用链表来实现的,在程序中定义了一个结
构体 struct PCB 用来保存没一条记录,每个结点包括进程名、进程的到达时
间、预计运行时间、开始运行时间、结束时间、运行次数、仍需运行时间、
周转时间、带权周转时间和指向下一个结点的指针。
因为在强占式短进程优先算法中,有的进程要运行一次甚至一次以上,
所以定义了进程运行次数和人需运行时间,另外此程序中的所有时间均为整
型。
然后定义了几个函数分别用来实现两种算法,首先要做的工作是将输入
4
的所有进程按到达时间的先后顺序排名,这样在先来先服务算法中,他们的
顺序便是进程调度顺序,然后在计算出他们的开始时间、结束时间、周转时
间等,这些都是小问题不再具体阐述。强占式短进程优先算法比较复杂,主
要的思想是先将第一个到达进程投入运行,等再有进程到达时需将他们的所
需运行时间进行比较,将运行时间短的一个投入运行,等再有进程到达时也
是利用这种方法决定要运行的进程,这就是强占式短进程优先算法。实现这
个算法时需要的工作有察看在 time 之前到达但未移动到运行队列的进程数
量,在头节点后的 count 个节点中选择需时间最小的返回。这是两个重要的
工作。
2.4 模块说明
Struct PCB 定义如下:
struct PCB
{
string name;//进程名
int ta;//进程到达时间
int ts;//进程估计运行的时间
int tb;//进程开始运行时间
int tm;//进程仍需运行的时间
int to;//进程完成的时间
int rn;//进程运行的次数
int totalTime;//周转时间
double weightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB *next;//定义指向下一个进程的指针
};
此次程序中定义的函数及其作用如下:
PCB *create(PCB *head);//创建进程队列
void deal(PCB *head);//FCFS 记录处理
void sort(PCB *head);//将进程按到达的先后顺序排列
int getCount(PCB *head,int time);//察看在 time 之前到达但未移动到运行
队列的进程数量
5
void del(PCB *p);//删除 p 的下一个节点
void fcfsrun(PCB *head);//先来先服务算法
PCB *SJF(PCB *head,int count);//在头节点后的 count 个节点中选择需时间
最小的返回
void SJFrun(PCB *head);//强占式短进程优先算法
另外还定义了三个变量:
int pronum;//定义进程数为 pronum
int total;//记录所有进程的总时间
double weight;//记录所有进程的带权周转时间
total 和 weight 将用来计算平均周转时间和平均带权周转时间。
3. 源程序的主要部分
3.1 程序代码
#include
#include
using namespace std;
#define QT 2//定义时间片长度为 2
struct PCB
{
string name;//进程名
int ta;//进程到达时间
int ts;//进程估计运行的时间
int tb;//进程开始运行时间
int tm;//进程仍需运行的时间
int to;//进程完成的时间
6
int rn;//进程运行的次数
int totalTime;//周转时间
double weightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB *next;//定义指向下一个进程的指针
};
int pronum;//定义进程数为 pronum
int total;//记录所有进程的总时间
double weight;//记录所有进程的带权周转时间
PCB *create(PCB *head);//创建进程队列
void deal(PCB *head);//FCFS 记录处理
void sort(PCB *head);//将进程按到达的先后顺序排列
int getCount(PCB *head,int time);//察看在 time 之前到达但未移动到运
行队列的进程数量
void del(PCB *p);//删除 p 的下一个节点
void fcfsrun(PCB *head);//先来先服务算法
PCB *SJF(PCB *head,int count);//在头节点后的 count 个节点中选择需时
间最小的返回
void SJFrun(PCB *head);//强占式短进程优先算法
void main()
{
int choice;
cout<<"*进程调度模拟设计——先来先服务、强占式短进程优先算法
*"<
cout<<"***********1.
先
来
先
服
务
算
法
***************************"<
>choice;
PCB *head=NULL;
switch(choice)
{
case 1:head=create(head);fcfsrun(head);goto l1;
case 2:head=create(head);SJFrun(head);goto l1;
case 3:break;
default:cout<<"输入错误!\n 请重新输入:"<>pronum;
for(int i=0;i