作业调度算法

先来先服务、短进程优先算法

一.实验目的

通过使用c对先来先服务、短进程优先算法的实现,进一步理解并掌握调度算法的逻辑过程,以及每种算法分别在进程调度和作业调度中的的处理方法.

二.实验原理

先来先服务:该算法在每次调度中,都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为他们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,位置分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

短进程优先:该调度算法是从后备序列中选择一个或若干个估计运行时间最短的作业,将他们调入内存运行。

三.实验流程图

四.程序清单

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
int n; 
float T1=0,T2=0;
int times=0;   
 
struct jcb      //作业控制块 
{   
char name[10];  //作业名  
int reachtime;   //作业到达时间  
int starttime;    //作业开始时间   
int needtime;       //作业需要运行的时间 
int finishtime;       //作业完成时间  
float cycletime;       //作业周转时间  
float cltime;           //作业带权周转时间 
char state;            //作业状态 
struct jcb *next;      //结构体指针
}*ready=NULL,*p,*q; 
 
typedef struct jcb JCB; 
 
void inital()   //建立作业控制块队列,先将其排成先来先服务的模式队列
{
int i;
printf("\n输入作业数:");
scanf("%d", &n);
for (i = 0; i<n; i++)    
{
p = getpch(JCB);       
printf("\n输入作业名:");         
scanf("%s", p->name);      
getchar();        
p->reachtime = i;       
printf("作业默认到达时间:%d", i);      
printf("\n输入作业要运行的时间:");      
scanf("%d", &p->needtime);    
p->state = ‘W‘;    
p->next = NULL;       
if (ready == NULL)  
ready = q = p;      
else
{ 
q->next = p;        
q = p; 
} 
}
}
 
void disp(JCB*q,int m)    //显示作业运行后的周转时间及带权周转时间等
{
printf("\n作业%s正在运行,估计其运行情况:\n",q->name);   
printf("开始运行时刻:%d\n",q->starttime);    
printf("完成时刻:%d\n",q->finishtime); 
printf("周转时间:%f\n",q->cycletime);  
printf("带权周转时间:%f\n",q->cltime);   
getchar();  
}
 
void running(JCB *p, int m)  //运行作业
{
if (p == ready)          //先将要运行的作业从队列中分离出来 
{
ready = p->next;
p->next = NULL;
}
else
{
q = ready;
while (q->next != p)  q = q->next;
q->next = p->next;
}
p->starttime = times;    //计算作业运行后的完成时间,周转时间等等 
p->state = ‘R‘;
p->finishtime = p->starttime + p->needtime;
p->cycletime = (float)(p->finishtime - p->reachtime);
p->cltime = (float)(p->cycletime / p->needtime);
T1 += p->cycletime;
T2 += p->cltime;
disp(p, m);        //调用disp()函数,显示作业运行情况     
times += p->needtime;
p->state = ‘F‘;
printf("\n%s has been finished!\n", p->name);
free(p);          //释放运行后的作业 
getchar();
}
 
void final() //最后打印作业的平均周转时间,平均带权周转时间 
{    
float s,t;   
t=T1/n;  
s=T2/n;   
getchar();   
printf("\n\n作业已经全部完成!\n");   
printf("\n%d个作业的平均周转时间是:%f",n,t);   
printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s); 
} 

void sjf(int m)      // 最短作业优先算法
{     
JCB *min;  
int i,iden;  
system("cls");    
inital();   
for(i=0;i<n;i++)
{          
p=min=ready;
iden=1;  
do{       
if(p->state==‘W‘&&p->reachtime<=times)     
if(iden)
{                  
min=p;
iden=0;    
}              
else if(p->needtime<min->needtime) min=p;          
p=p->next;     
} while (p != NULL);
if(iden)
{        
i--;  
times++;      
if (times>100)
{ 
printf("\nruntime is too long...error"); 
getchar(); 
}
}
else
{
running(min, m);      
}    
}    
final();      
} 

void fcfs(int m)     //先来先服务算法
{ 

int i, iden;   
system("cls");    
inital();     
for (i = 0; i<n; i++)  
{

p = ready;
iden = 1;    
do{
if (p->state == ‘W‘&&p->reachtime <= times)  iden = 0;          
if (iden)p = p->next;
} while (p != NULL&&iden);
if (iden)           
{
i--;     
printf("\n没有满足要求的进程,需等待");         
times++;          
if (times>100)
{ 
printf("\n时间过长"); 
getchar();
}
}
else
{
running(p, m);  
}     
}   
final();      
} 

