请求页式存储管理实验

一、     实验目的:

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

二、    实验要求:

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

(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);
    }
}

转载于:https://www.cnblogs.com/youyumengyu/p/6054074.html

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设每个面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32,目前它的所有都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺,此时需要记录缺的次数,并将相应调入内存。如果4个内存块均已装入该作业,则需要进行面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
完整虚拟存储管理实验报告!一、实验目的请求虚存管理是常用的虚拟存储管理方案之一。通过请求虚存管理中对面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求虚存管理的面调度算法的理解。二、实验环境 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值为最小的虚,将该虚从装载它的那个实中置换出去,并在该实中装入当前正要访问的虚。~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值