内存的分配与回收实验教程
内存的分配与回收
1801010091 杨泽宇
北京师范大学珠海分校
实验目的:
1.通过使用位图或空闲表,跟踪内存使用情况,模拟和评价不同的内存分配算法;
2.熟悉内存分配和回收管理过程。
实验要求:
1.要求用你熟悉的程序设计语言编写和调试一个内存分配和回收模拟程序;要求在主函数中测试。
2.实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。
3.必须模拟该4种内存分配算法:first fit,next fit,best fit和worst fit中的至少2种。
4.需显示出每次分配和回收后的空闲分区链的情况来以及内存占用情况图。
5.(可选:)计算2个性能参数:碎片数(小于2个单元(units)的空闲区数)、完成一次内存分配的空闲区比较(搜索)次数,也即经过几次比较完成某次请求的内存分配。
实验内容:
假设内存容量为256KB,并且划分成1KB大小的块,也即每个内存单元为1KB。一个进程所需要的内存为3到10个单元。同时假设一个作业在运行过程中所需内存的大小不变。
模拟包括3部分:
1.实现特定的内存分配算法
2.实现内存回收模拟
3.每种内存分配策略对应的碎片数统计(可选)
实验步骤:
1.确定内存空间分配表;
1)数据项设计
2)存储结构确定
内存空间分配表采用双向链表的数据形式
分配空间块的数据结构为:
前向指针:before 初始值为-1 指向该结点的上一个节点的位置
进程块在内存中的位置: strtLocation 表示该内存块的位置信息
进程块id:标志被占用的内存块
空间大小 :size 表示占用内存的大小
后向指针: next 初始值为-1 表示该节点的下一个结点位置
package com.it.bnuz.yzy;
public class UseNode implements Comparable<UseNode> {
private int before = -1;
private int startLocation;
private int id;
private int size;
private int next = -1;
public UseNode(int id, int size) {
this.id = id;
this.size = size;
}
public int getBefore() {
return before;
}
public void setBefore(int before) {
this.before = before;
}
public int getStartLocation() {
return startLocation;
}
public void setStartLocation(int startLocation) {
this.startLocation = startLocation;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
@Override
public int compareTo(UseNode o) {
return this.startLocation - o.getStartLocation();
}
@Override
public String toString() {
String str = "[before:"+before+" startLocation:"+startLocation+" id:"+id+" size:"+size+" next:"+next+"]";
return str;
}
}
2.采用某2种算法完成内存空间的分配和回收;
1)算法分析
2)算法流程图绘制
3)编码
4)调试
3.编写主函数对所做工作进行测试。