java实现页式存储管理

123.png
123.png

基本框架

屏幕快照 2017-11-24 12.41.42.png
屏幕快照 2017-11-24 12.41.42.png

page.java

//page类
package pagedStorageManagement;

public class page {
    private int pageNumber;//页号
    private int physicsNumber;//物理页号
    private boolean state;//状态位
    private int visitCount;//访问字段
    private boolean change;//修改位
    private int CRTAddress;//外存地址

    public page()
    {
        this.pageNumber = -1;
        this.physicsNumber = -1;
        this.state = false;
        this.visitCount = 0;
        this.change = false;
        this.CRTAddress = -1;
    }
    public page( int pageNumber, int physicsNumber, boolean state, int visitCount, boolean change, int CRTAddress)
    {
        this.pageNumber = pageNumber;
        this.physicsNumber = physicsNumber;
        this.state = state;
        this.visitCount = visitCount;
        this.change = change;
        this.CRTAddress = CRTAddress;
    }
    public void setPageNumber( int pageNumber )
    {
        this.pageNumber = pageNumber;
    }
    public void setPhysicsNumber( int physicsNumber )
    {
        this.physicsNumber = physicsNumber;
    }
    public void setState (boolean state )
    {
        this.state=state;
    }
    public void setVisitCount( int visitCount )
    {
        this.visitCount = visitCount;
    }
    public void setChange( boolean change )
    {
        this.change = change;
    }
    public void setCRTAddress( int CRTAddress )
    {
        this.CRTAddress = CRTAddress;
    }
    public int getPageNumber( )
    {
        return this.pageNumber;
    }
    public int getPhysicsNumber()
    {
        return this.physicsNumber;
    }
    public boolean getState()
    {
        return this.state;
    } 
    public int getVisitCount()
    {
        return this.visitCount;
    }
    public boolean getChange()
    {
        return this.change;
    }
    public int getCRTAddress()
    {
        return this.CRTAddress;
    }

}

shell.java

//shell类
package pagedStorageManagement;
import java.util.Scanner;

