可变分区存储管理.docx

上传人:b****5 文档编号:8483684 上传时间:2023-01-31 格式:DOCX 页数:15 大小:178.36KB
下载 相关 举报
可变分区存储管理.docx_第1页
第1页 / 共15页
可变分区存储管理.docx_第2页
第2页 / 共15页
可变分区存储管理.docx_第3页
第3页 / 共15页
可变分区存储管理.docx_第4页
第4页 / 共15页
可变分区存储管理.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

可变分区存储管理.docx

《可变分区存储管理.docx》由会员分享,可在线阅读,更多相关《可变分区存储管理.docx(15页珍藏版)》请在冰豆网上搜索。

可变分区存储管理.docx

可变分区存储管理

实验一可变分区存储管理

一、实验内容

编写程序模拟内存分配与回收的过程。

二、实验目的

1.加深对可变分区的存储管理的理解;

2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:

指针和指针作为函数参数;

3.掌握用指针实现链表和在链表上的基本操作。

三、实验题目

编写一个C程序,用char*malloc(unsignedsize)函数向系统申请一次内存空间(如size=1000,单位为字节),

模拟可变分区内存管理,实现对该内存区的分配和释放管理。

(1)设计思路

用char*malloc(unsignedsize)函数向系统申请一次内存空间(如size=1000,单位为字节),用循环首次适应法addr=(char*)lmalloc(unsignedsize)和lfree(unsignedsize,char*addr)模拟UNIX可变分区内存管理,实现对该内存区的分配和释放管理。

(2)循环首次适应算法

模拟UNIX的进程管理程序采用的是循环首次适应算法,具体算法如下:

系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。

(3)数据结构

(4)系统总体框图

4、源程序代码

#include

#include

#include

#include

#include

#definegetpch(type)(type*)malloc(sizeof(type))

#definemaxm600/*最大内存空间*/

#definenull0

structspd{/*分区说明表*/

intj;/*分区名*/

intlen;/*大小*/

charstate;/*状态:

'e','f','a'*/

intsaddre;/*起始地址*/

structspd*next;

}*rspd=null,*p;

structjcb{

charname[10];

intxk;

intsadd;

structjcb*next;

}*jp,*ready;

typedefstructspdSPD;

typedefstructjcbJCB;

voidmainmenu();

voidinput();

voiddisp0();

voiddisp();

voidinitm();

voidallationm();

voidfreem();

voidinitm()

{/*初始化*/

p=getpch(SPD);

p->j=1;

p->len=maxm;

p->state='e';

p->saddre=0;

rspd=p;

rspd->next=null;

}

voiddisp2()

