#include <stdio.h> #include <stdlib.h> #include <string.h> const int CANUSE = 1; const int CANTUSE = 0; const int MSIZE = 128; struct MZone { int begin_addr; int length; int state; char task_name[32]; struct MZone *next; }; struct MZone *Mhead = NULL; void showmemory() { struct MZone *Mpoint = Mhead; printf("内存的使用情况 "); printf("beginaddr length state task "); while( NULL!=Mpoint) { printf("%dk ",Mpoint->begin_addr); printf("%dk ",Mpoint->length); Mpoint->state?printf("CANUSE "):printf("CANTUSE "); printf("%s ",Mpoint->task_name); Mpoint = Mpoint->next; } system("pause"); } void memoallocate(void) { struct MZone *Mnew = (struct MZone*)malloc(sizeof(struct MZone)); printf("输入要分配内存大小(kb): "); scanf("%d",&Mnew->length); printf("输入任务名: "); scanf("%s",&Mnew->task_name); Minsert(Mnew)?printf("分配内存成功 "):printf("没有符合大小的空闲分区,内存分配失败。 "); system("pause"); free(Mnew); } int Minsert(struct MZone* Mnew) { struct MZone *Zinsert = Mhead; int flag = 1; while( Zinsert->length<Mnew->length || !Zinsert->state) { if( NULL!=Zinsert->next ) { Zinsert = Zinsert->next; } else { Zinsert = Zinsert->next; break; } } if( NULL==Zinsert ) { return 0; } if( MSIZE == Zinsert->begin_addr+Mnew->length ) { Zinsert->state = CANTUSE; strcpy(Zinsert->task_name , Mnew->task_name); Zinsert->next = NULL; return 1; } else { struct MZone *Ztail = (struct MZone *)malloc(sizeof(struct MZone)); Zinsert->state = CANTUSE; strcpy(Zinsert->task_name , Mnew->task_name); Zinsert->length = Mnew->length; Zinsert->next = Ztail; memset( Ztail, 0, sizeof(char)*32 ); Ztail->begin_addr = Zinsert->begin_addr + Mnew->length; Ztail->state = CANUSE; Ztail->length = MSIZE - Ztail->begin_addr; Ztail->next = NULL; return 1; } } void memoreturn(void) { char tname[32]; printf("输入要收回的任务名 "); scanf("%s",tname); Mreturn(tname); system("pause"); } int Mreturn(char taskname[]) { struct MZone *front = NULL; struct MZone *position = Mhead; struct MZone *tail = Mhead->next; while( 0!=strcmp(position->task_name,taskname) ) { front = position; if( NULL!=position->next ) { position = position->next; } else { position = NULL; break; } tail = position->next; } if( NULL==position ) { printf("内存中没有此任务!"); } else { if( NULL!=tail&&NULL!=front ) { if( front->state&&tail->state ) { front->length = front->length + position->length + tail->length; front->next = tail->next; free(position); free(tail); } else if( front->state&&!tail->state ) { front->length = front->length + position->length; front->next = position->next; free(position); } else if( !front->state&&tail->state ) { position->length = position->length + tail->length; memset( position->task_name, 0, sizeof(char)*32 ); position->next = tail->next; position->state = CANUSE; free(tail); } else if( !front->state&&!tail->state ) { memset( position->task_name, 0, sizeof(char)*32 ); position->state = CANUSE; } } else if( NULL!=tail&&NULL==front ) { if( !tail->state ) { memset( position->task_name, 0, sizeof(char)*32 ); position->state = CANUSE; } else { position->length = position->length + tail->length; position->next = NULL; free(tail); } } else if( NULL==tail&&NULL!=front ) { if(front->state) { front->length = front->length + position->length; front->next = NULL; free(position); } else { memset( position->task_name, 0, sizeof(char)*32 ); position->state = CANUSE; } } else if( NULL==tail&&NULL==front ) { memset( position->task_name, 0, sizeof(char)*32 ); position->state = CANUSE; } printf("内存回收成功! "); } } int main(void) { int func_ = 0; Mhead = (struct MZone*)malloc(sizeof(struct MZone)); Mhead->begin_addr = 0; Mhead->length = MSIZE; Mhead->state = CANUSE; memset(Mhead->task_name, 0, sizeof(char)*32 ); Mhead->next = NULL; while( 1 ) { printf("******************首次适应算法实现主存分配和回收系统(内存MSIZE)***************"); printf("|1:查看内存分配情况 "); printf("|2:申请分配内存 "); printf("|3:申请回收内存 "); printf("|4:退出程序 "); printf("********************************************************************************"); scanf("%d",&func_); switch( func_ ) { case 1 :showmemory();break; case 2 :memoallocate();break; case 3 :memoreturn();break; case 4 :return 1; } system("cls"); } }
实验四这个实验室简单的内存分配和回收,通过网络知识上的结合艰难地搞定代码。