操作系统-课程设计报告-处理机调度程序_第1页
操作系统-课程设计报告-处理机调度程序_第2页
操作系统-课程设计报告-处理机调度程序_第3页
操作系统-课程设计报告-处理机调度程序_第4页
操作系统-课程设计报告-处理机调度程序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:班内序号:27成绩:日期:2015年1月6日一、设计目的 在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。二、设计要求1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。2)可选择进程数量3)本程序包括三种算

2、法,用C语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。三、设计思路及算法思想1. 界面菜单选项一级菜单提供2个选项: 自动生成进程数量 手动输入所需进程数量一级菜单选择完毕后进入二级菜单: 重新生成进程 时间片轮转法 短作业优先算法 动态优先级算法 退出程序2. 调度算法程序所用PCB结构体 需要用到的进程结构体如上图所示 1) 时间片轮转法 主要是设置一个当前时间变量,curTime和时间片roundTime。遍历进程组的时候,每运行一个进程,就把curTime += roundTime。进程已运行时间加roundTime2) 短作

3、业优先算法 遍历进程组,找到未运行完成并且运行时间最短的进程,让它一次运行完成,如此往复,直到所有进程都运行完成为止。3) 动态优先级算法 做法跟短作业优先算法类似,此处主要是比较进程的优先数,优先级高者,先执行。直到全部执行完毕。当一个进程运行完毕后,适当增减其余进程的优先数,以达到动态调成优先级的效果。3. 程序流程图四、运行截图1)启动后输入5,生成5个进程2) 输入1,选择时间片轮转法。自动输出结果,分别是时间片为1和4的结果3) 输入2,选择短作业优先算法4) 输入3,选择动态优先级算法5) 输入0,重新生成进程,再输入3,生成3个进程,选择2.短作业优先算法6) 输入q,退出五、心

4、得体会通过这次实验,让我对操作系统的进程调度有了更进一步的了解。这个实验的模拟程度跟真实系统相比只是冰山一角,由此可见操作系统是何其复杂的软件产品,仅进程调度就有那么丰富和内涵的知识需要掌握。但是再复杂的系统,都是由小部件构成的。古语云:不积跬步,无以至千里。不积小流,无以成江海。掌握这些基础的知识,可以为以后打下扎实的基础。六、附录(源代码)/ main.c/ ProcessDispatch/ Created by Jeans on 1/5/15./ Copyright (c) 2015 Jeans. All rights reserved./#include <stdio.h>

5、#include <stdlib.h>/最小进程数#define MIN_PROCESS 2/最大进程数#define MAX_PROCESS 20/最小优先数#define MIN_PRIORITY 0/最大优先数#define MAX_PRIORITY 10/最小运行时间#define MIN_RUNNING_TIME 1/最大运行时间#define MAX_RUNNING_TIME 20typedef struct PCB char name; /进程名 int priority; /优先数 int runningTime; /运行时间 int arriveTime; /到达

