今天操作系统实验课我们做了作业调度算法的模拟。网上的调度算法参差不齐,零散杂乱。我在这里进行一个总结,并且分享给大家操作系统的五种常用算法(FCFS,SJF,HRRF,HPF,RR)并且附上代码和结果图
作业调度
作业调度又称高级调度,不涉及处理机的分配,主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业调入主存,为其分配内存、I/O设备等必要的资源,并建立相应的进程,安排在就绪队列上,以使进程获得竞争处理机的权利。
算法一:先来先服务(FCFS)
基本思想
·遵循先进入后备队列的作业,先进行调度的原则。
·非抢占式算法
特点
·简单,易于编码实现
·优先考虑作业的等待时间,没有考虑作业的执行时间长短、作业的运行特性和作业对资源的要求
算法二:短作业优先(SJF)
基本思想
·根据作业控制块中作业申请时指出的执行时间,选取执行时间最短的作业优先调度;可有抢占或非抢占方式。
·短作业优先调度算法考虑了作业的运行时间而忽略了作业的等待时间。
算法三:高响应比优先(HRRF)
初衷
·FCFS调度算法只片面地考虑了作业的进入时间,短作业优先调度算法考虑了作业的运行时间而忽略了作业的等待时间。
·响应比高者优先调度算法为这两种算法的折中,使长作业不会长时间等待,但每次调度前都要进行响应比计算。
算法四:优先权高者优先(HPF)
基本思想
·系统根据作业的优先权进行作业调度,每次选取优先权高的作业优先调度。作业的优先权通常用一个整数表示,也叫做优先数。优先数的大小与优先权的关系由系统或者用户来规定,本实验采用优先权值越小,优先权越高。
·优先权高者优先调度算法综合考虑了作业执行时间和等待时间的长短、作业的缓急度、作业对外部设备的使用情况等因素。
算法五:时间片轮转(RR)
基本思想
·系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片结束之后,将该进程加到就绪队列队尾;然后再把处理机分配给就绪队列中新的首进程。
优点
·系统能在给定的时间内响应所有用户请求。
完整代码
有些代码有点重复,可以写个函数调用。在这里不进行优化,易于大家理解。
实验二-job.txt里的内容为
作业ID 到达时间 执行时间 优先权
1 800 50 0
2 815 30 1
3 830 25 2
4 835 20 2
5 845 15 2
6 700 10 1
7 820 5 0
#include
#include
#include
#include
#include
#include
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define inf 0x3f3f3f
using namespace std;
//定义作业信息结构
typedef struct node{
int number; //作业号
int reach_time; //作业抵达时间
int need_time; //作业的执行时间
int privilege; //作业优先权
float excellent; //响应比
int start_time; //作业开始时间
int wait_time; //等待时间
int tr_time; //周转时间
double wtr_time; //带权周转时间
int run_time; //作业累计已执行时间
bool visited;//作业是否被访问过
int finish_time; //作业完成时间
bool reached; //作业是否抵达
}job;
//停顿几秒
void _sleep(int n){
clock_t goal;
goal = (clock_t)n * CLOCKS_PER_SEC + clock();
while(goal>clock());
}
//按任意键继续
char _keygo(){
char c;
printf("按任意键继续.......n");
c = getch();
return c;
}
//数据设置区域
const int MAX_NUM = 10;//最大作业数量
const int MAX_LINE=1024;//一行的size
int num = 0;//实际作业数量
job jobs[MAX_NUM];//作业
//就绪队列
int ready[MAX_NUM];
//记录排序使用哪个数值作为排序对象
int order[MAX_NUM];
void initial_jobs() { //初始化所有作业信息
for(int i=0;i
{
jobs[i].excellent=0;
jobs[i].need_time=0;
jobs[i].number=0;
jobs[i].privilege=0;
jobs[i].reach_time=0;
jobs[i].run_time=0;
jobs[i].start_time=0;
jobs[i].tr_time=0;
jobs[i].visited=false;
jobs[i].wait_time=0;
jobs[i].wtr_time=0;
jobs[i].finish_time=0;
jobs[i].reached=false;
}
}
void read_Jobdata(){ //读取数据文件
FILE *fp;
fp = fopen("G:\实验二-job.txt","r");
if(fp == NULL){ //如果文件不存在,则退出
printf("fail to open the file!n");
exit(0);
}
char buffer[100];
printf("start reading...n");
fgets(buffer,MAX_LINE,fp);
num++;
while(!feof(fp)){
fscanf(fp,"%d%d%d%d",&jobs[num].number,&jobs[num].reach_time,&jobs[num].need_time,&jobs[num].privilege);
num++;
}
num--;
printf("read data success!n");
printf("作业的数量为: %dn",num);
printf("%sn",buffer);
for(int j=1;j<=num;j++)
{
printf("%dt%dtt%dtt%dn"