请求页式存储管理实验

cnblog地址:http://www.cnblogs.com/youyumengyu/p/6054074.html点击打开链接

一、     实验目的:

通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二、    实验要求:

设计一个请求页式存储管理方案。并编写模拟程序实现。

(1)产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。

(2)简单起见,页面淘汰算法采用LRU页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。

具体的做法可以是:

(1)产生一个需要访问的指令地址流,如  1059B,1060B,3059B,4753B,2241B…………;

(2)指令合适的页面尺寸(例如以 1KB或2KB为1页);

(3)指定内存页表的最大长度,并对页表进行初始化;

(4)每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不在主存且页表已满,则按LRU页面淘汰算法淘汰一页后调入所需的页,打印页表情况;

(5)逐个地址访问,直到所有地址转换/访问完毕。


代码:


import java.util.LinkedList;

public class LRU {

    private LinkedList<Integer> stack;//模拟页面'寄存器'
    private int size;//寄存器大小,表示一共可装入多少页面
    
    public LRU(int size) {
        stack = new LinkedList<>();
        this.size = size;
    }

    //LRU算法简单实现,返回一共未命中的次数
    public int lru(int[] pageNumbers)
    {
        if(size <= 0 || pageNumbers == null)
            throw new IllegalArgumentException("illegal arugments");
        
        if(pageNumbers.length <= size)
            return pageNumbers.length;
       
        int unhit = 0;
            
        for(int i = 0; i < pageNumbers.length; i++)
        {
            int index = isHit(pageNumbers[i]);
            if(index == -1)
            {
                unhit = processUnHit(pageNumbers[i], unhit);
                System.out.println("  "+pageNumbers[i]+"  "+"缺页");
            }
            else
            {
                ifHit(pageNumbers[i], index);
                System.out.println("  "+pageNumbers[i]+"  "+"命中");
            }
        }
        return unhit;
    }
    
    /**
     *
     * @param pageNumber 判断 pageNumber是否hit
     * @return -1 表示 unhit, 其他表示hit
     */
    private int isHit(int pageNumber){
        return stack.indexOf(pageNumber);
    }
    
    /**
     * 当栈未满时,未命中的页面号直接入栈;栈满时,需要替换页面,先选中一个页面(栈底)删除,然后Push新页面
     * @param pageNumber 未命中的页面号
     * @param count 当前未命中次数
     * @return 更新后的未命中的次数
     */
    private int processUnHit(int pageNumber, int count){
        if(isFull())
            stack.removeLast();//删除最久未访问的页面
        stack.push(pageNumber);//放入最近访问的页面
        count++;//未命中的次数加1
        return count;
    }
    
    //命中更换
    private void ifHit(int pageNumber, int index){
            stack.push(stack.remove(index));
    }
    
    //判断'寄存器'栈是否已经满了
    private boolean isFull()
    {
        if(stack.size() < size)
            return false;
        else
            return true;
    }
    
