模拟操作系统作业管理

javaadu
博客专家认证
2010-12-08 08:20:12
/***************************************************************************************************/
//程序功能:完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法
//数据结构:本程序使用的数据结构为静态链表,链表的每个元素为一个作业控制块,
// 每个作业控制块为一个结构体,包括数据部分和指针区域,指针类型为该
// 结构体类型。
//算法策略:采用高响应比优先调度算法进行调度时,要做到三条:(1)、找出所有满足条件的
// 作业,并计算出它们各自的响应比,其中,响应比=(作业估计执行时间+作业等待时间)/作业执行时间
// (2)、从中选择一个响应比最高的队列,并将之摘出链表,并输出响应的作业名
// 系统为之分配的各类资源;(3)、用同样的方法选择第二个、第三个。。。直到不再有满足条件的队列。
//作 者:杜琪
//时 间:2010-12-07
//版 本:2.0
/*****************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
//假定系统中可容纳的作业数量为n
#define Max 10
//一个作业控制块节点的数据结构定义
typedef struct
{
char name;//作业名
int length;//作业长度,需要主存大小
int printer;//作业执行需要打印机的数量
int tape;//作业执行需要磁带机的数量
int runtime;
int waittime;
int next;//指向下一个作业控制块的指针
}Jcb;
Jcb JcbList[Max];

//系统各种类型的资源资源,暂先分配内存空间,在main函数中初始化
int tape,printer;
long memory;
//系统中现有作业的数量
int JobCount=0;
//作业队列头指针定义
int head;

int main()
{
void Schedule();
char name;
int pcount,tcount,rtime,wtime,size;
int p;
//系统数据初始化
tape=4;
printer=2;
memory=65536;
head=-1;
size=1;
printf("输入作业相关数据(以作业大小为负数停止输入):\n");
//输入数据,建立作业队列
// printf("依次输入作业名,作业大小,磁带机数,打印机数,估计执行时间,等待时间:\n");
// scanf("%c,%d,%d,%d,%d,%d",&name,&size,&tcount,&pcount,&rtime,&wtime);
while(size>0)
{
printf("依次输入作业名,作业大小,磁带机数,打印机数,估计执行时间,等待时间:\n");
scanf("%c,%d,%d,%d,%d,%d",&name,&size,&tcount,&pcount,&rtime,&wtime);
if(JobCount<Max)
{
p=JobCount;
}
else
{
printf("无法再创建作业\n");
break;
}
JobCount++;
//填入该作业的相关内容
JcbList[p].name=name;
JcbList[p].length=size;
JcbList[p].printer=pcount;
JcbList[p].tape=tcount;
JcbList[p].runtime=rtime;
JcbList[p].waittime=wtime;

JcbList[p].next=head;
head=p;
}
Schedule();
return 0;
}

//作业调度函数的定义
void Schedule()
{
float xk,k;
//利用q来记录找到的满足条件的作业
//利用s来辅助p遍历整个队列,s始终指向p的前一个节点
int p,q,s,t;
do
{
p=head;//
q=s=-1;
k=0;
while(p!=-1)//p非空
{
if(JcbList[p].length<=memory &&
JcbList[p].tape<=tape &&
JcbList[p].printer<=printer)//如果满足条件
{
xk=(JcbList[p].waittime+JcbList[p].runtime)/(JcbList[p].runtime);//计算p指向的作业的响应比
if(q==-1 || xk>k)//如果p是第一个满足条件的作业或者q的响应比小于p的响应比
{
k=xk;
q=p;
t=s;
}
}
s=p;
p=JcbList[p].next;//指针p后移
}
if(q!=-1)
{
if(t==-1)//q是作业链表的第一个
{
head=JcbList[head].next;
}
else
{
JcbList[t].next=JcbList[q].next;
}
memory=memory-JcbList[q].length;
tape=tape-JcbList[q].printer;
printer=printer-JcbList[q].printer;
printf("选中的作业名:%c\n",JcbList[q].name);
}
}while(q!=-1);
}

我的问题如下:
1、如图,我在输入的第二个作业控制块信息没有按预想的存放在JcbList[1]中,而是发生延迟,存放在了JcbList[2]中

2、如图,在第二次输入完以后,它会连续出现两个提示输入信息
...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaadu 2010-12-08
  • 打赏
  • 举报
回复
图怎么传呢???
Trinx 2010-12-08
  • 打赏
  • 举报
回复
无能为力,只能帮你顶贴!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