6、时间 int beginTime; /开始时间 int finishTime; /完成时间 int cyclingTime; /周转时间 double weigthCyclingTime; /带权周转时间 int hadRunTime; /已经运行时间 int finish; /是否完成PCB;/获取随机数int GetRandomNumber(int min,int max) return arc4random()%(max-min) + min;/初始化PCB组void InitPCBGroup(PCB p,int num) char name = 'A' for (int

7、 i = 0;i < num;i+) = name; pi.priority = GetRandomNumber(MIN_PRIORITY, MAX_PRIORITY); pi.runningTime = GetRandomNumber(MIN_RUNNING_TIME,MAX_RUNNING_TIME); name+; void PrintResult(PCB p,int num) double avgCycTime = 0,avgWeiCycTime = 0; printf("|进程名 到达时间 运行时间 开始时间 完成时间 周转时间 带权周转时间 优先数

8、|n"); for (int i = 0;i < num;i+) printf("|%3c %-4d %-4d %-4d %-4d %-4d %-6.2f %-4d|n",,pi.arriveTime,pi.runningTime,pi.beginTime,pi.finishTime,pi.cyclingTime,pi.weigthCyclingTime,pi.priority); avgCycTime += pi.cyclingTime; avgWeiCycTime += pi.weigthCyclingTime; /还原 pi.arrive

9、Time = 0; pi.beginTime = 0; pi.finishTime = 0; pi.cyclingTime = 0; pi.weigthCyclingTime = 0; pi.hadRunTime = 0; pi.finish = 0; avgWeiCycTime /= num; avgCycTime /= num; printf("平均周转时间:%.2f 平均带权周转时间:%.2fn",avgCycTime,avgWeiCycTime);/时间片轮转法void RealRoundRobin(PCB p,int num,int roundTime) prin

10、tf("nn-时间片:%d-n",roundTime); int finishNum = 0; int curTime = 0; while (finishNum != num) for (int i = 0;i < num;i+) if (pi.finish)continue; /开始时间 if (pi.beginTime = 0 && i != 0) pi.beginTime = curTime; /已经完成 if (pi.hadRunTime + roundTime >= pi.runningTime) pi.finishTime = cu

11、rTime + pi.runningTime - pi.hadRunTime; pi.cyclingTime = pi.finishTime - pi.arriveTime; pi.weigthCyclingTime = pi.cyclingTime/(double)pi.runningTime; pi.finish = 1; finishNum +; curTime += pi.runningTime - pi.hadRunTime; else pi.hadRunTime += roundTime; curTime += roundTime; PrintResult(p, num);void

12、 RoundRobin(PCB p,int num) RealRoundRobin(p, num, 1); /时间片为1的结果 RealRoundRobin(p, num, 4); /时间片为4的结果/短作业优先算法void ShortestJobFirst(PCB p,int num) printf("nn-短作业优先算法-n"); int finishNum = 0; int curTime = 0; while (finishNum != num) int min = 0; /查找短作业下标 for (int i = 1;i < num;i+) if (pi.f

13、inish = 0 && pmin.runningTime >= pi.runningTime) min = i; else if (pi.finish = 0 && pmin.finish = 1) min = i; pmin.beginTime = curTime; pmin.hadRunTime = pmin.runningTime; pmin.finishTime = pmin.beginTime + pmin.runningTime; pmin.cyclingTime = pmin.finishTime - pmin.arriveTime; pm

14、in.weigthCyclingTime = pmin.cyclingTime/(double)pmin.runningTime; pmin.finish = 1; finishNum+; curTime = pmin.finishTime; PrintResult(p, num);/动态优先级算法void DynamicPriorityFirst(PCB p,int num) printf("nn-动态优先级算法-n"); int finishNum = 0; int curTime = 0; while (finishNum != num) int min = 0; /

15、查找优先级最高下标 for (int i = 1;i < num;i+) if (pi.finish = 0 && pmin.priority >= pi.priority) min = i; else if (pi.finish = 0 && pmin.finish = 1) min = i; pmin.beginTime = curTime; pmin.hadRunTime = pmin.runningTime; pmin.finishTime = pmin.beginTime + pmin.runningTime; pmin.cyclingTi

16、me = pmin.finishTime - pmin.arriveTime; pmin.weigthCyclingTime = pmin.cyclingTime/(double)pmin.runningTime; pmin.finish = 1; finishNum+; curTime = pmin.finishTime; PrintResult(p, num);int main(int argc, const char * argv) PCB pcbGroup30; /pcb数组 int processNum = 0; /进程数 while (1) /选择进程数量 while (1) if

17、 (processNum != 0) break; printf("n-n"); printf("当前默认进程数范围%d-%dn",MIN_PROCESS,MAX_PROCESS); printf("1)输入0可随机生成进程数目n2)输入%d-%d范围内数字,回车,可生成指定数目进程n>>>>>>",MIN_PROCESS,MAX_PROCESS); int num = 0; scanf("%d",&num); if (num = 0) processNum = GetR

18、andomNumber(MIN_PROCESS, MAX_PROCESS); break; else if (num >= MIN_PROCESS) && (num <= MAX_PROCESS) processNum = num; InitPCBGroup(pcbGroup,processNum); break; else printf("n输入有误,请重新输入.n"); /选择算法 printf("n-请输入对应选项序号-n"); printf("0.重新生成进程 | 1.时间片轮转法 | 2.短作业优先算法 | 3.动态优先级算法 | q.退出n>>>>>>"); char ch; while (ch = getchar() = 'n'); switch (ch) case '0':/0 重新生成进程 processNum =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论