    //test
    public static void main(String[] args) {
        int[] pageNumbers = {4,7,1,1,7,2,4,5,7,1,8};
        int size = 3;
        for(int i = 0; i < pageNumbers.length; i++)
            System.out.print("  "+pageNumbers[i]+"  ");
        System.out.println();
        LRU lru = new LRU(size);
        System.out.println("缺页率:"+lru.lru(pageNumbers)+"/"+pageNumbers.length);
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
完整虚拟存储管理实验报告!一、实验目的请求虚存管理是常用的虚拟存储管理方案之一。通过请求虚存管理中对面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求虚存管理的面调度算法的理解。二、实验环境 Turbo C 2.0/3.0或VC++6.0三、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚的进程在给定的若干个实中运行、并在缺中断发生时分别使用FIFO和LRU算法进行面置换的情形。其中虚的个数可以事先给定(例如10个),对这些虚访问地址流(其长度可以事先给定,例如20次虚访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的面命中率。程序应允许通过为该进程分配不同的实数,来比较两种置换算法的稳定性。四、实验说明 1.设计中虚和实的表示本设计利用C语言的结构体来描述虚和实的结构。pnpfntimepnpfnnext 虚结构 实结构在虚结构中,pn代表虚号,因为共10个虚,所以pn的取值范围是0—9。pfn代表实号,当一虚未装入实时,此项值为-1;当该虚已装入某一实时,此项值为所装入的实的实号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚的最近访问时间。在实结构中,pn代表虚号,表示pn所代表的虚目前正放在此实中。pfn代表实号,取值范围(0—n-1)由动态指派的实数n所决定。next是一个指向实结构体的指针,用于多个实以链表形组织起来,关于实链表的组织详见下面第4点。2.关于缺次数的统计为计算命中率,需要统计在20次的虚访问中命中的次数。为此,程序应设置一个计数器count,来统计虚命中发生的次数。每当所访问的虚的pfn项值不为-1,表示此虚已被装入某实内,此虚被命中,count加1。最终命中率=count/20*100%。3.LRU算法中“最近最久未用”面的确定为了能找到“最近最久未用”的虚面,程序中可引入一个时间计数器countime,每当要访问一个面时,countime的值加1,然后将所要访问的虚的time项值设置为增值后的当前countime值,表示该虚的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实的虚中找出time值为最小的虚就是“最近最久未用”的虚面,应该将它置换出去。4.算法中实的组织因为能分配的实数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实,首指针为free_head,初始时n个实都处于free链表中;busy链表用于组织已分配出去的实,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问一个不在实中时,将产生中断。此时若free链表不为空,就取下链表首指针所指的实,并分配给该虚。若free链表为空,则说明n个实已全部分配出去,此时应进行面置换:对于FIFO算法要将busy_head 所指的实从busy链表中取下,分配给该虚,然后再将该实插入到busy链表尾部;对于LRU算法则要从所有已分配实的虚中找出time值为最小的虚,将该虚从装载它的那个实中置换出去,并在该实中装入当前正要访问的虚。~
原创代码+报告(用的是数组)   设计一个请求存储管理方案。并编写模拟程序实现之。要求包含:   1.过随机数产生一个指令序列,共320条指令。其地址按下述原则生成:   ①50%的指令是顺序执行的;   ②25%的指令是均匀分布在前地址部分;   ③25%的指令是均匀分布在后地址部分;   #具体的实施方法是:      在[0,319]的指令地址之间随机选区一起点M;      顺序执行一条指令,即执行地址为M+1的指令;      在前地址[0,M+1]中随机选取一条指令并执行,该指令地址为M’;      顺序执行一条指令,其地址为M’+1;      在后地址[M’+2,319]中随机选取一条指令并执行;      重复A—E,直到执行320次指令。   2.指令序列变换成地址流    设:(1)面大小为1K;       用户内存容量为4到32;        用户虚存容量为32K。   在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方为:    第0条—第9条指令为第0(对应虚存地址为[0,9]);    第10条—第19条指令为第1(对应虚存地址为[10,19]);    。。。。。。。。。。。。。。。。。。。。。    第310条—第319条指令为第31(对应虚存地址为[310,319]);   按以上方,用户指令可组成32。   3. 计算并输出下述各种算法在不同内存容量下的命中率。      FIFO先进先出的算法      LRR最近最少使用算法      OPT最佳淘汰算法(先淘汰最不常用的地址)      LFR最少访问面算法      NUR最近最不经常使用算法
存储管理是一种主存储器管理方,将主存储器划分为大小相等的固定大小的面,每个面都有唯一的标识符,称为号。程序在执行时,需要引用存储器中的数据,这些数据可以存储在多个面中。当程序需要引用某个面时,首先需要将该面从辅存(例如硬盘)中调入到主存储器中,然后再访问面中的数据。如果主存储器中没有空闲面,那么需要将某些面写回到辅存中,以腾出空间来存储新的面。 以下是一个简单的分存储管理实验的设计思路: 1. 设计一个面表,用于记录每个面在主存储器中的位置和状态(例如是否被占用、是否被修改等)。 2. 设计一个面置换算法,用于在主存储器中没有空闲面时,选择一个面将其写回到辅存中,以腾出空间存储新面。常用的面置换算法包括FIFO算法、LRU算法、Clock算法等。 3. 设计一个面调度算法,用于在程序需要引用某个面时,将该面从辅存中调入到主存储器中。常用的面调度算法包括最佳置换算法、先进先出算法等。 4. 实现一个简单的虚拟存储管理系统,包括面表、面置换算法、面调度算法等模块。可以使用C或其他编程语言实现。 5. 编写一些测试用例,测试虚拟存储管理系统的正确性和性能。 以上是一个简单的分存储管理实验的设计思路,具体实现方可能会因为实验要求和环境等因素而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

游语

对你有帮助,可以请我喝杯奶哦

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

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

打赏作者

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

抵扣说明:

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

余额充值