虚拟存储管理器的页面调度

请求分页式存储管理:每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存;如果该页不在主存且内存块未满,则调入该页;如果该页不在主存且内存块已满,则按页面淘汰算法淘汰一页后调入所需的页。
设该作业共有320条指令,即它的地址空间为32页,目前它的所有页面都还未调入内存。在模拟过程中,每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印内存块情况;如果该页不在主存且内存块未满,则调入一页并打印内存块情况;如果该页不在主存且内存块已满,则按页面淘汰算法淘汰一页后调入所需的页,打印内存块情况; 逐个地址访问,直到所有地址访问完毕。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
置换算法:请分别考虑FIFO和LRU算法。


首先设计指令类,代码如下:

package 页面调度;

import java.util.Random;

public class Order {
    private int order;                      //指令内容
    private int address;                    //指令地址
    private boolean flag = false;           //状态位,判断是否被访问

    public Order() {
        Random r = new Random();
        this.order = r.nextInt(320);
        this.address = this.order / 10 +1;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public int getOrder() {
        return order;
    }

    public int getAddress() {
        return address;
    }

    public void Print(){
        System.out.println("    "+this.order+"      "+this.address+"        "+this.flag);
    }
}

然后构造页面类,代码如下:

package 页面调度;

import java.util.ArrayList;

public class Page {
    private ArrayList<Order> page = new ArrayList<Order>();                                         //页面 数组
    private int Number;                                                                             //页面个数

    public Page(int number) {
        Number = number;
        int count = 0;
        while( count != number){
            Order myorder = new Order();
            if (this.IsExited(myorder.getAddress()) == false){
                page.add(myorder);
                count++;
            }
        }
    }

    public boolean IsExited(int order){
        boolean flag = false;
        if ( this.getPage().size() == 0){
            flag = false;
        }else{
            for ( int i = 0 ; i < this.getPage().size() ; i++){
                if ( this.getPage().get(i).getOrder() == order){
                    flag = true;
                    break;
                }
            }
        }
        return flag;
    }

    public ArrayList<Order> getPage() {
        return page;
    }

    public int getNumber() {
        return Number;
    }

    public ArrayList<Order> VisitOrderAlgorithm(){                                                  //随机访问页面算法
        ArrayList<Order> myorder = new ArrayList<Order>();                                          //随机获取的页面数组
        int count = 0;
        while( count != 3){
            int i = 0;
            do{
                if ( this.IsALLVisited() == false){
                    if ( this.page.get(i).isFlag() == false){
                        myorder.add(this.page.get(i));
                        this.page.get(i).setFlag(true);
                        break;
                    }else{
                        i++;
                    }
                }else{
                    break;
                }
            }while(true);
            count++;
        }
        return myorder;
    }

    public void Print_Order(ArrayList<Order> a){                                                                //打印指令
        for ( int i = 0 ; i < a.size(); i++){
            System.out.println(i+"  "+a.get(i).getOrder()+" "+a.get(i).getAddress()+"   "+a.get(i).isFlag());
        }
    }

    public void Print(){                                                                            //打印所有指令
        for ( int i = 0 ; i < this.page.size() ; i++){
            this.page.get(i).Print();
        }
    }

    public boolean IsALLVisited(){                                                                  //判断页面是否全部访问
        boolean flag = true;
        for ( int i = 0 ; i < this.page.size() ; i++){
            if ( this.page.get(i).isFlag() == false){
                flag = false;
                break;
            }
        }
        return flag;
    }
}

对于FIFO,LRU算法我们利用接口来实现,代码如下:
FIFO接口如下:

package 页面调度;

public interface FIFO {
    public void CarryOutFIFO(Page MyPage);
}

LRU接口如下:

package 页面调度;

public interface LRU {
    public void CarryOutLRU(Page MyPage);
}

最后实现FIFO与LRU算法,代码如下:

package 页面调度;

import java.util.ArrayList;

public class Shdeule implements FIFO,LRU{
    private int MissPage = 0;                                               //缺页数
    private double MissPageRate = 0;                                        //缺页率
    private ArrayList<Order> MemoryBlock = new ArrayList<Order>();          //内存块
    private ArrayList<Order> LongNotUse = new ArrayList<Order>();           //最久未使用页面

    public int getMissPage() {
        return MissPage;
    }

    public void AddMissPage() {
        MissPage++;
    }

    public void setMissPage(int missPage) {
        MissPage = missPage;
    }

    public ArrayList<Order> getMemoryBlock() {
        return MemoryBlock;
    }

    public double getMissPageRate() {
        return MissPageRate;
    }

    public void setMissPageRate(double missPageRate) {
        MissPageRate = missPageRate;
    }

