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

{

p=p->next; has=0; } }

if(has==0) /*输入作业名不存在*/ {

printf(\输入作业名错误!请重新输入!\\n\ input2(); } }

void init_sub() /*自动初始化空闲分区表*/ {

r=gettype(SUB);

strcpy(r->name,\r->addr=5; r->size=10; r->state='n'; sub=r; sub->pre=NULL;

s=gettype(SUB);

strcpy(s->name,\s->addr=20; s->size=120; s->state='n'; sub->next=s;

s->pre=sub; r=s;

r->next->next=NULL;

} void init_manual() /*手动初始化空闲分区表*/ {

int i,num3; char

s[][10]={\five\en\

printf(\请输入初始化空间块数,最大值10:\

scanf(\ for(i=0;i

{

r=gettype(SUB); printf(\块号:%s\\n\ strcpy(r->name,s[i]);

printf(\输入块首地址:\ scanf(\

printf(\输入块的大小:\ scanf(\ r->state='n';

r->next=NULL;

initsort(); /*按首尾将分区表连

s=gettype(SUB); 接起来*/ strcpy(s->name,\ }

s->addr=160; s->size=40; s->state='n'; printf(\按任一键继续......\\n\ r->next=s; s->pre=r; r=s;

s=gettype(SUB);

getchar(); }

strcpy(s->name,\

s->addr=220; s->size=10; s->state='n'; void disp() /*空闲分区表的显示函数 r->next=s;

s->pre=r; r=s;

*/

{

printf(\分区 首地址 长度 状态 \\n\ r=sub;

s=gettype(SUB);

strcpy(s->name,\

s->addr=250; s->size=20; s->state='n'; while(r!=NULL) r->next=s; { s->pre=r;

37

printf(\%s\\t\\t%d\\t\\t%d\\t\\t%c\\n\r->name,r->addr,r->size,r->state); r=r->next; }

printf(\ }

void disp2() /*显示已分配内存的作业表函数*/ {

printf(\作业名 首地址 长度 状态 \\n\ p=as;

while(p!=NULL) {

printf(\%s\\t\\t%d\\t\\t%d\\t\\t%c\\n\p->name,p->addr,p->size,p->state); p=p->next; }

printf(\}

void firstfit(JCB *pr) /*首次适应算法对作业分区*/

{

r=sub; /*从空闲表头开始寻找*/ while(r!=NULL) {

if(((r->size)>(pr->size))&&(r->state=='n')) /*有空闲分区大于作业大小的情况*/

{

system(\ system(\

flag=1; /*分配成

功标志位置1*/ q=pr; //q是已分配作业队列头指针 q->state='r'; lastsort(); /*对已分配作业按先后次序形成链表*/

printf(\作业%s的分区为[%s],首地址为%d.\\n\

break;

}

else

if(((r->size)==(pr->size))&&(r->state=='n')) /*有空闲分区等于作业大小的情况*/

{

pr->addr=r->addr;

flag=1; /*分配成功标

志位置1*/ q=pr;

lastsort(); /*插入已分配作业队列*/ //空闲分区已完成分配,应删除

if(r->pre==NULL) //该分区处在链表头

{

sub=r->next; r->next->pre=NULL; }

if(r->next==NULL)

//该分区处在链表尾 {

r->pre->next=NULL; }

else

//该分区处在链表中间 {

r->pre->next=r->next;

r->next->pre=r->pre; }

printf(\作业%s的分区为

pr->addr=r->addr;

r->size-=pr->size; //

更新空闲分区大小 r->addr+=pr->size; //更新空闲分区地址

38

[%s],首地址/*有下邻又有上邻*/ { s->size+=pr->size;

r->pre->next=r->next; //合并上下邻需把指针指向下邻的下一个区域 邻标志位置1*/

}

isup=1; /*上

为%d.\\n\ break; } else

{ r=r->next;

}

flag=0; }

break;

else /*

if(flag==0) /*作业过大的情况*/

{

printf(\作业%s长度过大,内存不足,分区分配出错!\\n\ is=1; }

void reclfirst(JCB *pr) /*首次适应作业区域回收算法*/ {

SUB *k; r=sub;

while(r!=NULL) {

}

继续搜索可能的上邻*/

{

s=s->next; isup=0; /*

上邻标志位置0*/ } }

if(isup==0) /*有下邻无上邻*/

{

r->addr=pr->addr;

r->size=pr->size; } break; }

else { r=r->next; 位置0*/

isdown=0; /*下邻标志

if(r->addr==((pr->addr)+(pr->size))) /*作业回收区域有下邻*/ {

pr->size+=r->size; s=sub;

isdown=1; /*下邻标志

} }

if(isdown==0) /*区域无下邻*/ {

s=sub;

while(s!=NULL)

{

位置1*/ while(s!=NULL)

{ if(((s->addr)+(s->size))==(pr->addr)) /*无下邻但有上邻*/ if(((s->addr)+(s->size))==(pr->addr)) {

39

s->size+=pr->size;

r->pre->next=k;

k->pre=r->pre; r->pre=k;

k->next=r; } break; } else

{

r=r->next;

/*上邻空间+作业释放空间=新的区域空间*/ isup=1; /*上邻标志位置1*/

break; } else {

}

s=s->next;

isup=0; /*上邻

标志位置0*/

}

} }

if(isup==0) /*无下邻且无上邻*/

{ k=gettype(SUB); /*重新生成一个新的分区结点*/

if(r==NULL) /*新分区插入内存空间尾节点*/

{

s=sub;

strcpy(k->name,pr->name); while(s->next!=NULL) /*新空间名字*/ s=s->next;

k->addr=pr->addr; k->size=pr->size; k->state='n'; r=sub;

while(r!=NULL) {

s->next=k; k->pre=s;

k->next=NULL; } }

%s

if((r->addr)>(k->addr)) /*按分区首地址排列,回收区域插在合适的位置*/

{

if(r==sub)

}

printf(\区收.\}

/*新分区插入内存空间首节点*/ {

k->next=r; r->pre=k; sub=k;

void print() //初始化界面 {

printf(\

printf(\*************\\n\

printf(\主存空间的分配与回收演示\\n\

printf(\ <<首次适应算法>>\\n\

printf(\

/*更新空闲队列首指针*/ k->pre=NULL;

}

else

/*新分区插入内存空间中间*/ {

40