用java语言模拟实现基本分页存储管理, 实现以下功能: 1. 内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配); 2. 基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间; 3. 作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收); 4. 分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。1. 测试数据可以随机输入或从文件中读入。 2. 模拟程序要考虑以下情况: (1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。
时间: 2023-12-13 07:04:42 浏览: 118
以下是用Java语言模拟实现基本分页存储管理的代码实现:
```
import java.util.Scanner;
public class Paging {
// 定义内存大小和每个物理块的大小
private static final int MEMORY_SIZE = 100;
private static final int BLOCK_SIZE = 10;
// 定义内存状态矩阵
private static int[][] memory = new int[MEMORY_SIZE / BLOCK_SIZE][BLOCK_SIZE];
// 定义作业表
private static String[] jobs = new String[MEMORY_SIZE / BLOCK_SIZE];
// 定义空闲块链表
private static int freeBlock = 0;
public static void main(String[] args) {
// 初始化内存状态矩阵
initMemory();
// 进行操作的循环
while (true) {
System.out.println("请选择要进行的操作:");
System.out.println("1. 分配作业");
System.out.println("2. 回收作业");
System.out.println("3. 显示内存状态");
System.out.println("0. 退出程序");
Scanner scanner = new Scanner(System.in);
int option = scanner.nextInt();
switch (option) {
case 0:
System.exit(0);
case 1:
allocateJob(scanner);
break;
case 2:
freeJob(scanner);
break;
case 3:
showMemory();
break;
default:
System.out.println("输入错误,请重新输入!");
break;
}
}
}
/**
* 初始化内存状态矩阵
*/
private static void initMemory() {
System.out.println("请按顺序输入内存空间各个物理块情况:");
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
memory[i][j] = scanner.nextInt();
if (memory[i][j] == 0 && freeBlock == 0) {
freeBlock = i * BLOCK_SIZE + j;
}
}
}
}
/**
* 分配作业
*
* @param scanner 输入流
*/
private static void allocateJob(Scanner scanner) {
System.out.println("请输入作业名和作业大小(逻辑页面数):");
String jobName = scanner.next();
int jobSize = scanner.nextInt();
// 判断内存是否有足够的空间
if (freeBlock == 0 || freeBlock + jobSize > MEMORY_SIZE / BLOCK_SIZE) {
System.out.println("内存空间不足!");
return;
}
// 分配作业空间
int startBlock = freeBlock;
int endBlock = startBlock + jobSize - 1;
for (int i = startBlock; i <= endBlock; i++) {
int row = i / BLOCK_SIZE;
int col = i % BLOCK_SIZE;
memory[row][col] = 1;
}
jobs[startBlock] = jobName;
freeBlock = endBlock + 1;
System.out.println("作业分配成功!");
}
/**
* 回收作业
*
* @param scanner 输入流
*/
private static void freeJob(Scanner scanner) {
System.out.println("请输入要回收的作业名:");
String jobName = scanner.next();
int startBlock = -1;
for (int i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
if (jobs[i] != null && jobs[i].equals(jobName)) {
startBlock = i;
break;
}
}
if (startBlock == -1) {
System.out.println("该作业不存在!");
return;
}
int endBlock = startBlock;
while (endBlock < MEMORY_SIZE / BLOCK_SIZE && jobs[endBlock] != null && jobs[endBlock].equals(jobName)) {
endBlock++;
}
endBlock--;
for (int i = startBlock; i <= endBlock; i++) {
int row = i / BLOCK_SIZE;
int col = i % BLOCK_SIZE;
memory[row][col] = 0;
}
jobs[startBlock] = null;
freeBlock = startBlock;
System.out.println("作业回收成功!");
}
/**
* 显示内存状态
*/
private static void showMemory() {
System.out.println("当前内存状态:");
System.out.print(" ");
for (int i = 0; i < BLOCK_SIZE; i++) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
System.out.printf("%02d: ", i);
for (int j = 0; j < BLOCK_SIZE; j++) {
System.out.print(memory[i][j] + " ");
}
System.out.println();
}
}
}
```
运行程序后,按照提示进行操作即可。注意,作业名不能重复,但是可以删除后再次使用。
阅读全文