1. 程式人生 > 其它 >頁面置換演算法--FIFO(作業系統)

頁面置換演算法--FIFO(作業系統)

技術標籤:那些年令人頭痛的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); } } }