简介
本程序利用java编程语言对其进行了实现。
源代码移步:http://download.csdn.net/download/chengshijian2015/10215566
原理
一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框,同样进行编号。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。
为了标识中哪些块空闲,哪些块占用,可用一张位示图指示。位示图是由若干主存单元构成,如图4-1所示。其中每一位与一个主存块对应。分别用0和1表示对应块是空闲还是占用。
在装入一个作业时,根据作业对主存的需求量,先检查是否有足够的空闲块,如有,则查位示图,按作业需求量找出为0的一些位,且置上占用标记1。
按找到的位计算对应的块号。其计算公式为:
块号=J*8+I
其中,J表示找到的字节号,I表示找到的位号。
源代码
BitInstruction.java:
package com.chengshijian.operatesystem;
/**
* Created by ChengShiJian on 2017/11/15.
*
* 位示图类,实质上只是存储了一个二维数组
*/
public class BitInstruction {
private int bitInstruction[][]=new int[16][16];
public int[][] getBitInstruction() {
return bitInstruction;
}
public void setBitInstruction(int[][] bitInstruction) {
this.bitInstruction = bitInstruction;
}
}
BitInstructionAlgrithm.java:
package com.chengshijian.operatesystem;
import java.util.Scanner;
/**
* Created by ChengShiJian on 2017/11/15.
*
* 位示图算法主程序,主要用来回调OnExecuteLisenter接口
*/
public class BitInstructionAlgrithm {
public static void main(String[] args) {
// TODO Auto-generated method stub
final Scanner scanner = new Scanner(System.in);
BitInstructionPresenter presenter = new BitInstructionPresenter();
presenter.setOnExcuteListener(new OnExecuteListener() {
//设置监听器
@Override
public MyProcess onGetProcess() {
// TODO Auto-generated method stub
System.out.print("请输入进程信息(进程id 请求内存空间大小)>");
MyProcess process=new MyProcess();
process.setId(scanner.nextInt());
process.setSize(scanner.nextInt());
return process;
}
@Override
public void onAlocateMemoryFailed(int id) {
// TODO Auto-generated method stub
System.out.println("内存空间不足!为进程"+id+"分配内存分配失败!");
}
@Override
public void onAlocateMemorySuccess(MyProcess process, int[][] bitInstruction) {
// TODO Auto-generated method stub
System.out.println("----------------当前已分配的进程信息---------------------");
System.out.println("进程id:"+process.getId()+"\n请求分配内存大小:"+process.getSize());
System.out.print("采用位视图法分配的内存块号:");
for (Integer num:process.getBlockNums())