{

JCB*first;

inti=0;

first=ready;

if(ready!

=null)

{

printf("\n内存中现有作业:

\n");

while(first!

=null)

{

printf("%s\t",first->name);

i++;

if(i==5)printf("\n");

first=first->next;

}

}

elseprintf("内存中无作业.\n");

}

voidinput()

{JCB*first;

intxk;

charname[10];

 

first=ready;

printf("\n请输入作业名:

");

scanf("%s",&name);

while(first!

=null){

if(strcmp(name,jp->name)==0)

{

printf("\n此文件名已存在,请重新输入:

");

scanf("%s",&name);

}

elsefirst=first->next;

}

first=ready;

printf("\n请输入作业所需的内存空间:

");

scanf("%d",&xk);

if(xk>600||xk<0){

printf("\n请重新输入作业所需的内存空间:

");

scanf("%d",&xk);

}

jp=getpch(JCB);

strcpy(jp->name,name);

jp->xk=xk;

jp->sadd=null;

if(ready==null){/*排序*/

ready=jp;

ready->next=null;

}

else{

while(first->next!

=null){

first=first->next;

}

first->next=jp;

first=first->next;

first->next=null;

}

}

voidallationm()

{

intflag=0;

SPD*first;

first=rspd;

input();

while(first!

=null){

if(first->state=='e'&&first->len>=jp->xk){

jp->sadd=first->saddre;

first->state='f';

if(first->len>jp->xk){

p=getpch(SPD);

p->j=first->j+1;

p->len=first->len-jp->xk;

first->len=jp->xk;

p->saddre=first->saddre+jp->xk;

p->state='e';

p->next=first->next;

first->next=p;

flag=1;

while(p->next!

=null){

p->next->j=p->next->j+1;

p=p->next;

}

}

}

elsefirst=first->next;

if(flag==1)break;

}

if(first==null){

printf("内存不足.\n");

getch();

}

}

voidfreem()

{JCB*first,*second,*pp;

SPD*pre;

intadd=null,i;

intflag=0,flag1=0;

longtemp;

 

disp2();

printf("\n请输入要撤销的作业名:

");

jp=getpch(JCB);

scanf("%s",&jp->name);

jp->sadd=null;jp->xk=null;jp->next=null;

pre=rspd;

p=pre->next;

first=ready;

second=first->next;

/*寻找要撤销的作业,并撤销它*/

if(strcmp(first->name,jp->name)==0)

{

flag=1;

ready=second;

first->next=null;

add=first->sadd;

free(first);

}

while(flag==0&&second!

=null)

{

if(strcmp(second->name,jp->name)==0)

{

flag=1;

first->next=second->next;

second->next=null;

add=second->sadd;

free(second);

break;

}

if(second->next!

=null){

first=first->next;

second=second->next;

}

elsebreak;

}

/*找出作业的内存地址,释放之*/

if(add==pre->saddre&&flag==1){

flag1=1;

pre->state='e';

if(p->state=='e')

{

pre->len=p->len+pre->len;

pre->next=p->next;

p->next=null;

while(pre->next!

=null){

pre->next->j=pre->next->j-1;

pre=pre->next;

}

free(p);

}

}

while(flag==1&&flag1==0&&p!

=null)

{

i=add;

pp=ready;

if(add==p->saddre){

flag1=1;

p->state='e';

if(pre->state=='e'){

if(p->next!

=null&&p->next->state=='e'){

pre->len=pre->len+p->len+p->next->len;

pre->next=p->next;

p->next=null;

free(p);

p=pre->next;

pre->next=p->next;

p->next=null;

free(p);

p=rspd;

while(pre->next!

=null){

pre->next->j=pre->next->j-2;

pre=pre->next;

}

}

else{

pre->len=p->len+pre->len;

pre->next=p->next;

p->next=null;

free(p);

while(pre->next!

=null){

pre->next->j=pre->next->j-1;

pre=pre->next;

}

}

}

else{

if(p->next!

=null&&p->next->state=='e'){

p->len=p->len+p->next->len;

p->state='e';

pre=p->next;

p->next=p->next->next;

pre->next=null;

free(pre);

while(p->next!

=null){

p->next->j=p->next->j-1;

p=p->next;

}

}

elsep->state='e';

}

}/*if*/

if(flag1==1)break;

p=p->next;

pre=pre->next;

}/*while*/

if(flag==0)printf("\n作业不存在,无法撤消.\n");

if(flag1==1)

{printf("\n...正在撤消\n");

for(temp=1;temp<=30000000;temp++)

{};

printf("作业撤消完毕.\n");

}

free(jp);

disp0();

voiddisp0()

{/*显示空闲链表*/

JCB*first;

first=ready;

printf("\n主存空间的分配情况为:

\n");

printf("分区号作业名起始地址分区大小分配情况\n");

p=rspd;

while(p!

=null){

printf("%4d",p->j);

if(ready!

=null&&p->state=='f')

{

if(first!

=null)

{

printf("\t%s",first->name);

first=first->next;

}

}

if(p->state=='e')

printf("\t\t%4dkB",p->saddre);

else

printf("\t%4dkB",p->saddre);

printf("\t%4dkB",p->len);

if(p->state=='e')printf("未分配");

if(p->state=='f')printf("已分配");

printf("\n");

p=p->next;

}

}

voiddisp()

{disp0();

printf("按任意键返回选择执行操作.\n");

getch();

}

voidmain()

{/*界面*/

initm();

intc;

printf("****************************\n");

printf("*主存空间的分配与回收*\n");

printf("****************************\n");

printf("1.分配内存2.回收内存3.显示分配4.退出\n");

while

(1)

{

printf("\n请选择要执行的操作(1~4):

");

scanf("%d",&c);

if(c>4||c<1)

{

printf("输入错误,请重新输入:

\n");

continue;

}

switch(c){

case1:

allationm();break;

case2:

if(ready!

=null)freem();

else{printf("\n内存中没有作业.\n");

getch();

}

break;

case3:

disp();break;

case4:

gotoend;

}

}

end:

getchar();

}

5、程序运行时初值和运行结果

1.运行结果

(1)初始界面

(2)分配内存演示结果

(3)显示分配演示结果

(4)回收内存演示结果

6、实验总结

通过本次实验加深了对循环首次适应算法,内存分配与回收的机制的理解,也巩固了C++程序语言设计的基础。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1