頁面置換演算法--FIFO(作業系統)
阿新 • • 發佈:2020-12-29
技術標籤:那些年令人頭痛的PTA
頁面置換演算法–FIFO
先初始化頁面大小,和物理塊數。連續輸入頁面的邏輯地址,以“-1”作為結束標誌,採用FIFO頁面置換演算法、固定分配區域性置換分配策略。輸出該頁面的頁號和頁內位移,若該頁不在記憶體,並且還有剩餘的物理塊,將該頁調入記憶體,輸出“該頁不在記憶體中,調入!”輸出當前在記憶體的物理塊號和對應的頁號(若當前物理塊為空,則輸出void);若該頁不在記憶體,並且沒有剩餘的物理塊,按照FIFO演算法選擇一頁調出後將該頁調入記憶體,輸出“已無空閒物理塊,置換!”並輸出當前在記憶體的物理塊號和對應的頁號(若當前物理塊為空,則輸出void)。
輸入格式:
輸入頁面大小和物理塊數,連續輸入頁面的邏輯地址,以“-1”作為結束標誌。
輸出格式:
第一行輸出頁號和頁內偏移,第二行若不在記憶體,按照要求輸出提示,若在記憶體則什麼都不輸出,隨後輸出“物理塊號 頁號”,再連續輸出每個邏輯地址頁面的物理塊號和頁內位移,以及當前記憶體的物理塊號和頁號的對應關係。
輸入樣例1:
在這裡給出一組輸入。例如:
1024 3
1
-1
輸出樣例1:
在這裡給出相應的輸出。例如:
頁號:0 頁內偏移:1
該頁不在記憶體中,調入!
物理塊號 頁號
0 0
1 void
2 void
輸入樣例2:
在這裡給出一組輸入。例如:
1024 3
1
1056
2096
3175
-1
輸出樣例2:
在這裡給出相應的輸出。例如:
頁號:0 頁內偏移:1
該頁不在記憶體中,調入!
物理塊號 頁號
0 0
1 void
2 void
頁號:1 頁內偏移:32
該頁不在記憶體中,調入!
物理塊號 頁號
0 0
1 1
2 void
頁號:2 頁內偏移:48
該頁不在記憶體中,調入!
物理塊號 頁號
0 0
1 1
2 2
頁號:3 頁內偏移:103
已無空閒物理塊,置換!
物理塊號 頁號
0 3
1 1
2 2
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Page> pages = new ArrayList<>();
List<Integer> pageAddr = new ArrayList<>();
int pageSize,blockNumber,pageAddress,i=0,j;
pageSize = sc.nextInt();
blockNumber = sc.nextInt();
pageAddress = sc.nextInt();
for (j = 0;j<blockNumber;j++){
pages.add(new Page(i,-1,i));
i++;
}
while (pageAddress != -1){
pageAddr.add(pageAddress);
pageAddress = sc.nextInt();
}
for (Integer integer : pageAddr) {
int min = getMin(pages,integer,pageSize);
System.out.println("頁號:"+integer / pageSize+" 頁內偏移:"+integer % pageSize);
if (min != -3) {
if (pages.get(min).pageNumber == -1) {
System.out.println("該頁不在記憶體中,調入!");
}else {
System.out.println("已無空閒物理塊,置換!");
}
pages.get(min).flag = i;
i++;
pages.get(min).pageNumber = integer / pageSize;
}
printf(pages);
}
}
static class Page{
private int blockNumber;
private int pageNumber;
private int flag;
public Page(int blockNumber, int pageNumber, int flag) {
this.blockNumber = blockNumber;
this.pageNumber = pageNumber;
this.flag = flag;
}
public int getBlockNumber() {
return blockNumber;
}
public void setBlockNumber(int blockNumber) {
this.blockNumber = blockNumber;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
}
public static int getMin(List<Page> pages,int integer,int pageSize){
int tmp = 1000,tmp01 = -1;
for (int i = 0; i < pages.size(); i++) {
if (pages.get(i).flag < tmp){
tmp = pages.get(i).flag;
tmp01 = i;
}
if (pages.get(i).pageNumber == integer / pageSize) {
tmp01 = -3;
break;
}
}
return tmp01;
}
public static void printf(List<Page> pages){
System.out.println("物理塊號 頁號");
for (int i = 0; i < pages.size(); i++) {
System.out.print(i+" ");
if (pages.get(i).pageNumber == -1)
System.out.println("void");
else System.out.println(pages.get(i).pageNumber);
}
}
}