public class shell {
    page shell[];
    private int current;
    private int length;
    public shell(){};
    public shell( int length )
    {
        this.length = length;
        this.current = 0;
        shell = new page[length];
        for( int i = 0; i < length ; i++ )
        {
            this.shell[i] = new page();
        }
    }
    public void setCurrent( int current )
    {
        this.current = current;
    }
    public int getCurrent()
    {
        return this.current;
    }
    public int searchPage( int pageNumber )
    {
        int i = 0;
        if( this.current == 0 )
        {
            return -2;
        }
        else
        {
            while( i < this.current )
            {
                if( this.shell[i].getPageNumber() == pageNumber )
                {
                    return i;
                }
                i++;
            }
            return -1;
        }
    }
    public void inChange( int b[], String ch, int number )
    {
        Scanner a = new Scanner( System.in );
        switch( ch )
        {
            case "yes":
            {
                System.out.println("请输入一个新的数据");
                b[this.shell[number].getPhysicsNumber() ] = a.nextInt();
                this.shell[number].setChange( true );
                System.out.println("修改成功");
                break;
            }
            case "no":
            {
                break;
            }
            default:
            {
                System.out.println("输入字符有误,将退出程序!");
                System.exit(0);
            }
        }
    }
    public int isOver()
    {
        if( this.current >= this.length )
        {
            return 1;
        }
        else
            return 0;
    }
    public int minVisitCount()
    {
        int i,t=0;
        for (i=1; i<this.current; i++) 
        {
            if( this.shell[i].getVisitCount() < this.shell[t].getVisitCount() )
            {
                t = i;
            }
        }
        return t;
    }
    public int isChange( int number )
    {
        if( this.shell[number].getChange() == true )
        {
            return 1;
        }
        else
            return 0;
    }
    public void printPageShell()
    {
        System.out.println("页表:");
        System.out.println("索引\t"+"页号\t"+"物理块号\t"+"状态\t"+"访问次数\t"+"修改\t"+"外存地址\t");
        for( int i=0; i<this.length; i++ )
        {
            System.out.println(i+"\t"+this.shell[i].getPageNumber()+"\t"+this.shell[i] .getPhysicsNumber()+"\t"+this.shell[i].getState()+"\t"+this.shell[i].getVisitCount()+"\t"+this.shell[i].getChange()+"\t"+this.shell[i].getCRTAddress());
        }
    }
    public void programFunction()
    {
        System.out.println("***********************请求分页存储系统***********************");
        System.out.println("功能:");
        System.out.println("\t 1.查看页表");
        System.out.println("\t 2.查看快表");
        System.out.println("\t 3.查看外存");
        System.out.println("\t 4.在内存修改数据");
        System.out.println("\t 5.继续访问页面");
        System.out.println("\t 6.退出程序");
    }
    public void dealFunction( int i, KShell TLB, source s[], int b[] )
    {
        if (i == 1 )
        {
            this.printPageShell();
        } 
        else if ( i == 2) 
        {
            TLB.printKShell();
        }
        else if ( i ==3 ) 
        {
            System.out.println("外存:");
            System.out.println("外存地址\t"+"页号\t"+"数据\n");
            for (int k=0; k<20; k++) 
            {
                s[k].printSource(k);
            }
        }
        else if ( i == 4) 
        {
            String ch = "yes";
            int pageNumber;
            Scanner a = new Scanner( System.in );
            System.out.println("请输入一个页号:");
            pageNumber = a.nextInt();
            int number = this.searchPage( pageNumber );
            if( number <0 )
            {
                System.out.println("内存中没有此页号");
            }
            else
            {
                this.inChange( b,ch,number );
            }
        }
        else if ( i == 6) 
        {
            System.out.println("结束程序");
            System.exit(0);
        }
    }
    public static void main( String[] args )
    {
        Scanner a = new Scanner( System.in );
        int i,number = -10,k1,k2,result;
        int k3 = 0;//当前存储的内存地址
        int t;//页表中访问次数最小的索引
        int b[] = new int[10];//内存中存储的数据
        String ch;
        int sLength,pLength,tLength,data;
        System.out.println("请输入外存大小:");
        sLength = a.nextInt();
        System.out.println("请输入页表大小:");
        pLength = a.nextInt();
        System.out.print("请输入快表大小:"); 
        tLength = a.nextInt();
        //定义页表,快表,外存
        shell pageShell = new shell( pLength );//页表
        source s[] = new source[sLength];//外表
        KShell TLB = new KShell( tLength );//快表
        System.out.println("产生一个随机序列作为外存数据!");
        //录入外存地址和数据
        for( i = 0; i < sLength; i++ )
            { 
                data = (int)( 100 * Math.random() ); 
                System.out.print( data + "\t"); 
                s[i] = new source( i, data );
            }
            System.out.println("\n外存设置成功");
            //请求页表
            do
            {
                //TLB.printKShell();//打印当前快表的情况
                //pageShell.printPageShell();//打印当前页表的情况
                System.out.println("请输入一个页面的页号(0-19):");
                k1 = a.nextInt();
                if( k1 >= 20 || k1 < 0 )
                {
                    System.out.println("输入数据有错,将退出程序!");
                    System.exit(0);
                }
                //检测快表,快表存储当前的页表项,即当快表满时采用最近最久未被使用算法置换快表
                System.out.println("进入快表检测");
                if( TLB.getCurrent() > 0 )
                {
                    number = TLB.searchPage(k1);
                    if( number!=-1 && number!=-2 )
                    {
                        result = b[TLB.shell[number].getPhysicsNumber()];
                        System.out.println("在快表中找到,结果为:" + result );
                        //找出该页号在页表中的位置并修改访问字段
                        number = TLB.shell[number].getCRTAddress();
                        pageShell.shell[number].setVisitCount(pageShell.shell[number].getVisitCount()+1 );
                    }
                }
                if( TLB.getCurrent() <= 0 || number == -1 )
                {
                    System.out.println("在快表中找不到!" + "进入内存检测:");
                    //在快表中找不到,去内存区的页表找
                    if( pageShell.current>0 )
                    {
                        number = pageShell.searchPage(k1);//页号k1所在的下标
                        if( number !=-1 && number!=-2 )
                        {
                            result = b[pageShell.shell[number].getPhysicsNumber()];
                            System.out.println("在页表中找到,结果为:" + result );
                            //修改访问字段和状态位
                            pageShell.shell[number].setVisitCount(pageShell.shell[number].getVisitCount()+1);
                            //修改快表
                            TLB.changeKShell( pageShell,number );

                        }
                    }
                    if( pageShell.current <= 0 || number== -1 )
                    {
                        System.out.println("在内存中找不到!");
                        System.out.println("从外存中调入内存:");
                        //在页表找不到,去外存区找
                        for( i=0; i<sLength ; i++ )
                        {
                            if( k1 ==s[i].getPageNumber() )//在外存找到了缺页
                            {
                                k2 = pageShell.isOver();
                                if( k2 == 1 )//内存已满
                                {
                                    t = pageShell.minVisitCount();
                                    System.out.println("内存已满!即将调出页号 " + pageShell.shell[t].getPageNumber());
                                }
                                else
                                {
                                    t = pageShell.current;
                                    pageShell.setCurrent( pageShell.getCurrent() + 1 );
                                }
                                //判断是否修改了内存的数据
                                if( pageShell.isChange(t) == 1 )
                                {
                                    s[pageShell.shell[t].getCRTAddress()].setSts(b[pageShell.shell[t].getPhysicsNumber()]);
                                }
                                //调入内存
                                pageShell.shell[t].setPageNumber(k1);
                                if( k2 == 1 )
                                {
                                    b[pageShell.shell[t].getPhysicsNumber()] = s[i].getSts();
                                }
                                else
                                {
                                    pageShell.shell[t].setPhysicsNumber(k3);//未满则设置物理块号,满了只改变其他5个字段
                                    b[k3] = s[i].getSts();
                                    k3++;//物理块号
                                }
                                pageShell.shell[t].setState(true);
                                pageShell.shell[t].setVisitCount(1);
                                pageShell.shell[t].setChange(false);
                                pageShell.shell[t].setCRTAddress(i);
                                System.out.println("调入内存成功!");
                                //修改快表
                                TLB.changeKShell(pageShell,t);
                                System.out.println("修改快表成功!");
                                System.out.println("结果为:" + b[ k3-1 ]);
                                break;
                            }
                        }
                    }
                }
                do
                {
                    pageShell.programFunction();
                    System.out.println("请输入一个整数(1-6):");
                    i = a.nextInt();
                    while( i<1 || i>6 )
                    {                       
                        System.out.println("输入有误,请重新输入(1-6):");
                        i = a.nextInt();
                    }
                    pageShell.dealFunction( i,TLB,s,b );
                }while( i != 5 );
            }while(i==5);
            System.out.println("退出程序!");
    }
}

