import java.util.LinkedList;
public class memory {
private int size;//内存大小
private static final int MIN_SIZE =3;//最小剩余分区大小
private LinkedList<Partition> mpartition;//内存分区
private int location;//上次分配的空闲区位置
class Partition{//分区节点类
private int size;//分区大小
private int head;//分区始址
private boolean Free;//空闲状态
public Partition(int head, int size) {
this.head = head;
this.size = size;
this.Free = true;
}
}
public memory(int size) {
this.size = size;
this.location = 0;
this.mpartition = new LinkedList<>();
mpartition.add(new Partition(0, size));
}
//首次适应算法
//size 指定需要分配的大小
void FristFit(int size){
//遍历分区链表
for (location = 0; location < mpartition.size(); location++){//每次从链首开始查找
Partition temp =mpartition.get(location);
if (temp.Free && (temp.size > size)){//找到可用空闲分区且大小足够
Distribute(size, location, temp);
return;
}
}
//遍历结束后未找到可用分区, 则内存分配失败
System.out.println("无可用内存空间!");
}
//执行分配函数,size 申请大小,location 当前可用分区位置,temp 可用空闲区
private void Distribute(int size, int location, Partition temp) {
//如果分割后分区剩余大小过小(MIN_SIZE)则将分区全部分配,否则分割为两个分区
if (temp.size - size <= MIN_SIZE){
temp.Free = false;
} else {
Partition split = new Partition(temp.head + size, temp.size - size);
mpartition.add(location + 1, split);
temp.size = size;
temp.Free = false;
}
System.out.println("成功分配 " + size + "KB 的内存!");
}
//内存回收,id 指定要回收的分区号
public void collection(int id){
if (id >= mpartition.size()){
System.out.println("没有此分区号!");
return;
}
Partition temp = mpartition.get(id);
int size = temp.size;
if (temp.Free) {
System.out.println("分区未被分配, 无需回收");
return;
}
//如果回收分区不是尾分区且后一个分区为空闲, 则与后一个分区合并(上不邻下邻或者上下都邻)
if (id < mpartition.size() - 1 && mpartition.get(id + 1).Free){
Partition next = mpartition.get(id + 1);
temp.size += next.size;
mpartition.remove(next);
}
//如果回收分区不是首分区且前一个分区为空闲, 则与前一个分区合并(上邻下不邻或者上下都邻)
if (id > 0 && mpartition.get(id - 1).Free){
Partition previous = mpartition.get(id - 1);
previous.size += temp.size;
mpartition.remove(id);
id--;
}
mpartition.get(id).Free = true;
System.out.println("内存回收成功!, 本次回收了 " + size + "KB 空间!");
}
//展示内存分区状况
public void showmpartition(){
System.out.println("*****************************************");
System.out.println("分区编号 分区始址 分区大小 空闲状态");
for (int i = 0; i < mpartition.size(); i++){
Partition temp = mpartition.get(i);
System.out.println(i + "\t\t\t" + temp.head + "\t\t " +
temp.size + "\t\t" + temp.Free);
}
System.out.println("*****************************************");
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这个是我操作系统大作业用过的,代码没有任何问题,都是符合实验要求的 ,如果你运行后还有问题,可以给我发私信 实验目的:通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区 的合并的理解。 三、实验环境:同实验一。 四、实验内容: 1、 设计动态分区首次适应分配、回收算法。 2、 设计“未分配区说明表”,格式为: 序号 始址 长度 状态 3、设计“已分配区说明表”,格式为: 作业名 始址 长度 状态 4、 设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。 5、 初始分配从一个空闲区分配起,回收时要合并空区。 五、实验要求: 1、 系统要求分配一个分区时,应输入:作业名、作业长度。 2、 回收一个分区时,应输入:回收的作业名。回收的分区请注意是否需要进行合并。 五、各功能简要说明: 1、 分配功能:选择该功能后,首先输入需要分配空间的作业名及所需空间的大小。然后,按照首次适 用算法从空闲分区表中找到一个合适的分区,若找到,则划分相应的空闲分区给该作业(修改“未 分配区说明表”和“已分配区说明表”中的内容);若没有找到,需要给出相应
资源推荐
资源详情
资源评论
收起资源包目录
源代码.rar (14个子文件)
源代码
src
memory.java 4KB
Main.java 1KB
out
production
源代码-3
Main.class 1KB
memory$Partition.class 1023B
memory.class 3KB
demo01.class 954B
.idea
uiDesigner.xml 9KB
runConfigurations.xml 346B
vcs.xml 188B
workspace.xml 6KB
misc.xml 278B
modules.xml 269B
.gitignore 184B
源代码-3.iml 433B
共 14 条
- 1
资源评论
快到锅里来呀
- 粉丝: 5547
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功