当前位置:文档之家› 短作业优先调度

短作业优先调度

{
if((pro[j].arrivetime<=temp_time)&&(!pro[j].runflag))
if(pro[j].runtime<run_time)
{
run_time=pro[j].runtime;
number=j;
}
}
pro[number].servertime=temp_time; //对最短作业进行赋值,计算
int SJF(); //短作业优先函数
int SJF()
{
int temp_time=0;
int i=0,j;
int number,temp_counter; //进程编号,当前已执行进程个数
float run_time;
int min=0;
run_time=pro[i].runtime;
j=1;
pro[number].finishtime=pro[number].servertime+pro[number].runtime;
pro[number].runflag=1;
temp_time=pro[number].finishtime;
pro[number].order=1;
temp_counter=1;
while(temp_counter<N)
{
for(j=0;j<N;j++)
{
if((pro[j].arrivetime<=temp_time)&&(!pro[j].runflag))
{
run_time=pro[j].runtime;
number=j;
break;
}
}
for(j=0;j<N;j++) //选出最短的运行时间(最短作业)
pro[number].finishtime=pro[number].servertime+pro[number].runtime;
pro[number].runflag=1;
temp_time=pro[number].finishtime;
temp_counter++;
pro[number].order=temp_counter;
实验一 进程调度
一、实验目的
编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解.
二、实验内容
1.采用“短进程优先”调度算法对五个进程进行调度。每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。
三、实现思路
主函数-输入函数-短作业优先调度函数-输出函数。
这是一条最基础的思路。输入函数使用文本导入完成数据输入,输出函数输出调度结果,主函数完成各子函数连接,最主要的是短作业优先的调度函数。我想到的方法就是排序,不断选择需要运行时间最短的作业,接着进行数据输入计算输出等,遍历全部数据并完成调度。
五、算法流程图
1 0


六、运行与测试
用书上数据对程序进行测试,结果如下:
另外随便添加一些数据进行测试,结果如下:
代码实现:
#include<iostream>
#include<windows.h>
#define MaxNum 100
using namespace std;
struct Process_struct{
{while((j<N)&&(pro[i].arrivetime>pro[j].arrivetime)) //选出第一个到达的进程
{
min=j;
i=j;
j++;
}}
number=min; //对第一个到达的进程赋值,计算
pro[number].servertime=pro[number].arrivetime;
double weightwholetime; //周转时间
double averagewt_FCFS,averagewt_SJF; //平均周转时间
double averagewwt_FCFS,averagewwt_SJF; //平均带权周转时间
}pro[MaxNum];
int N; //实际进程个数
四、主要的数据结构
struct Process_struct{
char name[MaxNum]; //进程名称
int arrivetime; //到达时间
int servertime; //开始运行时间
int finishtime; //运行结束时间
int runtime; //运行时间
int runflag; //调度标志
int order; //运行次序
double weightwholetime; //周转时间
double averagewt_FCFS,averagewt_SJF; //平均周转时间
double averagewwt_FCFS,averagewwt_SJF; //平均带权周转时间
}pro[MaxNum];
while((j<N)&&(pro[i].arrivetime==pro[j].arrivetime)) //判断是否有两个进程同时到达
{
if(pro[j].runtime>pro[i].runtime) {
run_time=pro[i].runtime;
i=j;
}
j++;
}
for(j;j<N;j++)
printf("*********\n\n");
char name[MaxNum]; //进程名称
int arrivetime; //到达时间
int servertime; //开始运行时间
int finishtime; //运行结束时间
int runtime; //运行时间
int runflag; //调度标志
int order; //运行次序
}
return 0;
}
int input(); //进程参数输入
int output(); //调度结果输出
void main()
{
int option;
printf("\n***********************************************\n");
printf("主菜单\n");
相关主题