KShell.java

//KShell类
package pagedStorageManagement;

public class KShell 
{
    page shell[];
    private int current;
    private int length;
    private int changeNumber;//修改快表的次数
    public KShell(){};
    public KShell( int length )
    {
        this.length = length;
        this.current = 0;
        this.changeNumber = 0;
        shell = new page[length];
        for (int i=0; i<length; i++) 
        {
            this.shell[i] = new page();
        }
    }
    public void setCurrent( int current )
    {
        this.current = current;
    }
    public void setChangeNumber( int changeNumber )
    {
        this.changeNumber = changeNumber;
    }
    public int getCurrent()
    {
        return current;
    }
    public int getChangeNumber()
    {
        return changeNumber;
    }
    public int getLength()
    {
        return length;
    }
    public int searchPage( int pageNumber )
    {
        int i = 0;
        if( this.changeNumber == 0 && this.current == 0 )
        {
            return -2;
        }
        else if( this.changeNumber < this.length )
        {
            while( i < this.current )
            {
                if( this.shell[i].getPageNumber() == pageNumber )
                {
                    return i;
                }
                i++;
            }
            return -1;
        }
        else
        {
            while( i < this.length )
            {
                if( this.shell[i].getPageNumber() == pageNumber )
                {
                    return i;
                }
                i++;
            }
            return -1;
        }
    }
    public void changeKShell( shell pageShell, int number )
    {
        if( this.getChangeNumber() >= this.getLength() )
        {
            if ( this.getCurrent() == this.getLength() ) 
            {
                this.setCurrent(0);
            }
            System.out.println("快表已满,快表中即将调出页号" + this.shell[ this.current ].getPageNumber() );
        }
        if ( this.getCurrent() < this.getLength() ) 
        {
            this.shell[this.getCurrent()].setCRTAddress(number);
            this.shell[this.getCurrent()].setPageNumber(pageShell.shell[number].getPageNumber());
            this.shell[this.getCurrent()].setPhysicsNumber(pageShell.shell[number].getPhysicsNumber());
            this.setCurrent( this.getCurrent()+1 );
            this.setChangeNumber( this.getChangeNumber() + 1 );
        }
    }
    public void printKShell()
    {
        System.out.println("快表:");
        System.out.println("索引\t"+"页号\t"+"物理块号\t"+"在页表下的索引");
        for( int i=0; i<this.length; i++ )
        {
            System.out.println( i + "\t" + this.shell[i].getPageNumber() + "\t" + this.shell[i] .getPhysicsNumber() + "\t" + this.shell[i].getCRTAddress() );
        }
    }
}

