操作系统第5次实验报告:内存管理

姓名:林伟强

学号:201821121010

班级:计算1811

1. 记录内存空间使用情况

具体

typedef struct LNode{
int address;//表示该分区的起始地址
int length; //表示该分区的长度
int state; //0表示该分区空闲,1表示该分区已分配
int number; //进程号码  这里不用名称
struct LNode *next;
}*pLNode;

2. 记录空闲分区

state表示空闲分区,空闲区合并空闲分区

void Merge_free(pLNode L) {
pLNode p = L,pre;
int num = 0;//用于检测连续空闲内存空间数量,等于2表示有连续的内存空间
while (p != NULL) {
if (p->state == 0) {

num++;
if (num == 1)
pre = p;//为合并做准备
else if (num == 2) {
pre->length += p->length;
pre->next = p->next;
free(p);
p = pre;
num = 1;
}
}
else if (p->state == 1)
num = 0;
p = p->next;
}
}

3. 内存分配算法

该方法为首次适配算法

首次适应算法从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。

void Allocation(pLNode L, int len, int num) {
pLNode p = L->next;
while (p != NULL) {
if (p->state == 0) {
if (p->length > len) {


pLNode l = (pLNode)malloc(sizeof(PLNode));
l->length = p->length - len;
l->address = p->address + len;
l->state = 0;
l->number = 0;
l->next = p->next;
p->next = l;
p->length = len;
p->number = num;
p->state = 1;
printf("内存分配成功!\n");
return;
}
else if (p->length == len) {
p->number = num;
p->state = 1;
printf("内存分配成功!\n");
return;
}
}
p = p->next;
}
printf("内存分配失败,没有找到合适的空闲内存块\n");
}

4. 内存释放算法

void Revocation(pLNode L, int num) {
pLNode p = L->next;
while(p!=NULL){
if(p->number==num){
p->state = 0;
p->number=0;
printf("成功释放编号为%d的内存!\n", num);
}
p=p->next;
}

}

void Merge_free(pLNode L) {
pLNode p = L,pre;
int num = 0;//用于检测连续空闲内存空间数量,等于2表示有连续的内存空间
while (p != NULL) {
if (p->state == 0) {

num++;
if (num == 1)
pre = p;//为合并做准备
else if (num == 2) {
pre->length += p->length;
pre->next = p->next;
free(p);
p = pre;
num = 1;
}
}
else if (p->state == 1)
num = 0;
p = p->next;
}
}

5. 运行结果

(1)产生测果

 

 

(2)解释结果

如上图所示,每次内存释放时会将内存块状态变为空闲,并且把进程改为无无进程状态

每次分配会从空闲的内存下找出合适位置分配例如最后一个内存3的情况

它是在2和1中间添加进入,因为自身的内存块长度为83在添加进去之后还有10的空闲空间在3和1之间

 

每一次的进程释放都要进行一次判断有无2个空闲块在一起如果有进行合并这就是Merge_free(pLNode L) 的作用

 

posted on 2020-05-15 00:14  咻咻ll  阅读(226)  评论(0编辑  收藏  举报