文章目录
目的要求
- 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰算法。
- 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
实验题
固定式分区分配
要求
设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回
收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。
题目分析
固定式分区分配
- 是能满足多道程序设计的最简单的存储管理技术,允许几个作业共享主存空间,这几个作业被装入不同的分区中,每个分区可用来装入一个作业。因此,分区式存储管理可以在内存中同时放几道作业,适用于多道程序系统。
- 固定式分区是在处理作业之前存储器就已经被划分成若干个分区,每个分区的大小可以相同,也可以不同。但是,一旦划分好分区后,主存储器中的分区的个数就固定了,且每个分区的大小固定不变。
分区的分配
分配:
按照某种算法,从空闲分区链表中找所需大小的分区,分配给将要运行的进程。
u.size 请求分区的大小
m.size 空闲分区链表中分区的大小
size 规定的不可再切割的剩余分区的大小(不可切割就全分配给请求者)
分区的回收
进程运行完毕释放内存,系统根据回收区首地址,从空闲区链表中找到相应的插入点。如果有相邻的就合并,否则就插入。
批处理作业
批处理作业的意思为:对每个对象进行相同的操作,可以采用机械化或者程序化来操作。
代码
伪代码
输入数据定义
end //程序结束
job num begin size //num号作业开始,需要的空间是size(KB)。
job num end //num号作业结束。
数据结构定义
Job类
- num //编号
- size //所占空间大小
MemoryPartition类
- num //分区号
- size //分区大小
- begin //分区起始地址
- status //分区状态
程序流程
while true:
读取输入
- 程序结束跳出循环
- num号作业开始,分区分配
- num号作业结束,分区回收
输出分区的分配情况
代码实现
package MemoryManagemant;
import java.awt.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;
class Job{
private int num;
private int size;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public Job(int num, int size) {
super();
this.num = num;
this.size = size;
}
@Override
public String toString() {
return "Job [num=" + num + ", size=" + size + "]";
}
}
class MemoryPartition{
private int num;
private int size;
private int begin;
private boolean status; //1空闲 0被占用
public MemoryPartition( int size, int begin, boolean status) {
super();
this.size = size;
this.begin = begin;
this.status = status;
}
@Override
public String toString() {
return "MemoryPartition [size=" + size + ", begin=" + begin + ", status=" + status + "]";
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getBegin() {
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public boolean getStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
public class MemoryManagemant {
public static String Run() throws FileNotFoundException {
//初始化变量
int minSize = 16; //最小分区,单位KB
int MaxRound = 10000000;
String ans = "";
File file = new File("src\\data.txt");
Scanner scanner = new Scanner(file);
HashMap<Integer,MemoryPartition> hm = new HashMap(); //分区说明表
LinkedList<MemoryPartition> mpLinkedList = new LinkedList<MemoryPartition>();
//初始化空闲分区链表
int num = 0,begin = 0;
for(int i = 16;i<=2048;i = i*2) {
mpLinkedList.add( new MemoryPartition( i,begin,true ) );
num++;
begin+=i;
}
//处理请求
for(int round = 1;round<MaxRound;round++) {
//读取数据
String opt = scanner.next();
if(opt.equals("end"))
break;
num = scanner.nextInt();
opt = scanner.next();
if(opt.equals("end")) {
System.out.println(num + "号作业结束!");
// pos为对应空间在分区表中的下标
MemoryPartition jobPartition = hm.get(num);
int pos = -1;
for(int i = 0;i<mpLinkedList.size();i++) {
MemoryPartition mp = mpLinkedList.get(i);
if( mp.getBegin() == jobPartition.getBegin() ) {
pos = i;
break;
}
}
// 按照规则合并
if(pos>0 && mpLinkedList.get(pos-1).getStatus() && pos<mpLinkedList.size()-1