欢迎来到天天文库
浏览记录
ID:57330341
大小:93.50 KB
页数:6页
时间:2020-08-12
《内存连续分配方式实验.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验三内存连续分配方式实验一、目的要求用高级语言编写和调试一个内存连续分配模拟程序,以加深对进程的概念及进程调度算法的理解.二、相关内容内存连续分配动态分区分配流程图三、实验要求:设计程序模拟内存动态分区分配流程,要求如下1、实现三项功能:分配内存、回收内存、显示内存使用情况2、内存分配表建议使用顺序表或者单链表实现,逻辑结构如下图(a)3、分区分配算法建议使用最佳分配算法4、假设内存大小为1024K,起始地址为0,都可以被用户程序使用,size数值设为2K参考程序:#include "stdio.h"#include "stdlib.h"#include "string.h"#def
2、ine SIZE_MIN 2#define MEMSIZE_MAX 1024#define FALSE 0#define TRUE !FALSEtypedef int BOOL;typedef struct _MEM_LINK{charcName;/*作业名*/intiStartAddr;/*分区起始地址*/intiMemSize;/*分区大小*/BOOLiState;/*分区状态,1表示已分配, 0表示未分配*/struct _MEM_LINK* next;}MEM_LINK, *PMEM_LINK;PMEM_LINK g_pslnkHead;/*初始化内存使用情况*/void in
3、it(){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("1. 分配内存");printf("2. 回收内存");printf("3. 显示内存使用情况");printf("4. 退出");printf("请输入选择:");scanf("%d",&i);getchar();return(i);}/*分配内存函
4、数,c为作业名,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 <= 0) /* 如果没有足够的空间分配 */return FALSE;plnkTmp= g_pslnkHead;while (plnkTmp != NULL){if (plnkTmp->cName == c){bRepeatNam
5、e = TRUE;break;}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_MAX -
6、g_pslnkHead->iMemSize;psNewMem->iState= 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){PME
7、M_LINK plnkBK = g_pslnkHead,/* 保留上次搜索的节点 */ plnkTmp = g_pslnkHead->next; BOOL bFind = FALSE;int iFreeSize = 0;/* 搜索链表 */while (plnkTmp != NULL){if (plnkTmp->cName == c){ /* 如果找到节点,退出循环 */bFind = TRUE;break;}plnkBK = plnkTmp;
此文档下载收益归作者所有