操作系统实验一可变分区存储管理操作系统实验一可变分区存储管理
操作系统:实验一 可变分区存储管理
/* 如不会使用文件输入/输出,也不会使用I/O转向做输入和输出结果文件, 可
以手再抄输出结果后后再输到文件中,实验报告的文字内容由自己掌握, 能多
能少。*/#include #include /* 表的定义 */#define N
5struct map { unsigned m_size; char *m_addr;};struct map coremap[N];/* 首次适应的分配函数 */char *fmalloc(unsigned siz...
操作系统实验一可变分区存储管理
操作系统:实验一 可变分区存储管理
/* 如不会使用文件输入/输出,也不会使用I/O转向做输入和输出结果文件, 可
以手再抄输出结果后后再输到文件中,实验
的文字内容由自己掌握, 能多
能少。*/#include
#include /* 表的定义 */#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
#include
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);
}
}
}
本文档为【操作系统实验一可变分区存储管理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。