source.java

//source类
package pagedStorageManagement;

public class source {
    private int pageNumber;//页号
    private int sts;//数据
    private int length;

    public source(){};
    public source( int pageNumber , int sts )
    {
        this.pageNumber = pageNumber;
        this.sts = sts;
    }
    public void setPageNumber( int pageNumber )
    {
        this.pageNumber = pageNumber;
    }
    public void setSts( int sts )
    {
        this.sts = sts;
    }
    public int getPageNumber()
    {
        return pageNumber;
    }
        public int getSts()
    {
        return sts;
    }
    public void printSource( int i )
    {
        System.out.println( i + "\t" + this.pageNumber + "\t" + this.sts + "\n" );
    }

}

使用说明

本程序是使用java语言编写的实现请求分页存储管理的程序,是在eclipise下运行的结果,只需运行Shell类就行了。
首先先设置外存,页表和快表的大小,然后输入一个请求访问的页面。

测试样例

屏幕快照 2017-11-24 12.52.04.png
屏幕快照 2017-11-24 12.52.04.png

屏幕快照 2017-11-24 12.53.05.png
屏幕快照 2017-11-24 12.53.05.png

屏幕快照 2017-11-24 12.53.26.png
屏幕快照 2017-11-24 12.53.26.png

屏幕快照 2017-11-24 12.53.43.png
屏幕快照 2017-11-24 12.53.43.png

源码下载

请点击右侧地址:Paged Storage Management
#个人主页:www.iooy.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,460评论 25 707
  • 人生很复杂的吗? 人生于我来说,也就是走一程,从生到死的这一程。 其间做做自己认为有意义或是值得做的事。 在我自己...
    力牧阅读 133评论 0 0
  • 流走了年华 物逝人非 再回首 已模糊了 心还是双眼 曾以为的深刻 原来也只是刻在了 那时那刻 那时的你喜欢着那时的...
    醉潇潇的地瓜阅读 223评论 0 0