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

时间:2025-07-14

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

(一) 实验题目

(二) 实验目的

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

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

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

(c)

(a)

(b)

(d)

图2-9释放区与前后空闲区相邻的情况

(三)程序代码 #include<malloc.h> #include<stdio.h> #include<string.h>

#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<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(addr<m->space || addr>=m->space+m->totalSize) {

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

nextMap=m->head;

while(nextMap->address<addr) {

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");

//第三种情况 //打印函数

{

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; case 'p': case 'P':

type=cmdPrint; break; } }

{

if(!strcmp(cmd,"malloc")) type=cmdMalloc;

else if(!strcmp(cmd,"free")) type=cmdFree;

else if(!strcmp(cmd,"print")) type=cmdPrint; }

switch(type) {

case cmdMalloc: scanf("%u",&size); lmalloc(m,size); printMem(m); break;

case cmdFree:

scanf("%u %u",&size,&addr); lfree(m,size,addr); printMem(m); break;

case cmdPrint: printMem(m); break; return; } } }

(四)程序结果

…… 此处隐藏:1429字,全部文档内容请下载后查看。喜欢就下载吧 ……
操作系统实验一可变分区存储管理(含代码).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219