操作系统-课程设计报告-处理机调度程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统
课程设计报告
学校:广州大学学院:计算机科学与教
育软件学院班级:计算机127 班课
题:处理机调度程序任课老师:陶文
正、陈文彬姓名:黄俊鹏
学号:1200002111 班内序号:27
成绩:
日期:2015 年 1 月 6 日
、设计目的
在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
、设计要求
1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。
2)可选择进程数量
3)本程序包括三种算法,用C 语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。
三、设计思路及算法思想
1. 界面菜单选项一级菜单提供2 个选项:① 自动生成进程数量② 手动输入所需进
程数量
一级菜单选择完毕后进入二级菜单:
①重新生成进程
②时间片轮转法
③短作业优先算法
④动态优先级算法
⑤退出程序
2. 调度算法
程序所用PCB 结构体
需要用到的进程结构体如上图所示
1) 时间片轮转法
主要是设置一个当前时间变量,curTime 和时间片roundTime 。
遍历进程组的时候,每运行一个进程,就把curTime += roundTime 。进程已运行时间加roundTime 2) 短作业优先算法遍历进程组,找到未运行完成并且运行时间最短的进程,让它一次
运行完成,如此往复,直到所有进程都运行完成为止。
3) 动态优先级算法做法跟短作业优先算法类似,此处主要是比较进程的优先数,优先级高者,先执行。直到全部执行完毕。当一个进程运行完毕后,适当增减其余进程的优先数,以达到动态调成优先级的效果。
3. 程序流程图
四、运行截图
1)启动后输入
5,生成5 个进程
2)输入1,选择时间片轮转法。自动输出结果,分别是时间片为1和
4
的结果
4)输入3,选择动态优先级算法
5)输入0,重新生成进程,再输入3,生成3 个进程,选择2.短作业优先算法3)输入2,选择短作业优先算法
6)输入q,退出
五、心得体会
通过这次实验,让我对操作系统的进程调度有了更进一步的了解。这个实验的模拟程度跟真实系统相比只是冰山一角,由此可见操作系统是何其复杂的软件产品,仅进程调度就有那么丰富和内涵的知识需要掌握。
但是再复杂的系统,都是由小部件构成的。古语云:不积跬步,无以至千里。不积小流,无以成江海。掌握这些基础的知识,可以为以后打下扎实的基础。
六、附录(源代码)
//
// main.c
// ProcessDispatch
//
// Created by Jeans on 1/5/15.
// Copyright (c) 2015 Jeans. All rights reserved. //
#include
#include
//最小进程数
#define MIN_PROCESS //最大进程数
#define MAX_PROCESS 2
20
//最小优先数
#define MIN_PRIORITY 0
//最大优先数
#define MAX_PRIORITY 10
//最小运行时间
#define MIN_RUNNING_ TIME 1 //最大运行时间
#define MAX_RUNNING TIME 20 typedef struct PCB{
char name; //进程名
int priority; //优先数
int runningTime; //运行时间
int arriveTime; //到达时间
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 i = 0;i < num;i++){
p[i]. name = name;
p[i]. priority = GetRandomNumber(MIN_PRIORITY , MAX_PRIORITY );
p[i]. runningTime =
GetRandomNumber(MIN_RUNNING_TIME ,MAX_RUNNING_TIME );
name++;
}
}
void PrintResult( PCB p[], int num){
double avgCycTime = 0,avgWeiCycTime = 0;
printf ("|进程名到达时间运行时间开始时间完成时间周转时间带权周转时间优先数|\n");
for (int i = 0;i < num;i++){
printf ("|%3c %-4d %-4d %-4d %-4d %-4d %-6.2f %-4d|\n" ,p[i]. name,p[i]. arriveTime,p[i]. runningTime ,p[i]. beginTime,p[i]. finishTime ,p[i]. cyclingTime , p[i]. weigthCyclingTime ,p[i]. priority );
avgCycTime += p[i]. cyclingTime ;
avgWeiCycTime += p[i]. weigthCyclingTime ;
// 还原
p[i]. arriveTime = 0;
p[i]. beginTime = 0;
p[i]. finishTime = 0;