《内存动态分配和回收的模拟实验.docx》由会员分享,可在线阅读,更多相关《内存动态分配和回收的模拟实验.docx(8页珍藏版)》请在三一办公上搜索。
1、汕萍*醇XIAhJGTAKI UM IVERSITY操作系统实验报告内存动态分区分配和回收的模拟实现班级:2013级软件工程1班学号:X X X姓名:萧氏一郎数据结构说明:Struct SubAreaListA分配空间链表Struct SubAreaListF空闲分区链表Viod Swap(Task&task,Task&task1)交换作业顺序函数Viod InitDate。初始化链表Viod MAllocate(Task task,int M)为申请分配内存Viod MFree(Task task, intN)释放内存流程图:a.内存分配检查完成?NOM.sizeu/size?NOYesNO
2、YesYes将该分区分配给请 求者,修改有关数据将该分区移出从该分区划出u.size大小的分区继续检索 下一项从头开始查表返回b.内存回收源代码:#include #include #include #define SIZE_MIN 2#define MEMSIZE_MAX 1024#define FALSE 0#define TRUE !FALSE/*采用最佳分配法*/typedef int BOOL;typedef struct _MEM_LINKchar cName; /* 作业名*/int iStartAddr; /*分区起始地址*/int iMemSize; /*分区大小*/BOOL
3、 iState; /*分区状态,1表示已分配,0表示未分配*/ struct _MEM_LINK* next; MEM_LINK, *PMEM_LINK;PMEM_LINK g_pslnkHead;/*初始化内存使用情况*/void init()g_pslnkHead=(PMEM_LINK)malloc(sizeof(MEM_LINK);memset(g_pslnkHead, 0, sizeof(MEM_LINK); g_pslnkHead-iMemSize = MEMSIZE_MAX;int menu()int i;printf(nn1.分配内存n);printf(2.回收内存n);prin
4、tf(3.显示内存使用情况n);printf(4.退出n);printf(n请输入选择:); scanf(%d,&i);getchar();return(i);/*分配内存函数,3作业名,usize是要分配的大小*/ int my_malloc(char c,int usize)PMEM_LINK psNewMem = NULL, plnkTmp = NULL;BOOL bRepeatName = FALSE;int iTmp = g_pslnkHead-iMemSize - usize*SIZE_MIN;if (iTmp cName = c)bRepeatName = TRUE;break;
5、plnkTmp = plnkTmp-next;if (bRepeatName) /*如果作业名重复*/return FALSE;/*创建新的节点*/psNewMem = (PMEM_LINK)malloc(sizeof(MEM_LINK);/*结构体设零*/memset(psNewMem, 0, sizeof(MEM_LINK);/*设置节点内容*/psNewMem-cName = c;psNewMem-iMemSize = usize*SIZE_MIN;psNewMem-iStartAddr=MEMSIZE_MAXg_pslnkHead-iMemSize;psNewMem-iState =
6、TRUE;plnkTmp = g_pslnkHead;/*查找链表最尾节点*/while (plnkTmp-next != NULL) plnkTmp = plnkTmp-next;/*把新创建的节点加入到链表中*/plnkTmp-next = psNewMem;/*在整体内存中去掉以分配的部分*/g_pslnkHead-iMemSize -二 usize*SIZE_MIN;return TRUE;/*回收内存函数,c是撤销的进程的作业名;*/int my_free(char c)PMEM_LINK plnkBK = g_pslnkHead, /*保留上次搜索的节点 */ plnkTmp =
7、g_pslnkHead-next;BOOL bFind = FALSE;int iFreeSize = 0;/*搜索链表*/while (plnkTmp != NULL)if (plnkTmp-cName = c)/*如果找到节点,退出循环*/bFind = TRUE;break;plnkBK = plnkTmp;plnkTmp = plnkTmp-next;if (bFind)/*把找到的节点从链表中摘除并释放*/ g_pslnkHead-iMemSize += plnkTmp-iMemSize;plnkBK-next = plnkTmp-next;/*保留要释放内存的大小*/iFreeSi
8、ze = plnkTmp-iMemSize;/*释放*/free(plnkTmp);/*把未释放内存的开始地址提前,防止内存碎片*/ plnkTmp = plnkBK-next;while (plnkTmp != NULL)plnkTmp-iStartAddr -二 iFreeSize;plnkTmp = plnkTmp-next;return bFind;void disp()PMEM_LINK pTmp;int i = 0;pTmp = g_pslnkHead;printf(n分区号作业名 起始地址 分区大小状态);while(pTmp)printf(n%4d %c %4d%4d %4d,
9、i, pTmp-cName, pTmp-iStartAddr, pTmp-iMemSize, pTmp-iState); pTmp = pTmp-next;i+;void main()int i;char c;init();i = menu();while (i!=4)if (i=1)printf(n作业名(一个字符):); scanf(%c,&c);printf(作业占内存大小:); scanf(d,&i);if(my_malloc(c,i) printf(n 分配成功! ! ! ); else printf(n 分配失败!);else if (i=2)printf(n输入要回收分区的作业名(一个字符):);scanf(%c,&c);if(my_free) printf(n 回收成功!);else printf(n 回收失败!);else if(i=3) disp();i = menu();