页面置换算法--FIFO(操作系统)

页面置换算法–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);
       }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值