题目描述:
设计一个内存分配模拟程序。假定在计算机系统作业后备队列中有六个等待调度运行的作业,参与分配的内存大小为32KB,采用简单页式管理,每个页帧的大小为1KB。根据要求进行内存的分配和回收。要求打印内存分配表。有关作业的组织和作业有关参数的设置请自行设计,要大致符合实际情况。
效果演示图:
1.测试数据
作业序号 | 作业大小 | 作业完成所需时间 | 使用何种颜色表示该作业 |
1 | 15 | 4 | 黄色 |
2 | 1 | 3 | 红色 |
3 | 2 | 2 | 绿色 |
4 | 18 | 1 | 橙色 |
5 | 10 | 2 | 蓝色 |
6 | 11 | 3 | 红色 |
2.效果图:(传不了.mp4,暴风哭泣)
代码:
Block类:
一共有32个页帧,一个格子代表一个页帧
package PageStorageManagement3;
import java.awt.Color;
import javax.swing.Spring;
public class Block {
//格子编号
public int number;
//初始颜色。白色
public Color c=Color.white;
//初始状态。空闲
public String stateblock="free";
}
JobMessage类:
每个作业的信息
package PageStorageManagement3;
import java.awt.Color;
import javax.swing.Spring;
public class JobMessage {
public JobMessage(int id2, int saneed, int i,int coc) {
this.id=id2;
size=saneed;
this.needtime=i;
if(coc==1) color=Color.YELLOW;
if(coc==2) color=Color.red;
if(coc==3) color=Color.green;
if(coc==4) color=Color.orange;
if(coc==5) color=Color.BLUE;
if(coc==6) color=Color.decode("#9370DB");
}
public int id;
public int needtime;//所需时间
public int size;//大小,同时包括被划分多少块
public String state="wait";
public Color color;
}
PageStorageManagement类:
界面显示
package PageStorageManagement3;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PageStorageManagement extends JFrame {
public static void main(String[] args) {
PageStorageManagement p = new PageStorageManagement();
p.show();
}
private int num;
private ArrayList<JobMessage> list = new ArrayList<JobMessage>();
private Graphics gr;
private int size;
private Color c=Color.white;
private Color color;
private int x1, y1, x2, y2;
//画最初32格子
public void paint(Graphics gr,int start,int end) {
super.paint(gr);
x1 = 0;
y1 = 0;
x2 = 0;
y2 = 0;
size=100;
gr.setColor(Color.BLACK);
gr.drawRect(0, 0, 800, 400);
// 4*8=32个格子 四行8列 一个格子100*100, 长100*8=800 宽4*100=400 行line
for (int l = 1; l <= 3; ++l) {
gr.drawLine(x1, y1 + 100 * l, 800, y2 + 100 * l);
}
for(int i=0;i<8;++i) {
for(int j=0;j<4;++j) {
gr.setColor(Color.white);
gr.fillRect(size*i, size*j,size, size);
}
}
}
//界面
public void show() {
list.add(new JobMessage(1, 15,4,1));
list.add(new JobMessage(2, 1,3,2));
list.add(new JobMessage(3, 2,2,3));
list.add(new JobMessage(4, 18,1,4));
list.add(new JobMessage(5, 10,2,5));
list.add(new JobMessage(6, 11,3,6));
JFrame jf = new JFrame();
jf.setTitle(" 页式存储管理 ");
jf.setSize(800, 410);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.getContentPane().setBackground(Color.gray);
this.setPreferredSize(new Dimension(800,400));
JPanel jp=new JPanel();
jp.setPreferredSize(new Dimension(800,400));
jp.setBackground(Color.gray);
jf.add(jp, BorderLayout.CENTER);
jf.setVisible(true);
gr = jp.getGraphics();
paint(gr,1,32);
ProcessSchedul pro=new ProcessSchedul(this,gr,list,num,this);
}
}
package PageStorageManagement3;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class ProcessSchedul extends Thread {
private PageStorageManagement page;
private Graphics gr;
private ArrayList<JobMessage> list;
private ArrayList<JobMessage> use;
private int count;
private boolean flag = true;
private ArrayList<JobMessage> finish = new ArrayList<JobMessage>();
public ArrayList<Block> block = new ArrayList<Block>();
private int num=6;
private int size = 100;
public int i;
public Block j;
private int a = 0;
private int busy;
private PageStorageManagement jf;
//构造函数传参
public ProcessSchedul(PageStorageManagement pageStorageManagement, Graphics gr, ArrayList<JobMessage> list,
int num, PageStorageManagement pageStorageManagement2) {
this.jf = pageStorageManagement;
this.gr = gr;
this.list = list;
use = list;
this.num = num;
num=6;
//页帧初始化
for (i = 0; i < 32; i++) {
Block b = new Block();
b.stateblock = "free";
block.add(b);
}
//线程启动
run();
}
public int g = 0;
public void run() {
while (flag) {
for(int h=0;h<finish.size();++h) {
for(int tt=0;tt<block.size();++tt) {
if(block.get(tt).number==finish.get(h).id) {
block.get(tt).stateblock="free";
block.get(tt).c=Color.white;
block.get(tt).number=0;
}
}
}
System.out.println("finish 大小"+finish.size());
for( g=0;g<use.size();++g) {
if(!use.get(g).state.equals("finish")&&use.get(g).needtime>0) {
if (use.get(g).size<=free()&&use.get(g).state.equals("wait")) {
use.get(g).needtime--;
draw(use.get(g).size, use.get(g).color, use.get(g).id);
use.get(g).state="run";
}
else if(use.get(g).state.equals("run"))
{
use.get(g).needtime--;
}
else if(use.get(g).size>free()&&use.get(g).state.equals("wait"))
{
break;
}
}
else if(!use.get(g).state.equals("finish")&&use.get(g).needtime<=0) {
finish.add(use.get(g));
use.get(g).state = "finish";
}
}
if (finish.size() ==6) {
flag = false;
System.out.println("进程全部执行");
JOptionPane.showMessageDialog(jf,"进程全部执行");
}
for(int h=0;h<use.size();++h) {
System.out.println("use"+(h+1)+"的时间为"+use.get(h).needtime);
}
for(int k=0;k<use.size();++k) {
System.out.println(use.get(k).id+"状态"+use.get(k).state);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//返回空闲页帧数
public int free() {
int free = 0;
for (int h = 0; h < 32; h++) {
if (block.get(h).stateblock.equals("free")) {
free++;
}
}
System.out.println("free=="+free);
return free;
}
private void draw(int size, Color color, int n) {
System.out.println("draw big color ");
System.out.println("大小=="+size);
for (int l = 1; l <= 3; ++l) {
gr.drawLine(0, 100 * l, 800, 100 * l);
}
int finishgezi=0;
for (int h = 0; h < 32; h++) {
if(finishgezi<size) {
if (block.get(h).stateblock.equals("free")) {
block.get(h).stateblock = "busy";
block.get(h).c = color;
block.get(h).number = n;
finishgezi++;
}
}
}
for (i = 0; i < block.size(); i++) {
System.out.println("block"+i+"状态"+block.get(i).stateblock+" bianhuan"+block.get(i).number);
j = block.get(i);
gr.setColor(j.c);
gr.fillRect((int)(100 * (i - 8 *((int) (i / 8)))), (int)(100 *((int) (i / 8))), 100, 100);
gr.setColor(color.black);
gr.drawRect((int)(100 * (i - 8 *(int) (i / 8))), (int)(100 *(int) (i / 8)), 100, 100);
}
//画格子的规律
// 0-7 x=i*size y=0
// s8-15 x=(i-8)*size y=100*1=100*(i/8)
// 16-23 x=size*(i-8*(i/8)) y=100*(i/8)
}
}