操作系统实验-可变分区存储管理

  • 格式:doc
  • 大小:90.50 KB
  • 文档页数:7

作业一

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

(一) 实验题目

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

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

(二) 实验目的

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;

前空闲区

释放区

后空闲区

(a)

前空闲区

释放区

后空闲区

(b)

前空闲区

释放区

后空闲区

(c)

前空闲区

释放区

后空闲区

(d)

图2-9释放区与前后空闲区相邻的情况 } 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+size==nextMap->address) //第二种情况

{

prevMap->size+=nextMap->size;

prevMap->next=nextMap->next;

prevMap->next->prev=prevMap;

if(nextMap==m->cMap)

{

m->cMap=prevMap;

}

free(nextMap);

nextMap=NULL;

}

}

else

{

if(addr+size==nextMap->address) //第三种情况

{

nextMap->address-=size;

nextMap->size+=size;

}

else //第四种情况

{

newMap=new(map);

newMap->address=addr;

newMap->size=size;

prevMap->next=newMap;

newMap->prev=prevMap;

newMap->next=nextMap;

nextMap->prev=newMap;

if(nextMap==m->head)

m->head=newMap;

}

}

}

void printMem(pmem m) //打印函数 {

pmap map=m->head;

printf("\

空闲内存空间:\n\

-----------------------\n\

大小 起始地址\n");

do

{

if(map==m->cMap)

printf("-> ");

else

printf(" ");

printf("%10u %10u\n",map->size,map->address);

map=map->next;

}while(map!=m->head);

printf("-----------------------\n");

}

void main() //主函数

{

printf("--------------------------------------------------------\n");

printf("请选择操作:分配内存(m) or 释放内存(f) or 打印内存表(p)\n");

printf("--------------------------------------------------------\n");

typedef enum{cmdMalloc,cmdFree,cmdPrint,cmdHelp,cmdQuit,cmdInvalid} cmdType;

pmem m=createMem(1000);

char cmd[20];

char *addr;

unsigned int size;

cmdType type;

while(1)

{

scanf("%s",cmd);

if(cmd[1]=='\0')

{

switch(cmd[0])

{

case 'm':

case 'M':

type=cmdMalloc;

break;

case 'f':

case 'F':

type=cmdFree;

break;