《作业登记设计》
数据结构:使用链指针把所有的作业链成一条链,用指针实现分区分配和链接。 初始作业队列:ready指针指向队列首地址
已分配作业队列:as指向已分配作业队列首地址 作业大小: 记录作业块需求大小
作业状态 w:等待分配 r:作业已分配合适内存块 作业分配内存首址:记录分配分区首地址 作业下一指针:链接下一个作业 struct jcb{
char name[10]; //作业名字 char state; //作业状态
int ntime; //所需时间
int size; //所需空间大小
int addr; //所分配分区的首地址 struct jcb *next; //作业队列下一指针
} *ready =NULL, *p,*q,*as=NULL; //作业队列指针ready,已分配作业队列指针as typedef struct jcb JCB
作业分配过程:
迭代查找主存空间 查找完毕退出 主存空间>作业大小? Y 分配成功 修改有关数据结构 N 主存空间=作业大小? 继续查找下一作业 Y 分配成功 N 主存空间<作业大小? Y 分配失败 修改有关数据结构 33
3、 程序流程图
4、 程序源代码
#include
状态
int ntime; //所需
显示空闲分区 作业分配 作业回收 退出 主菜单 主存自动初始化 主存手动分配 开始 调用显示函数 首次适应算法对作业分配空间 回收指定的作业 gettype(type)
时间 int size; //所需空间大小
int addr; //所分配分区的首地址 struct jcb *next; //作业队列下一指针 }
*ready
=NULL,
(type*)malloc(sizeof(type))
#define NULL 0
int num,num2; //要调度的作业数和要回收的区域数
int m=0; //已分配作业数 int flag; //分配成功标志 int isup,isdown; //回收区域存在上邻和下邻的标志 int is=0;
struct jcb{ 名字
char name[10]; //作业char state; //作业
*p,*q,*as=NULL; //作业队列指针ready,已分配作业队列指针as
typedef struct jcb JCB;
struct subarea{ //分区块 char name[10];
34
int addr; // first=first->next;
second=second->next; } }
if(insert==0)first->next=s;
分区首地址 int size; //分区大小 char state; //分区状态
struct subarea *pre; //
/*插在队尾*/
} }
void firstsort() /*对新建作业队列按从先到后连接*/ {
JCB *first;
if(ready==NULL) ready=p; else
{
first=ready;
while(first->next!=NULL){ first=first->next; } first->next=p; p->next=NULL; } }
void lastsort() /*对已分配作业队列按先后次序连接*/ {
JCB *fir;
if(as==NULL) as=q; else {
fir=as;
while(fir->next!=NULL){ fir=fir->next; } fir->next=q; q->next=NULL; } m++; }
空闲分区前一指针 struct subarea *next; //空闲分区后一指针
} *sub=NULL,*r,*s,*cur; //空闲分区队列指针sub,当前分区首指针cur
typedef struct subarea SUB;
void sort_sub() /*对空闲分区按从小到大排序*/ { SUB *first,*second; int insert=0;
if((sub==NULL)||((s->size)<(sub->size))) /*插在队列之首*/ { s->next=sub;
sub=s; }
else { first=sub; /*寻找适当的位置插入*/ second=first->next;
while(second!=NULL) {
if((s->size)<(second->size))
{
s->next=second; first->next=s; second=NULL; insert=1; } else {
35
void initsort() /*按先后次序建立空间双向链表*/ { SUB *temp;
if(sub==NULL) { } else { }
temp=sub;
while(temp->next!=NULL) {
temp=temp->next; sub=r;
sub->pre=NULL;
firstsort(); /* 调用firstsort函数对作业队列按从先到后排序*/ }
printf(\按任一键继续......\\n\ getchar(); }
void input2() /*建立要回收区域的函数*/ {
JCB *k; int has;
q=gettype(JCB);
printf(\输入区域名(作业名):\ scanf(\
p=as; //as是已分配作业队列首指针
while(p!=NULL) {
if(strcmp(p->name,q->name)==0) /*在已分配作业队列中寻找*/
{
q->addr=p->addr; q->size=p->size;
has=1; /*输入作业名存在标志位*/
if(p==as) as=p->next; /*在已分配作业队列中删除该作业*/ else {
k=as;
while(k->next!=p)
}
temp->next=r; r->pre=temp; r->next=NULL;
}
void input() /* 建立作业控制块函数*/ {
int i;
printf(\请输入要调度的总作业数:\
scanf(\ for(i=0;i printf(\作业号No.%d:\\n\ p=gettype(JCB); printf(\输入作业名:\ scanf(\ printf(\输入作业的大小:\ scanf(\ printf(\输入作业所需运行时间:\ scanf(\ p->state='w'; p->next=NULL; k=k->next; k->next=k->next->next; /*删除*/ } printf(\输出该作业首地址:%d\\n\ printf(\输出该作业大小:%d\\n\\n\ q->next=NULL; break; } else 36