    public int SearchAddress(int address ,ArrayList<Order> longNotUse2){                                        //在内存块中寻找页面
        int flag = -1;
        for ( int i = 0 ; i < this.MemoryBlock.size() ; i++){
            if (this.MemoryBlock.get(i).getAddress() == address){
                flag = i;
                break;
            }
        }
        return flag;
    }

    public void Print(){
        System.out.println("缺页数为:"+this.getMissPage());
        System.out.println("缺页率为:"+this.getMissPageRate());
    }

    @Override
    public void CarryOutFIFO(Page MyPage) {                                                             //FIFO调度算法
        // TODO Auto-generated method stub
        ArrayList<Order> myorder;
        boolean flag = false;
        do{                                                                                         //开始执行FIFO
            myorder = MyPage.VisitOrderAlgorithm();
            if ( myorder != null){
                for ( int i = 0 ; i < myorder.size() ; i++){
                    int index = this.SearchAddress(myorder.get(i).getAddress(),this.getMemoryBlock());
                    if ( !this.IsFull()){
                        if ( index == -1){
                            this.AddMissPage();
                            this.MemoryBlock.add(myorder.get(i));
                        }
                    }else{
                        if ( index == -1){
                            this.AddMissPage();
                            this.MemoryBlock.add(myorder.get(i));
                            this.MemoryBlock.remove(0);
                        }
                    }
                }
            }
            flag = MyPage.IsALLVisited();
        }while (flag == false);
        this.setMissPageRate(this.getMissPage() * 1.0 / MyPage.getNumber());
    }

    public boolean IsFull(){
        boolean flag = false;
        if(this.getMemoryBlock().size() == 4){
            flag = true;
        }
        return flag;
    }

    @Override
    public void CarryOutLRU(Page MyPage) {                                                      //LRU调度算法
        // TODO Auto-generated method stub
        ArrayList<Order> myorder;
        boolean flag = false;
        do{
            myorder = MyPage.VisitOrderAlgorithm();
            if ( myorder != null){
                for ( int i = 0 ; i < myorder.size(); i++){
                    int index = this.SearchAddress(myorder.get(i).getAddress(), this.getMemoryBlock());
                    if ( !this.IsFull()){
                        if ( index == -1){
                            this.AddMissPage();
                            this.MemoryBlock.add(myorder.get(i));
                            LongNotUse.add(myorder.get(i));
                        }else{
                            Order tmp = myorder.get(i);
                            int tmp_index = this.SearchAddress(tmp.getAddress(), LongNotUse);
                            if ( tmp_index != -1){
                                LongNotUse.add(tmp);
                            }
                        }
                    }else{
                        Order tmp;
                        if ( index == -1){
                            tmp = this.LongNotUse.get(0);
                            int tmp_index = this.SearchAddress(tmp.getAddress(),this.MemoryBlock);
                            if ( tmp_index != -1){
                                this.getMemoryBlock().remove(tmp_index);
                                this.getMemoryBlock().add(tmp_index,myorder.get(i));
                                this.AddMissPage();
                                LongNotUse.remove(0);
                                LongNotUse.add(myorder.get(i));
                            }
                        }else{
                            tmp = myorder.get(i);
                            int tmp_index = this.SearchAddress(tmp.getAddress(), LongNotUse);
                            LongNotUse.remove(tmp_index);
                            LongNotUse.add(myorder.get(i));
                        }
                    }
                }
                flag = MyPage.IsALLVisited();
            }
        }while(flag == false);
        this.setMissPageRate(this.getMissPage() * 1.0 / MyPage.getNumber());
    }

    public void CarryOut(Page MyPage){
        System.out.println("------------------------------------开始FIFO-------------------------------");
        this.CarryOutFIFO(MyPage);
        this.Print();
        System.out.println("------------------------------------结束FIFO-------------------------------");

        for (int i = 0 ; i < MyPage.getNumber() ; i++){
            MyPage.getPage().get(i).setFlag(false);                             //把所有指令标志位清零
        }
        this.getMemoryBlock().clear();                                          //把内存块清零
        this.setMissPage(0);                                                    //把缺页数清零

        System.out.println("------------------------------------开始LRU--------------------------------");
        this.CarryOutLRU(MyPage);
        this.Print();
        System.out.println("------------------------------------结束LRU--------------------------------");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Page MyPage = new Page(320);
        Shdeule myshdeule = new Shdeule();
        myshdeule.CarryOut(MyPage);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计一个有N个进程并发的进程调度程序。进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片,运行后已占用CPU时间加1。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 设计一个请求页式存储管理方案。并编写模拟程序实现。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。为简单起见,页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。具体的做法可以是:产生一个需要访问的指令地址流; 指令合适的页面尺寸(例如以 1K或2K为1页); 指定内存页表的最大长度,并对页表进行初始化; 每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不在主存且页表已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daipuweiai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值