logo资料库

进程调度模拟设计——先来先服务、强占式短进程优先算法.doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
课 程 设 计 题 目 进程调度模拟设计——先来先 服务、强占式短进程优先算法 学 院 计算机科学与技术 专 业 计算机科学与技术 班 级 姓 名 指导教师 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
分享到:
收藏