常用的作业调度算法有先来先服务算法、短作业优先算法、响应比高者算法、优先级调度算法和均衡调度算法等,我们这里采用高响应比优先调度算法(HRN)。
C语言代码(不完全):
#include <windows.h>
#include "string.h"
#define n 10
typedef struct jcb
{
char name[4]; //作业名
int length; //作业长度,所需内存大小
int printer; //作业执行所需打印机的数量
int tape; //作业执行所需磁带机的数量
int runtime; //作业估计执行时间
int waittime; //作业在系统中的等待时间
int next; //指向下一个作业执行块的指针
}JCB;
int head; //作业队列头指针定义
int tape,printer;
long memory;
JCB jobtable[n]; //作业表
int jobcount=0; //系统内现有作业数量
void schedule() //作业调度函数
{
float xk,k;
int p,q,s,t;
do
{
p=head;
q=s=-1;
k=0;
while(p!=-1)
{
if(jobtable[p].length<=memory && jobtable[p].tape<=tape && jobtable[p].printer<=printer)
{
//系统可用资源是否满足作业需求
xk=(float)(jobtable[p].waittime)/jobtable[p].runtime;
if(q==0||xk>k)
{
k=xk;
q=p;
t=s;
}//if
}//if
s=p;
p=jobtable[p].next;
}//while
if(q!=-1)
{
if(t==-1)
head=jobtable[head].next;
else
jobtable[t].next=jobtable[q].next;
//为作业q分配资源;分配内存空间;分配磁带机;
memory=memory-jobtable[q].length;
tape=tape-jobtable[q].tape;
printer=printer-jobtable[q].printer;
printf("选中作业的作业名: %s\n",jobtable[q].name);
Sleep(jobtable[q].runtime*100); //模拟工作时间
}
}while(q!=-1);
}//作业调度函数结束
main()
{
char name[4];
int size,tcount,pcount,wtime,rtime;
int p;
memory=65536;
tape=4;
printer=5;
head=-1;
printf("输入作业相关数据(以作业大小为负数停止输入)):\n");
//输入数据,建立作业队列
printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n");
scanf("%s%d%d %d %d %d",name,&size,&tcount,&pcount,&wtime,&rtime);
while(size>=0)
{
if(jobcount<n)
p=jobcount;
else
{
printf("无法再创建作业\n");
break;
}
jobcount++;
//填写改作业相关内容
strcpy(jobtable[p].name,name);
jobtable[p].length=size;
jobtable[p].printer=pcount;
jobtable[p].tape=tcount;
jobtable[p].runtime=rtime;
jobtable[p].waittime=wtime;
//挂入作业队列队首
jobtable[p].next=head;
head=p;
//输入一个作业数据
printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n");
scanf("%s%d%d %d %d %d",name,&size,&tcount,&pcount,&wtime,&rtime);
}
schedule();
}
这个代码有一些缺点,一是无法在程序运行后释放主存空间,二是程序为单道批处理,多道批处理尚未考虑,多线程后的deadlock问题也未考虑,望读者自行补充。