OS作业调度中HRN的模拟实现

常用的作业调度算法有先来先服务算法、短作业优先算法、响应比高者算法、优先级调度算法和均衡调度算法等,我们这里采用高响应比优先调度算法(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问题也未考虑,望读者自行补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值