主存储器空间的分配和回收
模拟在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。
[提示]:
(1)
分页式存储器把主存分成大小相等的若干块,作业的信息也按块的大小分页,作业装入主存时可把作业的信息按页分散存放在主存的空闲块中,为了说明主存中哪些块已经被占用,哪些块是尚未分配的空闲块,可用一张位示图来指出。位示图可由若干存储单元来构成,其中每一位与一个物理块对应,用0/1表示对应块为空闲/已占用。
(2)
假设某系统的主存被分成大小相等的64块,则位示图可用8个字节来构成,另用一单元记录当前空闲块数。如果已有第0,1,4,5,6,9,11,13,24,31,共10个主存块被占用了,那么位示图情况如下:
字 位
节 数
号
0
1
2
3
4
5
6
7
0
1
1
0
0
1
1
1
0
1
0
1
0
1
0
1
0
0
2
0
0
0
0
0
0
0
0
3
1
0
0
0
0
0
0
1
4
0
0
0
0
0
0
0
0
5
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0
(3)
当要装入一个作业时,根据作业对主存的需要量,先查当前空闲块数是否能满足作业要求,若不能满足则输出分配不成功。若能满足,则查位示图,找出为“0”的一些位,置上占用标志“1”,从“当前空闲块数”中减去本次占用块数。
按找到的计算出对应的块号,其计算公式为:
块号= j´8+i
其中,j表示找到的是第n个字节,I表示对应的是第n位。
根据分配给作业的块号,为作业建立一张页表,页表格式:
页 号
块 号
0
1
2
M
M
(4)
当一个作业执行结束,归还主存时,根据该作业的页表可以知道应归还的块号,由块号可计算出在位示图中的对应位置,把对应位的占用标志清成“0”,表示对应的块已成为空闲块。归还的块数加入到当前空闲块数中。由块号计算在位示图中的位置的公式如下:
字节号
j=[块号/8] ([ ]表示取整)
位数 i={块号/8} ({ }表示取余)
(5)
设计实现主存分配和回收的程序。假定位示图的初始状态如(2)所述,现有一信息量为5页的作业要装入,运行你所设计的分配程序,为作业分配主存且建立页表(格式如(3)所述)。然后假定有另一作业执行结束,它占用的块号为第4,5,6和31块,运行你所设计的回收程序,收回作业归还的主存块。
要求能显示和打印分配或回收前后的位示图和当前空闲块数,对完成一次分配后还要显示或打印为作业建立的页表。
---------------------------------------------------------------------------------------------
文件名:Store.java
package com.sau.news;
//package com.sau.news;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
public class Store {
public
static void output(int[][] a) {
int i, j;
for (i = 0; i <= 7; i++) {
for (j = 0; j <= 7; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
public
static int surplus(int[][] a) {
int i, j;
int num = 0;
for (i = 0; i <= 7; i++) {
for (j = 0; j <= 7; j++) {
if (a[i][j] == 0) {
num++;
}
}
}
return num;
}
public
static void apply_ram(int[][] a) {
int i = 0, j = 0, k = 0;
int id = 0;
int residue = 0;
int num =
0; //存放作业的内存数
System.out.println("输入你想创建的作业id和作业需要的内存块:\n");
Scanner scan = new Scanner(System.in);
id = scan.nextInt();
num = scan.nextInt();
residue = surplus(a);
if (residue < num) {
System.out.println("没有足够的内存空间,创建进程失败!\n");
} else {
StoreClass sto = new StoreClass();
sto.setId(id);
int[] temp = new int[64];
for (i = 0; i < 64; i++) {
temp[i] = -1;
}
sto.setYe(temp);
boolean b = list.add(sto);