内存动态分配和回收的模拟实验_第1页
内存动态分配和回收的模拟实验_第2页
内存动态分配和回收的模拟实验_第3页
内存动态分配和回收的模拟实验_第4页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实验报告内存动态分区分配和回收的模拟实现下载可编辑班级: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.内存分配从头开始查表NO检查完成?YesYesNO继续检索M.sizeu/size?下一项.专

2、业 .整理 .下载可编辑YesM.size-u.size,aa 或 m.size=0不是第一个木目标且与前一个可用去NO与后一可用分NO区相邻且不为空表目YesNO所释放的可用区的后释放的可用区与size=0后一可用区合并Yes将该表目以上所有表目上移一格,并插入新释放的可用区表目Yes把所释放的可用区与前一分区合并与后一可用分区合Yes与后一可用区合并NO将该表以上的所有表格下移一格返回.专业 .整理 .下载可编辑.专业 .整理 .下载可编辑源代码:#include #include #include #define SIZE_MIN 2#define MEMSIZE_MAX 1024#de

3、fine FALSE 0#define TRUE !FALSE/* 采用最佳分配法 */typedef int BOOL;typedef struct _MEM_LINKchar cName; /*作业名 */int iStartAddr; /*分区起始地址 */int iMemSize; /*分区大小 */BOOL iState; /* 分区状态 ,1 表示已分配 , 0 表示未分配 */struct _MEM_LINK* next; MEM_LINK, *PMEM_LINK; PMEM_LINK g_pslnkHead; /* 初始化内存使用情况 */ void init()g_pslnk

4、Head=(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); printf(3. 显示内存使用情况 n); printf(4. 退出 n);printf(n 请输入选择 :); scanf(%d,&i);.专业 .整理 .下载可编辑getchar();return(i);/* 分配内存函数 ,c 为作业名 ,usi

5、ze 是要分配的大小 */ int my_malloc(char c,int usize) PMEM_LINK psNewMem = NULL,plnkTmp = NULL;BOOLbRepeatName = FALSE;int iTmp = g_pslnkHead-iMemSize - usize*SIZE_MIN;if (iTmp cName = c)bRepeatName = TRUE;break;plnkTmp = plnkTmp-next;if (bRepeatName) /*如果作业名重复*/return FALSE;/*创建新的节点*/psNewMem = (PMEM_LINK)

6、malloc(sizeof(MEM_LINK); /* 结构体设零 */memset(psNewMem, 0, sizeof(MEM_LINK);/*设置节点内容*/psNewMem-cName = c;psNewMem-iMemSize = usize*SIZE_MIN;psNewMem-iStartAddr= MEMSIZE_MAX - g_pslnkHead-iMemSize;psNewMem-iState = TRUE;plnkTmp = g_pslnkHead;.专业 .整理 .下载可编辑/*查找链表最尾节点*/while (plnkTmp-next != NULL) plnkTmp

7、 = 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 = g_pslnkHead-next;BOOLbFind = FALSE;intiFreeSize = 0;/*搜索链表*/while (plnk

8、Tmp != NULL)if (plnkTmp-cName = c)/*如果找到节点 ,退出循环*/bFind = TRUE;break;plnkBK = plnkTmp;plnkTmp = plnkTmp-next;if (bFind)/*把找到的节点从链表中摘除并释放*/g_pslnkHead-iMemSize += plnkTmp-iMemSize; plnkBK-next = plnkTmp-next;/*保留要释放内存的大小*/iFreeSize = plnkTmp-iMemSize;/*释放 */free(plnkTmp);.专业 .整理 .下载可编辑/*把未释放内存的开始地址提前

9、, 防止内存碎片*/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,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 分配失败

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论