简介
本程序利用java编程语言对其进行了实现。
源代码移步:http://download.csdn.net/download/chengshijian2015/10215534
原理
可变分区调度算法有:最先适应分配算法,最优适应分配算法,最坏适应算法。
用户提出内存空间的申请;系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。
每当一个进程被创建时,内存分配程序首先要查找空闲内存分区表(链),从中寻找一个合适的空闲块进行划分,并修改空闲内存分区表(链)。当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区表(链)中找到相应的插入点,此时出现如下四种情况:
1) 回收区与插入点的前一个空闲分区F1相邻接,此时可将回收区直接与F1合并,并修改F1的大小;
2) 回收区与插入点的后一个空闲分区F2相邻接,此时可将回收区直接与F2合并,并用回收区的首址最为新空闲区的首址,大小为二者之和;
3) 回收区同时与插入点的前、后两个空闲分区邻接,此时需将三者合并;
4) 回收区不与任何一个空闲区邻接,此时应建一新的表项。
源代码:
DynamicPartAllocate.java:
package com.csi.operatesystem;
import java.util.Scanner;
/**
* Created by ChengShiJian on 2017/11/08.
*
*/
public class DynamicPartAllocate {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("软件1503 程世健 1511030304");
final Scanner scanner = new Scanner(System.in);
new DynamicPartAllocatePresenter().setOnExcuteLisenter(new OnExcuteLisenter() {
@Override
public Job getJob() {
// TODO Auto-generated method stub
while (true) {
System.out.print("请输入作业(作业号 所用空间大小)>");
Job job = new Job();
int id = scanner.nextInt();
if (id < 1) {
System.out.println("作业号必须大于0!");
continue;
}
int length = scanner.nextInt();
job.setJobId(id);
job.setLength(length);
return job;
}
}
@Override
public void onOutOfMemory() {
// TODO Auto-generated method stub
System.out.println("磁盘空间不足!");
}
@Override
public void onAllocateSuccess(Partition partition) {
// TODO Auto-generated method stub
System.out.println("----------------------------当前内存情况------------------------------");
System.out.println(
"起始地址 终点地址 内存大小 状态 作业号");
for (PartBlock block : partition.getBlocks()) {
System.out.printf("%-15d%-15d%-15d%-30s%-15s\n", block.getStartAddress(), block.getEndAddress(),
block.getLength(), block.getState(), block.getJobId()==0?"":String.valueOf(block.getJobId()));
}
System.out.println("------------------------------------------------------------------");
}
@Override
public int getJobId() {
// TODO Auto-generated method stub
System.out.print("请输入作业id>");
return scanner.nextInt();
}
@Override
public void onSearchError(int id) {
// TODO Auto-generated method stub
System.out.println("作业" + id + "不存在!回收内存失败!");
}
@Override
public void onRetrieveSuccess(Partition partition) {
// TODO Auto-generated method stub
System.out.println("----------------------------当前内存情况------------------------------");
System.out.println(
"起始地址 终点地址 内存大小 状态 作业号");
for (PartBlock block : partition.getBlocks()) {
System.out.printf("%-15d%-15d%-15d%-30s%-15s\n", block.getStartAddress(), block.getEndAddress(),
block.getLength(), block.getState(), block.getJobId()==0?"":String.valueOf(block.getJobId()));
}
System.out.println("------------------------------------------------------------------");
}
@Override
public int onGetMethod() {
// TODO Auto-generated method stub
System.out.println("0.最先适应分配算法 1.最优适应分配算法