請求分頁內存管理的模擬


一、實驗題目

完整代碼地址: https://github.com/SheepHuan/homework/tree/master/java/java%E5%AE%9E%E8%B7%B5%E8%AF%BE/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/src/OS

幻燈片1.JPG

幻燈片2.JPG

幻燈片3.JPG

幻燈片4.JPG

幻燈片8.JPG

幻燈片5.JPG

幻燈片7.JPG

幻燈片6.JPG

二、代碼

image.png

1.Main.java

package OS;

import java.util.Scanner;

public class Main {
	public static int pageSize, blockSize,procSize;
	PCB pcb;
	Memeroy mem;
	public static void main(String[] args) {
		Main m=new Main();
		m.SysInit();//系統初始化
		m.pcb=m.NewProc();//模擬隊列初始化
		m.Access(m.pcb);
	}
	void SysInit() {
		Scanner sc = new Scanner(System.in);
		System.out.println("請求輸入頁大小"); // 4K 12位
		Main.pageSize = sc.nextInt();
		System.out.println("請求輸入總塊數");//32
		Main.blockSize = sc.nextInt();
	}
	PCB NewProc() {
		Scanner sc = new Scanner(System.in);
		System.out.println("請求輸入進程大小");//40000

		Main.procSize = sc.nextInt();
		mem=new Memeroy();//初始化內存
		//
		int cnt=(Main.procSize+Main.pageSize-1)/Main.pageSize;		
		return new PCB(cnt);
	}
	void Access(PCB pcb) {
		//模擬訪問ַ
		for (int i=0;i<1000;i++){
			int logAddr=(int) (Math.random()*Main.procSize);//隨機生成地址
			System.out.printf("邏輯地址:%d ",logAddr);
			System.out.printf("物理地址:%d \n",Memeroy.Relocate(pcb,logAddr));

		}
	}
}

2.Memory.java

package OS;

import java.util.Scanner;

public class Main {
	public static int pageSize, blockSize,procSize;
	PCB pcb;
	Memory mem;
	public static void main(String[] args) {
		Main m=new Main();
		m.SysInit();//系統初始化
		m.pcb=m.NewProc();//模擬隊列初始化
		m.Access(m.pcb);
	}
	void SysInit() {
//		Main.pageSize = 4096;
//		Main.blockSize = 8;

		Scanner sc = new Scanner(System.in);
		System.out.println("請求輸入頁大小"); // 4K 12位
		Main.pageSize = sc.nextInt();
		System.out.println("請求輸入總塊數");//32
		Main.blockSize = sc.nextInt();
	}
	PCB NewProc() {
//		Main.procSize=40000;
		Scanner sc = new Scanner(System.in);
		System.out.println("請求輸入進程大小");//40000

		Main.procSize = sc.nextInt();
		mem=new Memory();//初始化內存
		//
		int cnt=(Main.procSize+Main.pageSize-1)/Main.pageSize;		
		return new PCB(cnt);
	}
	void Access(PCB pcb) {
		//模擬訪問ַ
		for (int i=0;i<1000;i++){
			int logAddr=(int) (Math.random()*Main.procSize);//隨機生成地址
			System.out.printf("邏輯地址:%d ",logAddr);
			System.out.printf("物理地址:%d \n", Memory.Relocate(pcb,logAddr));

		}
	}
}

3.Page.java

package OS;
import java.util.ArrayList;

public class Page {
    int bNo,pNo,P,A;//塊號,頁號,中斷位,訪問位
}
class PCB{
	ArrayList<Page> pTable=new ArrayList<Page>();
	int limit;//頁表限長
	public PCB(int len) {
		this.limit=len;
		for (int i=0;i<len;i++) {
			Page p=new Page();
			p.bNo=-1;
			p.pNo=i;
			p.P=0;//P=0表示不再內存中
			p.A=0;
			this.pTable.add(p);
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM