操作系统实验之处理机调度实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称
计算机操作系统
开 课 学 院 计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
2016 — 2017 学年 第一学期
实验一 处理机调度
一、设计目的、功能与要求
1、实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进 程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工 作。
min = 100; temp = p[k].Finish_time; for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time < 0) continue;
if (min > p[j].Service_time) {
if (temp > p[i].Arrival_time) {
temp = p[i].Arrival_time; k = i; } } //按照响应比大小设置优先级,以及相应参数 for (i = 0; i < count; i++) { p[k].order = ++flag; p[k].Start_time = temp; p[k].Wait_time = temp - p[k].Arrival_time; p[k].Finish_time = temp + p[k].Service_time; p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time; p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
if (p[j].order != 0 || temp - p[j].Arrival_time <= 0) continue;
if (min > order[j]) {
min = order[j]; k = j; } } } //排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; j--; } p[j + 1] = item; }
max = (temp - p[j].Arrival_time) / p[j].Service_time; k = j; } } } //排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; --j; } p[j + 1] = item; } } //优先级法 void PS(List *p, int count) {
2、实现功能
模拟实现进程调度功能
3、具体要求
任选一种计算机高级语言编程实现; 选择一到两种进程调度算法,例如:先来先服务、短进程优先、最高响应 比优先、时间片轮转、优先级法等; 能够输入进程的基本信息,如进程名、到达时间和预估运行时间等; 根据选择的调度算法显示进程调度顺序; 显示完成调度后每个进程的开始时间、完成时间、周转时间、带权周转时 间; 计算平均周转时间和平均带权周转时间。
float WeightedTurn_time; //带权周转
int order;
//优先级
} List;
2、模块说明(功能与框图)
2.1 先来先服务调度算法框图
先来先服务调度算法有两种情况:一是进程的提交时间不一样,是根据到 达的先后顺序来执行的,先到达先执行;二是进程的提交时间一样,即所有的 进程的到达时间是一样的,要看进程的执行顺序,在前的进程先执行。 2.2 短进程优先(最高响应比、优先级法)调度算法框图
短进程优先调度算法,有两种情况:一是进程的到达的时间不一样,那么 首先执行第一个到达的进程,执行完后,然后比较剩下进程的到达时间和运行 时间,先到达的和运行时间短的进程先运行;二是进程的到达时间一样,比较 所有的进程的运行时间,运行时间短的进程先执行。 注:这里只给出了短进程优先的调度算法框图,由于在实际算法中三种算法极 其类似,在最高响应比和优先级法中仅需将框图中左边“判断运行时间长短” 分别改为“判断响应比高低”和“判断优先级高低”,将“运行时间短的进程先 运行”改为“响应比高的进程先运行”和“优先级高的进程先运行”。
max = 0;
temp = p[k].Finish_time; //找响应比最高任务 for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time <= 0) continue;
if (max < (temp - p[j].Arrival_time) / p[j].Service_time) {
二、问题描述
先来先服务:对到达的进程按照到达时间排序,计算每个进程的各项信 息,直接输出排序后结果即可。
短作业优先(最高响应比、优先级法与其在算法上类似,取短作业优先法 为例):先找到最先到达的进程,记录下其在结构体数组中的下标,之后对所有 进程进行遍历,按照最终执行顺序赋予优先级,数字越小优先级越高,计算相 关信息,之后在符合条件的进程中找到运行时间最短的进程,记录下标后,重 新进行上述操作。遍历完毕所有进程后,按照过程中赋予的优先级进行排序即 可。
min = p[j].Service_time; k = j; } } } //优先级排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; j--; } p[j + 1] = item; } } //最高响应比优先 void HRN(List *p, int count)
p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time;
p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
min = 100; temp = p[k].Finish_time; //找优先级最高任务 for (j = 0; j < count; j++) {
k = i;
}
}
//按照用户给定优先级设置优先级以及相应参数
for (i = 0; i < count; i++)
{
p[k].order = ++flag;
p[k].Start_time = temp;
p[k].Wait_time = temp - p[k].Arrival_time;
p[k].Finish_time = temp + p[k].Service_time;
temp = p[i]; j = i - 1; while (temp.Arrival_time < p[j].Arrival_time && j >= 0) {
p[j + 1] = p[j]; j--; } p[j + 1] = temp; } //计算各个作业时间值 for (i = 0; i < count; i++) { if (i == 0) p[i].Start_time = p[i].Arrival_time; else p[i].Start_time = p[i - 1].Finish_time; p[i].Wait_time = p[i].Start_time - p[i].Arrival_time; p[i].Finish_time = p[i].Start_time + p[i].Service_time; p[i].Turnover_time = p[i].Finish_time - p[i].Arrival_time; p[i].WeightedTurn_time = p[i].Turnover_time / p[i].Service_time; } } //短作业优先
三、数据结构及功能设计
1、数据结构
定义 PCB(Processor Control Block,程序控制块)结构体,内包含进程
的各项信息,在下面会详细列出并附有注释,在每种调度算法中,均使用该机
构体定义的数组作为形参,对结构体数组进行操作。
//定义程序控制块
typedef struct PCB
{
char job_name[10];
if (temp > p[i].Arrival_time) {
temp = p[i].Arrival_time; k = i; } } //按照作业长度分配优先级,以及相应参数 //1 为最高优先级,依次向下 for (i = 0; i < count; i++) { p[k].order = ++flag; p[k].Start_time = temp; p[k].Wait_time = temp - p[k].Arrival_time; p[k].Finish_time = p[k].Start_time + p[k].Service_time; p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time; p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
List item;
int i = 0, j = 0, k = 0;
int min;
//最高优先级
int flag = 0;
//最终优先级
float temp;
//开始时间
int order[count];
//优先级数组
cout << "Please input the priority of every jobs:";
//进程名
float Arrival_time;
//到达时间
float Service_time;
//估计运行时间
float Wait_time;
//等待时间
float Start_time;
//开始时间
float Finish_time;
//完成时间
float Turnover_time;
//周转时间
{
List item;
int i = 0, j = 0, k = 0;
int flag = 0;
//优先级
float max = 0;
//最大响应比
float temp;
//开始时间
temp = p[0].Arrival_time; //最先到达作业最先开始运行 for (i = 0; i < count; i++) {
void SJF(List *p, int count)
{
List item;
int i = 0, j = 0, k = 0;
int flag = 0;
//优先级设置
float min = 0;
//最短运行时间
float temp;
//开始时间
temp = p[0].Arrival_time; //最先到达的作业先运行 for (i = 0; i < count; i++) {
四、开发工具及主要源代码
1、开发工具
Clion for mac 2016,采用 cmake 编译。
2、主要源码
//先来先服务 void FCFS(List *p, int count) {
List temp; int i, j; //按照到达时间排序 for (i = 1; i < count; i++) {
}
五、测试用例及运行结果、分析
for (i = 0; i < count; i++)
{
cin >> order[i];
}
temp = p[0].Arrival_time;
Leabharlann Baidu
//最先到达作业最先开始运行
for (i = 0; i < count; i++)
{
if (temp > p[i].Arrival_time)
{
temp = p[i].Arrival_time;
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称
计算机操作系统
开 课 学 院 计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
2016 — 2017 学年 第一学期
实验一 处理机调度
一、设计目的、功能与要求
1、实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进 程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工 作。
min = 100; temp = p[k].Finish_time; for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time < 0) continue;
if (min > p[j].Service_time) {
if (temp > p[i].Arrival_time) {
temp = p[i].Arrival_time; k = i; } } //按照响应比大小设置优先级,以及相应参数 for (i = 0; i < count; i++) { p[k].order = ++flag; p[k].Start_time = temp; p[k].Wait_time = temp - p[k].Arrival_time; p[k].Finish_time = temp + p[k].Service_time; p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time; p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
if (p[j].order != 0 || temp - p[j].Arrival_time <= 0) continue;
if (min > order[j]) {
min = order[j]; k = j; } } } //排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; j--; } p[j + 1] = item; }
max = (temp - p[j].Arrival_time) / p[j].Service_time; k = j; } } } //排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; --j; } p[j + 1] = item; } } //优先级法 void PS(List *p, int count) {
2、实现功能
模拟实现进程调度功能
3、具体要求
任选一种计算机高级语言编程实现; 选择一到两种进程调度算法,例如:先来先服务、短进程优先、最高响应 比优先、时间片轮转、优先级法等; 能够输入进程的基本信息,如进程名、到达时间和预估运行时间等; 根据选择的调度算法显示进程调度顺序; 显示完成调度后每个进程的开始时间、完成时间、周转时间、带权周转时 间; 计算平均周转时间和平均带权周转时间。
float WeightedTurn_time; //带权周转
int order;
//优先级
} List;
2、模块说明(功能与框图)
2.1 先来先服务调度算法框图
先来先服务调度算法有两种情况:一是进程的提交时间不一样,是根据到 达的先后顺序来执行的,先到达先执行;二是进程的提交时间一样,即所有的 进程的到达时间是一样的,要看进程的执行顺序,在前的进程先执行。 2.2 短进程优先(最高响应比、优先级法)调度算法框图
短进程优先调度算法,有两种情况:一是进程的到达的时间不一样,那么 首先执行第一个到达的进程,执行完后,然后比较剩下进程的到达时间和运行 时间,先到达的和运行时间短的进程先运行;二是进程的到达时间一样,比较 所有的进程的运行时间,运行时间短的进程先执行。 注:这里只给出了短进程优先的调度算法框图,由于在实际算法中三种算法极 其类似,在最高响应比和优先级法中仅需将框图中左边“判断运行时间长短” 分别改为“判断响应比高低”和“判断优先级高低”,将“运行时间短的进程先 运行”改为“响应比高的进程先运行”和“优先级高的进程先运行”。
max = 0;
temp = p[k].Finish_time; //找响应比最高任务 for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time <= 0) continue;
if (max < (temp - p[j].Arrival_time) / p[j].Service_time) {
二、问题描述
先来先服务:对到达的进程按照到达时间排序,计算每个进程的各项信 息,直接输出排序后结果即可。
短作业优先(最高响应比、优先级法与其在算法上类似,取短作业优先法 为例):先找到最先到达的进程,记录下其在结构体数组中的下标,之后对所有 进程进行遍历,按照最终执行顺序赋予优先级,数字越小优先级越高,计算相 关信息,之后在符合条件的进程中找到运行时间最短的进程,记录下标后,重 新进行上述操作。遍历完毕所有进程后,按照过程中赋予的优先级进行排序即 可。
min = p[j].Service_time; k = j; } } } //优先级排序 for (i = 1; i < count; i++) { item = p[i]; j = i - 1; while (item.order < p[j].order && j >= 0) { p[j + 1] = p[j]; j--; } p[j + 1] = item; } } //最高响应比优先 void HRN(List *p, int count)
p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time;
p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
min = 100; temp = p[k].Finish_time; //找优先级最高任务 for (j = 0; j < count; j++) {
k = i;
}
}
//按照用户给定优先级设置优先级以及相应参数
for (i = 0; i < count; i++)
{
p[k].order = ++flag;
p[k].Start_time = temp;
p[k].Wait_time = temp - p[k].Arrival_time;
p[k].Finish_time = temp + p[k].Service_time;
temp = p[i]; j = i - 1; while (temp.Arrival_time < p[j].Arrival_time && j >= 0) {
p[j + 1] = p[j]; j--; } p[j + 1] = temp; } //计算各个作业时间值 for (i = 0; i < count; i++) { if (i == 0) p[i].Start_time = p[i].Arrival_time; else p[i].Start_time = p[i - 1].Finish_time; p[i].Wait_time = p[i].Start_time - p[i].Arrival_time; p[i].Finish_time = p[i].Start_time + p[i].Service_time; p[i].Turnover_time = p[i].Finish_time - p[i].Arrival_time; p[i].WeightedTurn_time = p[i].Turnover_time / p[i].Service_time; } } //短作业优先
三、数据结构及功能设计
1、数据结构
定义 PCB(Processor Control Block,程序控制块)结构体,内包含进程
的各项信息,在下面会详细列出并附有注释,在每种调度算法中,均使用该机
构体定义的数组作为形参,对结构体数组进行操作。
//定义程序控制块
typedef struct PCB
{
char job_name[10];
if (temp > p[i].Arrival_time) {
temp = p[i].Arrival_time; k = i; } } //按照作业长度分配优先级,以及相应参数 //1 为最高优先级,依次向下 for (i = 0; i < count; i++) { p[k].order = ++flag; p[k].Start_time = temp; p[k].Wait_time = temp - p[k].Arrival_time; p[k].Finish_time = p[k].Start_time + p[k].Service_time; p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time; p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
List item;
int i = 0, j = 0, k = 0;
int min;
//最高优先级
int flag = 0;
//最终优先级
float temp;
//开始时间
int order[count];
//优先级数组
cout << "Please input the priority of every jobs:";
//进程名
float Arrival_time;
//到达时间
float Service_time;
//估计运行时间
float Wait_time;
//等待时间
float Start_time;
//开始时间
float Finish_time;
//完成时间
float Turnover_time;
//周转时间
{
List item;
int i = 0, j = 0, k = 0;
int flag = 0;
//优先级
float max = 0;
//最大响应比
float temp;
//开始时间
temp = p[0].Arrival_time; //最先到达作业最先开始运行 for (i = 0; i < count; i++) {
void SJF(List *p, int count)
{
List item;
int i = 0, j = 0, k = 0;
int flag = 0;
//优先级设置
float min = 0;
//最短运行时间
float temp;
//开始时间
temp = p[0].Arrival_time; //最先到达的作业先运行 for (i = 0; i < count; i++) {
四、开发工具及主要源代码
1、开发工具
Clion for mac 2016,采用 cmake 编译。
2、主要源码
//先来先服务 void FCFS(List *p, int count) {
List temp; int i, j; //按照到达时间排序 for (i = 1; i < count; i++) {
}
五、测试用例及运行结果、分析
for (i = 0; i < count; i++)
{
cin >> order[i];
}
temp = p[0].Arrival_time;
Leabharlann Baidu
//最先到达作业最先开始运行
for (i = 0; i < count; i++)
{
if (temp > p[i].Arrival_time)
{
temp = p[i].Arrival_time;