用c语言实现relief算法,操作系统实验一可变分区存储管理含代码.doc

操作系统实验一可变分区存储管理含代码

实验一 :可变分区存储管理

(一)??实验题目

(二)?实验目的

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

2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;

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

(三)程序代码

#include

#include

#include

#define new(type) (type *)malloc(sizeof(type))

typedef struct _map

{

unsigned int size;

char *address;

struct _map *next;

struct _map *prev;

} map;

typedef map *pmap;

typedef struct _mem

{

unsigned int totalSize;

char* space;

pmap head;

pmap cMap;

} mem;

typedef mem *pmem;

pmem createMem(unsigned int to_size) //创建内存区域

{

pmem newMem=new(mem);

pmap newHead=new(map);

newMem->totalSize=to_size;

newHead->size=to_size;

newHead->address=newMem->space;

newHead->next=newHead;

newHead->prev=newHead;

newMem->head=newHead;

newMem->cMap=newHead;

return newMem;

}

void freeMem(pmem m)

{

pmap map,cMap;

pmap head=m->head;

free(map->address);

for(map=head;map->next!=head;)

{

cMap=map;

map=cMap->next;

free(cMap);

}

free(m);

}

char* lmalloc(pmem cMem,unsigned int size) //分配函数

{

if(size>1000){

printf("内存容量超出范围!\n"); //当需要分配的内存空间已经大于实际空间时出错

}else{

pmap p=cMem->cMap;

char* rAddr;

if(size==0)

return NULL;

while(p->size

{

if(p->next==cMem->cMap)

return NULL;

p=p->next;

}

rAddr=p->address;

p->size-=size;

p->address+=size;

if(p->size==0)

{

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

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

cMem->cMap=p->next;

if(cMem->head==p)

cMem->head=p->next;

if(p->next!=cMem->head)

free(p);

}

else

{

cMem->cMap=p;

}

return rAddr;

}

}

void lfree(pmem m,unsigned int size,char* addr) //释放函数

{

pmap nextMap,prevMap,newMap;

if(addrspace || addr>=m->space+m->totalSize)

{

fprintf(stderr,"地址越界\n"); //释放空间时,大小输入出错

return;

}

nextMap=m->head;

while(nextMap->address

{

nextMap=nextMap->next;

if(nextMap==m->head)

break;

}

prevMap=nextMap->prev;

if(nextMap!=m->head && prevMap->address+prevMap->size==addr) //第一种情况

{

prevMap->size+=size;

if(addr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值