资源简介
自己写的代码和实验报告,模拟了在批处理系统中的作业调度。适于操作系统初学者理解操作系统中的作业调度原理。(希望朋友们先根据要求自己实现代码,然后再参考我的代码。)
代码片段和文件信息
#include
#include
#define n 10 //后备队列中JCB的最大数量
//作业控制块
typedef struct
{
char name[4]; //作业名
int length; //作业长度
int printer; //打印机数量
int tape; //磁带机数量
int runtime; //运行时间
int waittime; //等待时间
int next; //指针
} JCB;
//后备队列(对结构)
JCB jobTable[n]; //作业表
int jobCount; //作业表中当前作业数量
int head; //作业表头指针
//初始化函数
void Init()
{
head=-1;
jobCount=0;
}
//入队函数
void PushQueue(JCB job)
{
if(jobCount>=n)
{
printf(“队列已满,不能加入\n“);
return;
}
if(head==-1)
head=0;
jobTable[jobCount].length=job.length;
strcpy(jobTable[jobCount].namejob.name);
jobTable[jobCount].printer=job.printer;
jobTable[jobCount].runtime=job.runtime;
jobTable[jobCount].tape=job.tape;
jobTable[jobCount].waittime=job.waittime;
jobTable[jobCount-1].next=jobCount;
jobTable[jobCount].next=-1;
jobCount++;
}
//出队函数
void PopQueue(int num)
{
if(jobCount==0)
{
printf(“空队不能出队“);
return;
}
if(num>=jobCount)
{
printf(“队列中不存在该元素“);
return;
}
if(jobCount==1)
{
head=-1;
jobTable[0].next=-1;
jobCount=0;
}
else
{
jobTable[num-1].next=jobTable[num].next;
jobTable[num].next=-1;
jobCount--;
}
}
//系统资源
int memory=65536; //主存大小64MB,65536KB
int tape=4; //磁带机数量
int printer=2; //打印机数量
//作业调度函数
void Schedule()
{
int currJobmaxJob;
double currJobRatiomaxJobRatio;
while(head!=-1)
{
currJob=maxJob=head;
currJobRatio=maxJobRatio=0;
//找出响应比最大的作业
while(1)
{
//找出满足资源的作业
if(jobTable[currJob].length<=memory && jobTable[currJob].printer<=printer && jobTable[currJob].tape<=tape)
{
currJobRatio=(double)jobTable[currJob].waittime/jobTable[currJob].runtime; //计算响应比
if(currJobRatio>maxJobRatio)
{
maxJobRatio=currJobRatio;
maxJob=currJob;
}
}
if(jobTable[currJob].next==-1)
break;
else
currJob=jobTable[currJob].next;
}
//输出响应比最大的作业、分配资源
if(maxJobRatio!=0)
{
memory-=jobTable[maxJob].length;
tape-=jobTable[maxJob].tape;
printer-=jobTable[maxJob].printer;
printf(“选中作业的作业名为:%s\n“jobTable[maxJob].name);
PopQueue(maxJob);
}
}
}
void main()
{
//用于作业的临时变量
char tmp_name[4];
int tmp_length;
int tmp_printer;
int tmp_tape;
int tmp_runtime;
int tmp_waittime;
int tmp_count; //记录输入作业数量
JCB tmp_job; //临时作业变量
printf(“请输入作业相关信息,以作业名为Q为输入结束。\n\n按任意键进入输入模式:“);
getchar();
Init();
while(1)
{
tmp_count=1;
if(tmp_count>n)
{
printf(“达到最大作业数,输入结束。“);
break;
}
//输入作业名、作业大小、磁带机数、打印机数、估计执行时间、等待时间
printf(“作业名:“);
scanf(“%s“tmp_name);
if(strcmp(tmp_name“Q“)==0||strcmp(tmp_name“q“)==0)
break;
printf(“作业大小:“);
scanf(“%d“&tmp_length);
printf(“磁带机数:“);
scanf(“%d“&tmp_printer);
printf(“打印机数:“);
scanf(“%d“&tmp_tape);
printf(“估计运行时间:“);
scanf(“%d“&tmp
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3690 2009-11-30 17:23 批处理系统的作业调度\JobSchedule.c
文件 42496 2009-12-04 22:26 批处理系统的作业调度\实验报告.doc
文件 133632 2009-12-04 22:28 批处理系统的作业调度\实验要求.doc
目录 0 2009-12-04 22:28 批处理系统的作业调度
----------- --------- ---------- ----- ----
179818 4
评论
共有 条评论