进程调度 作业调度 主存空间的分配与回收 文件系统 下载本文

《作业登记设计》

数据结构:使用链指针把所有的作业链成一条链,用指针实现分区分配和链接。 初始作业队列: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 #include #include #include #define

状态

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