java模拟存储器管理_java模拟主存储器空间的分配和回收

主存储器空间的分配和回收

模拟在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。

[提示]:

(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);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值