- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作统实验一可变分区存储管理
可变分区存储管理
可变分区存储管理结构数组的形式:
struct map {
unsigned m_size; //空间大小
char * m_addr; //起始地址
};
struct map coremap[N];
源程序和执行结果。
#include conio.h
#include stdio.h
struct map
{
unsigned m_size;
char *m_addr;
};
struct map coremap[1000];
struct map *pp;
void print_map();
void main();
char *lmalloc(struct map *mp, unsigned size);
void lfree(unsigned size, char *aa);
struct map coremap[1000];
struct map *pp;
char* lmalloc(struct map *mp, unsigned size)
(
register int a;
register struct map *bp;
int paddr=pp-m_addr;
bp=pp;
if (mp-m_size==0)
return(0);
if (!bp-m_size)
bp=mp;
do
{
if (bp-m_size = size)
{
a=bp-m_addr;
bp-m_addr+=size;
pp=bp;
if ((bp-m_size-=size) == 0)
do
{
bp++;
(bp-1)-m_addr=bp-m_addr;
}while((bp-1)-m_size=bp-m_size);
return (a);
}
bp++;
if (!bp-m_size)
bp=coremap;
}while(bp-m_addr !=paddr);
return (0);
}
void lfree(unsigned size, char *aa) //释放空间并注意当前指针位置
{
struct map *bp;
char *a,*t;
unsigned tt;
a=aa;
for (bp=coremap; bp-m_addr=abp-m_size!=0; bp++);
if (bpcoremap(bp-1)-m_addr+(bp-1)-m_size==a)
{
(bp-1)-m_size+=size;
if (a+size==bp-m_addr)
{
if (pp==bp)
pp=(bp-1);
(bp-1)-m_size+=bp-m_size;
while(bp-m_size)
{
bp++;
(bp-1)-m_addr=bp-m_addr;
(bp-1)-m_size=bp-m_size;
}
}
}
else
{
if (a+size==bp-m_addrbp-m_size)
{
bp-m_addr-=size;
bp-m_size+=size;
}
else
{
if (size)
do{
t=bp-m_addr;
bp-m_addr=a;
a=t;
tt=bp-m_size;
bp-m_size=size;
bp++;
}while(size=tt);
}
}
}
void print_map() //显示
int n;
if (coremap[0].m_size==0)
printf(The memory has been run out!);
for (n=0; coremap[n].m_addr!=NULL; n++)
{
printf(%dth Addr is %d,Size is %d\n,n,coremap[n].m_addr,coremap[n].m_size);
}
}
void main(){
char ch;
int a,b,c;
coremap[0].m_size=1000;
coremap[0].m_addr=500;
pp=coremap;
while(1)
{
print_map();
do
ch=getchar();
while(ch==\n||ch==\t||ch== );
switch(ch)
{
case m:
{
scanf(%d,a);
c=lmalloc(coremap,a);
if (c==0)
printf(The memory has been run out!\n);
break;
}
case f:
{
scanf(%d %d,a,b);
lfree(a,(int *)b);
break;
}
case x:
exit(0);
}
}
}
文档评论(0)