1. 程式人生 > >頁式儲存管理(模擬作業系統)

頁式儲存管理(模擬作業系統)

最近作業系統課程實踐要求,我們模擬頁式儲存管理,起初自己很沒有思路,但是在詳細的畫出整個的流程的時候自己還是發現了一些規律,並且發現可以陣列和佇列進行模擬,我在自己寫程式的時候用的是陣列模擬的,當然在程式中,也會有很多的陣列表示各種要記錄的東西,這就要求你對頁式儲存管理要相當的熟悉。

這裡我簡單的講述一下其中需要模擬的相關資訊

1)首先需要將邏輯地址轉換為對應的頁號以及頁內位移(這裡我預設頁面大小是1024,頁面數為5) 

例如:

830/1024=0......830

1234/1024=1......210

3333/1024=3......261

2456/1024=2......408

3500/1024=3......428

5678/1024=5......558

1245/1024=1......221

200/1024=0......200

4560/1024=4......464

1333/1024=1......309

上邊的計算就是在記錄每一個邏輯地址相對應的頁面號以及頁內位移。程式是採用輸入邏輯地址,這就需要一個數組進行邏輯地址的記錄,計算出的頁號和頁內位移需要兩個陣列進行記錄。為了後邊的編寫程式時候方便,建議大家程式設計時將相關的變數名進行起名的時候儘量用其英文代替,這樣在以後進行講解的時候也幫助自己理解。

你還要判斷你輸入的邏輯地址是否越界,當你輸入頁面大小,以及頁面數的時候就是確定了總的大小,如果邏輯地址超過了頁面大小*頁面數量就是代表越界。我在程式裡邊就是進行簡單的列印越界資訊,進行輸出。(上邊的5678就已經發生了越界 5678>5*1024)

在這裡打印出頁號,頁內位移相關資訊(是已經排除了越界的邏輯地址)

頁號 頁內位移
0 830
1 210
3 261
2 408
3 428
1 221
0 200
4 464
1 309

以上表格顯示就是最後打印出來的輸入的邏輯地址對應的頁號及頁內位移。我是模擬頁式儲存管理,採用先進先出演算法。

根據表格就可以得到訪問序列就是0,1,3,2,3,1,0,4,1

根據所學的知識採用先進先出演算法(FIFO)模擬替換情況

訪問序列 0 1 3 2 3 1 0 4 1
物理塊1 0 0 0 2T 2 2 2 2 1T
物理塊2 1 1 1 1 1 0T 0 0
物理塊3 3 3 3 3 3 4T 4

表格中用大寫字母T表示的就是進行了替換。

由此可以得知這次訪問中淘汰的頁面數是 0,1,3,2,缺頁次數是7

最後計算出實體地址,實體地址的計算方法 塊號*頁面大小 + 頁內位移 在程式中做了簡單的處理,從開始就是第一個對應塊號為0,第二個對應1,第三個對應2,第四個對應0,依次迴圈對應,便可以得知相應頁面對應的塊號,今兒計算出實體地址。

以下是我自己寫的程式,實現這一具體的過程。但是經過測試有點缺陷,就是輸入的前三個訪問的邏輯地址不能有相同的頁面號(三個頁號全不相等)

package 頁式管理儲存;
import java.util.*;
public class Page_test {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int pageNum,pageVolume;
		System.out.println("物理塊數預設為3(從0起)");
		System.out.println("請輸入頁面數:");
		pageNum = sc.nextInt();
		System.out.println("請輸入頁的大小:");
		pageVolume = sc.nextInt();
		System.out.println("輸入次數(大於三):");
		int processNum = sc.nextInt();
		System.out.println("請輸入各個程序的邏輯地址:");
		int[] poistion = new int[processNum];
		for(int i=0;ivolume){
				re_count++;
				System.out.println("此處發生越界中斷,越界中斷的邏輯地址是:" + poistion[i] + "\t處理成功!!!");
	
			}
		}
		
		int[] blockNum = new int[poistion.length]; //記錄頁號
		int[] blockPoistion = new int[poistion.length]; //頁內位移
		
		for(int i=0;ipageNum ||(blockNum[i]==pageNum && blockPoistion[i]>0)){
				continue;
			}
			System.out.println(blockNum[i] + "\t" + blockPoistion[i]);
		}
		
		//輸出訪問序列
		System.out.println("訪問序列:");
		for(int i=0;ipageNum ||(blockNum[i]==pageNum && blockPoistion[i]>0)){
				continue;
			}
			System.out.print(blockNum[i] + " ");
		}
		
		System.out.println();
		//顯示缺頁次數,缺頁序列,缺頁率
		//程式中有三個物理塊
		int[] physical_block = new int[3];
		boolean flag = false;
		//i控制物理塊座標,a控制迴圈次數
		for(int i=0,a=0;a<3;i++,a++){
			if(blockNum[i]>pageNum ||(blockNum[i]==pageNum && blockPoistion[i]>0)){
				//證明中斷存在
				i++;
			}
			physical_block[a] = blockNum[i];
		}
		
		//用一個新的陣列記錄偏移地址
		int[] newPoistion_block = new int[blockNum.length-re_count];
		for(int i=0,a=0;apageNum ||(blockNum[i]==pageNum && blockPoistion[i]>0)){
				i++;
			}
			newPoistion_block[a] = blockPoistion[i];
		}
		//記錄物理塊地址
		int[] phy_poistion = new int[blockNum.length-re_count];
		int[] phy = {0,1,2};
		for(int i=0;i<3;i++){
			phy_poistion[i] = phy[i]*pageVolume + newPoistion_block[i];
		}
		//記錄缺頁的頁面號
		int[] num = new int[20];
		for(int i=0;i<20;i++){
			num[i] = -1;
		}
		//用一個新的陣列記錄訪問序列
		int[] newBlockNum = new int[blockNum.length-re_count];
		
		for(int i=0,a=0;apageNum ||(blockNum[i]==pageNum && blockPoistion[i]>0)){
				i++;
			}
			newBlockNum[a] = blockNum[i];
		}
		
		//計算實體地址
		for(int i=3,a=0;i
自己也只是簡單的實現了,要想很完整的實現就要進行相關的判斷,這個程式還是要完善。只是把先進先出算的思想表示出來。

這裡是執行截圖:



第一次寫這麼長的部落格,希望對你有幫助,嘿嘿微笑