资源描述
操作系统:实验一 可变分区存储管理
/* 如不会使用文件输入/输出,也不会使用I/O转向做输入和输出结果文件, 可以手再抄输出结果后后再输到文件中,实验报告的文字内容由自己掌握, 能多能少。*/#include <stdio.h>#include <malloc.h> /* 表的定义 */#define N 5struct map { unsigned m_size; char *m_addr;};struct map coremap[N];/* 首次适应的分配函数 */char *fmalloc(unsigned size){ register char *a; register struct map *bp; for (bp = coremap; bp->m_size; bp++) { if(bp->m_size >= size) { a = bp->m_addr; bp->m_addr += size; 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); } } return(0);}/* 首次适应的释放函数 */ffree(unsigned size, char *aa){ struct map *bp; char *a, *t; unsigned tt; a = aa; for (bp=coremap; bp->m_addr<=a && bp->m_size!=0; bp++); if (bp>coremap && (bp-1)->m_addr+(bp-1)->m_size == a) { /* 情况1,2 */ (bp-1)->m_size += size; /* 情况1 */ if (a+size == bp->m_addr) { /* 情况2 */ (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_addr && bp->m_size) { /* 情况3 */ bp->m_addr -= size; bp->m_size += size; } else /* 情况4 */ 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); } }/* coremap表的初始化程序 */void initcoremap(char *addr, unsigned size){ /* 初始化coremap数组,使其 第一项的m_addr指向用malloc申请到的addr, 第一项的m_size等于malloc申请的size, 其他各项清0 */}/* 输出表的内容 */void printcoremap(){ /* Function body: 打印coremap表中各项的m_size和m_addr */}/* 主程序的框架 */main(){ /* 定义变量 */ /* 用malloc向系统申请内存,如1000 */ /* 初始化coremap数组 */ /* 命令处理部分,如 m size :分配内存 f size addr : 回收内存 p : 打印coremap表 q : 退出 default: continue */ /* 调用free将用malloc申请到的内存释放 */}
操作系统:实验一 可变分区存储管理(答案)
可变分区存储管理结构数组的形式:
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<=a&&bp->m_size!=0; bp++);
if (bp>coremap&&(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_addr&&bp->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);
}
}
}
展开阅读全文