void menu()
{
int m;   
system("cls");  
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t作业调度演示\n");  
printf("\t\t*********************************************\t\t\n");  
printf("\n\n\n\t\t\t1.先来先服务算法."); 
printf("\n\t\t\t2.最短作业优先算法."); 
printf("\n\t\t\t0.退出程序.");  
printf("\n\n\t\t\t\t选择所要操作:"); 
scanf("%d", &m);
switch (m)  
{
case 1:      
fcfs(m);  
getchar();      
system("cls");  
break;  
case 2:   
sjf(m);   
getchar();    
system("cls");     
break;    
case 0:   
system("cls"); 
break;  
default:   
printf("选择错误,重新选择.");  
getchar();       
system("cls");   
menu();
}
}
int main() 
{       
menu();
system("pause");
return 0;
   }

五.实验结果截图

1.先来先服务算法:

2.短作业优先算法:

六.结果分析

先来先服务算法比较有利于长作业,而不利于短作业。根据先来先服务的实验,短作业C的带权周转时间竟高达100,这是不能容忍的;而长作业D的带权周转时间仅为1.99。就此可知,先来先服务算法有利于CPU繁忙型作业,而不利于I/O繁忙型作业。

根据实验得知,短作业优先调度算法能有效的降低作业的平均等待时间,提高吞吐量。但同时,该算法对长作业不利,更严重的是,如果有一长作业进入系统的后备队列,由于调度程序总是优先调度那些短作业,将导致长作业长期不被调度。该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。

时间: 2024-08-07 07:46:28

作业调度算法的相关文章

Hadoop集群三种作业调度算法介绍

Hadoop集群中有三种作业调度算法,分别为FIFO,公平调度算法和计算能力调度算法先来先服务(FIFO)Hadoop中默认的调度器FIFO,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业.FIFO比较简单,hadoop中只有一个作业队列,被提交的作业按照先后顺序在作业队列中排队,新来的作业插入到队尾.一个作业运行完后,总是从队首取下一个作业运行.这种调度策略的优点是简单.易于实现,同时也减轻了jobtracker的负担.但是它的缺点也是显然的,它对所有的作业都一视同仁,没有考虑

常见的作业调度算法总结

今天被问到操作系统的一些知识,发现自己一个不会,实在还是有点尴尬,之前的学习一直在框架,游戏引擎上,基本上忽略了学校大部分的理论知识-于是最近突然想学学操作系统了-反正也没什么事忙了!! ---------------------------------------- 操作系统是什么?[概念] 是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件 -----这句话感觉意思都懂,但是就是概括不出来- 进程是什么?[概念] 进程是操作系统结构的基础:是一次程序的执行

转 作业调度算法

http://blog.csdn.net/piaojun_pj/article/details/5931324 .先来先服务(FCFS, First Come First Serve)是最简单的调度算法,按先后顺序进行调度. 定义: 按照作业提交或进程变为就绪状态的先后次序,分派CPU: 当前作业或进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式). 在作业或进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程出让CPU. 适用场景: 比较有利于长作业,而不利于短作业.

短作业调度算法

#include <stdio.h> struct sjf //定义进程的结构体{  char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime;  //开始时间 float finishtime; //完成时间 float zztime; //周转时间 float dqzztime; //带权周转时间 };  sjf b[100]; //定义短作业优先算法进程的最大数量 voi

YARN中用的作业调度算法:DRF(Dominant Resource Fairness)

在Mesos和YARN中,都用到了dominant resource fairness算法(DRF),它不同于hadoop基于slot-based实现的fair scheduler和capacity scheduler,论文阅读:Dominant Resource Fairness: Fair Allocation of Multiple Resource Types .考虑在一个包括多种资源类型(主要考虑CPU和MEM)的系统的公平资源分配问题,其中不同用户对资源有不同的需求.为了解决这个问题

【Linux】 进程调度算法

Linux中的进程调度算法分类如下: 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法(FCFS) 先来先服务(First Come First Service,FCFS)调度算法是一种最简单的.不可抢占式的调度算法,既可用于作业调度,也可用于进程调度.该算法按照进程进入就绪队列的先后顺序选择可以占用处理器的进程.每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度

常见进程调度算法

常见进程调度算法 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理

操作系统中常见的调度算法

一.先来先服务调度算法 先来先服务的调度算法(FCFS)是一种最简单的调度算法,该算法既可以用于作业调度,也可以用于进程调度.当在作业调度中采用该算法时,每次都是从后备作业队列选择一个或多个最先进入该队列的作业,将他们调入内存,为他们分配内存,为他们分配资源,创建进程,然后放入就绪队列中.在进程中采用FCFS算法时,则每次调度室从就绪队列中选择一个最先进入该队列的进程,位置分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. FCFS调度算法有利于cpu繁忙型的作业,

常见的几种操作系统进程调度算法

什么是进程调度算法??? 进程调度算法:根据系统的资源分配策略所规定的资源分配算法. 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理