姓名:林伟强
学号: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("内存分配成功!
");
return;
}
else if (p->length == len) {
p->number = num;
p->state = 1;
printf("内存分配成功!
");
return;
}
}
p = p->next;
}
printf("内存分配失败,没有找到合适的空闲内存块
");
}
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的内存!
", 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) 的作用