当前位置:文档之家› 操作系统实验 FCFS和短作业优先SJF调度算法模拟

操作系统实验 FCFS和短作业优先SJF调度算法模拟

int Order; //优先标记
}list;
(2)先来先服务算法函数
void fcfs(list *p,int count) //先来先服务算法
{
list temp; //临时结构体变量
int i;
int j;
for(i = 1;i < count;i++) //按到达时刻直接插入排序
{
temp = p[i];
题目先来先服务FCFS和短作业优先SJF进程调度算法
姓名:
学号:
专业:
学院:
指导教师:林若宁
二零一八年十一月
一、实验目的
模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解.
二、实验内容
1.短作业优先调度算法原理
短作业优先调度算法,是指对短作业或断进程优先调度的算法。它们可以分别可以用于作业调度和进程调度。短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达
p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行
}
return;
}
(3)最短作业优先函数
void sjf(list *p,int count) //最短作业优先算法(sjf)
{
p[j+1] = p[j];
--j;
}
p[j+1] = item;
}
return;
}
四、实验结果
测试数据:
进程名
到达时间
运行时间
A
0
4
B
1
3
C
2
}
else
{
p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻
}
p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达
p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行
p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;
min = 100;
temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻
for(j = 0;j < count;j++)
{
if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)
j = i-1;
while(temp.Arr_time < p[j].Arr_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].Arr_time;
三、程序设计
1.概要设计
程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果
2.算法流程
SJF算法流程图:
3.详细设计
(1)定义一个结构体
typedef struct PCB
{
char job_id[10]; //作业ID
2.先来先服务调度算法原理
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
p[k].Start_time = temp;
p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间
p[k].Fin_time = temp + p[k].Fun_time;
p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;
for(i = 0;i < count;i++)
{
if(temp > p[i].Arr_time)
{
temp = p[i].Arr_time; //保存最先到达的作业的时刻
k = i; //最先到达的作业的下标,默认为p[0]
}
}
for(i = 0;i < count;i++)
{
p[k].Order = ++flag; //设置优先级为1,最高优先级
continue;
if(min > p[j].Fun_time)
{
min = p[j].Fun_time;
k = j; //求出满足条件源自短运行时间的作业的下标}}
}
for(i = 1;i < count;i++) //按优先级排序
{
item = p[i];
j = i-1;
while(item.Order < p[j].Order && j >= 0)
float Arr_time; //到达时刻
float Fun_time; //估计运行时间
float Wait_time; //等待时间
float Start_time; //开始时刻
float Fin_time; //完成时刻
float Tur_time; //周转时间
float WTur_time; //带权周转时间
{
list item; //结构体变量
int i = 0;
int j = 0;
int k = 0; //最短运行时间作业的下标
int flag = 0; //优先级设置
float min = 0; //最短运行时间
float temp; //开始的时刻
temp = p[0].Arr_time;
//先求出最先到达作业的时刻
相关主题