操作系统实验五 虚拟存储器管理

实验五虚拟存储器管理一、实验目的1、理解虚拟存储器概念。2、掌握分页式存储管理地址转换和缺页中断。二、实验内容与基本要求1、模拟分页式存储管理中硬件的地址转换和产生缺页中断。2、用先进先出页面调度算法处理缺页中断。三、实验报告内容1、分页式存储管理和先进先出页面调度算法原理。a.分页式存储管理原理  在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将

大家好,又见面了,我是你们的朋友全栈君。

实验五 虚拟存储器管理

一、实验目的

1、 理解虚拟存储器概念。

2、 掌握分页式存储管理地址转换和缺页中断。

二、实验内容与基本要求

1、 模拟分页式存储管理中硬件的地址转换和产生缺页中断。

2、 用先进先出页面调度算法处理缺页中断。

三、实验报告内容

1、 分页式存储管理和先进先出页面调度算法原理。

a.分页式存储管理原理

  在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。
  如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式。在分页存储管理方式中,如果不具备页面对换功能,则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。
  请求式分页系统是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和页面置换功能。

b.先进先出页面调度算法原理

  优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

2、 程序流程图。

这里写图片描述

3、 程序及注释。

#include<cstdio>
#include<cstring>
#define SizeOfPage 100
#define SizeOfBlock 128
#define M 4 
struct info//页表信息结构体
{
    bool flag; //页标志,1表示该页已在主存,0表示该页不在主存
    long block;//块号
    long disk;//在磁盘上的位置
    bool dirty;//更新标志
}pagelist[SizeOfPage];
long po;//队列标记
long P[M];//假设内存中最多允许M=4个页面
void init_ex1()  //内存空间初始化。
{
    memset(pagelist,0,sizeof(pagelist));  
    /*分页式虚拟存储系统初始化*/
    pagelist[0].flag=1;               
    pagelist[0].block=5;///////////////
    pagelist[0].disk=011;
    pagelist[1].flag=1;
    pagelist[1].block=8;///////////////
    pagelist[1].disk=012;
    pagelist[2].flag=1;
    pagelist[2].block=9;//////////////////
    pagelist[2].disk=013;
    pagelist[3].flag=1;
    pagelist[3].block=1;////////////////////
    pagelist[3].disk=021;
}
void work_ex1()   //模拟分页式存储管理中硬件的地址转换和产生缺页中断过程
{
    bool stop=0;
    long p,q;
    char s[128];
    do
    {
        printf("请输入指令的页号和单元号:\n");
        if(scanf("%ld%ld",&p,&q)!=2)
        {
            scanf("%s",s);
            if(strcmp(s,"exit")==0)    //如果输入的为"exit"那么就退出,进入重选页面
            {
                stop=1;              
            }
        }
        else
        {
            if(pagelist[p].flag)         //如果该页flag标志位为1,说明该页在主存中
            {
                printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q);  //////////////////计算出绝对地址,绝对地址=块号block×块长(默认128)+单元号///////////
            }
            else
            {
                printf("*%ld\n",p);     //如果该页flag标志位为0,表示该页不在主存中,则产生了一次缺页中断
            }
        }
    }while(!stop);      
}
void init_ex2()   
{
/*用先进先出(FIFO)页面调度算法处理缺页中断的初始化, 其中也包含了对于当前的存储器内容的初始化*/
    po=0;
    P[0]=0;P[1]=1;P[2]=2;P[3]=3;   /////////////////////////对内存中的4个页面进行初始化,并使目前排在第一位的为0///////////////////////////
    memset(pagelist,0,sizeof(pagelist));//内存空间初始化。
    pagelist[0].flag=1;
    pagelist[0].block=5;///////////////////
    pagelist[0].disk=011;
    pagelist[1].flag=1;
    pagelist[1].block=8;//////////////////////
    pagelist[1].disk=012;
    pagelist[2].flag=1;
    pagelist[2].block=9;////////////////////////
    pagelist[2].disk=013;
    pagelist[3].flag=1;
    pagelist[3].block=1;//////////////////////////
    pagelist[3].disk=021;
}
void work_ex2()        //模拟FIFO算法的工作过程
{
    long p,q,i;
    char s[100];
    bool stop=0;
    do 
    {
        printf("请输入指令的页号、单元号,以及是否为内存指令:\n");
        if(scanf("%ld%ld",&p,&q)!=2)
        {
            scanf("%s",s);
            if(strcmp(s,"exit")==0)//如果输入的为"exit"那么就退出,进入重选页面
            {
                stop=1;
            }
        }
        else
        {
            scanf("%s",s);
            if(pagelist[p].flag)//如果该页flag标志位为1,说明该页在主存中
            {
                printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q);///////计算绝对地址,绝对地址=块号block×块长(128)+单元号/////////
                if(s[0]=='Y'||s[0]=='y')//内存指令,在该程序中,无实质性作用
                {
                    pagelist[p].dirty=1;//修改标志为1
                }
            }
            else//如果所输入的页不在内存中
            {
                if(pagelist[P[po]].dirty)       //当前的页面被更新过,需把更新后的内容写回外存
                {
                    pagelist[P[po]].dirty=0;//将标志位复0
                }
                pagelist[P[po]].flag=0;   //将flag标志位置0,表示当前页面已被置换出去
                printf("out%ld\n",P[po]); //显示根据FIFO算法被置换出去的页面
                printf("in%ld\n",p);      //////////////////////显示根据FIFO算法被调入的页面,此时将调入的页置于换出页的位置、、、、、、
                pagelist[p].block=pagelist[P[po]].block;//将换出页的块号赋给调入页
                pagelist[p].flag=1; //将当前页面的标记置为1,表示已在主存中
                P[po]=p;   //保存当前页面所在的位置
                po=(po+1)%M;  
            }
        }
    }while(!stop);
    printf("数组P的值为:\n");
    for(i=0;i<M;i++)     //循环输出当前数组的数值,即当前在内存中的页面
    {
        printf("P[%ld]=%ld\n",i,P[i]);
    }
}
void select()       //选择哪种方法进行
{
    long se;
    char s[128];
    do
    {
        printf("请选择题号(1/2):");
        if(scanf("%ld",&se)!=1)
        {
            scanf("%s",&s);
            if(strcmp(s,"exit")==0)  //如果输入为exit则退出整个程序
            {
                return;
            }
        }
        else
        {
            if(se==1)      //如果se=1,说明选择的是模拟分页式存储管理中硬件的地址转换和产生缺页中断
            {
                init_ex1();   //调用init_ex1子函数,初始化
                work_ex1();   //进行模拟
            }
            if(se==2)      //如果se=2说明选择的是FIFO算法来实现页面的置换
            {
                init_ex2();  //初始化
                work_ex2();  //进行模拟
            }
        }
    }while(1);
}
int main()
{
    select();      //调用select函数,选择题号
    return 0;
}

4、 运行结果以及结论。

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126476.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis+springboot+flowable6.4.0遇到的问题[通俗易懂]

    mybatis+springboot+flowable6.4.0遇到的问题[通俗易懂]整合mybatis+springboot+flowable6.4.0遇到的坑前面一大堆都是记录问题过程,爱看不看。解决办法再最后。问题:org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound)解决办法:就是兼顾flowable和mybatis的配置.完前面一大堆都是记录问题过程,爱看不看。解决…

    2022年5月11日
    42
  • 微信小程序个人心得「建议收藏」

    微信小程序个人心得「建议收藏」昨天看了一下微信小程序官方文档,总结一下自己学习的个人心得.首先从官方文档给的框架说起,微信小程序官方文档给出了app.js,app.json,app.wxss.先从这三个文件说起.app.js这个文件是整个小程序的入口文件,开发者的逻辑代码在这里面实现,同时在这个文件夹里面可以定义全局变量.app.json这个文件可以对小程序进行全局配置,决定页面文件的路径,窗口表现,设置网络超时时间

    2025年12月13日
    3
  • 圆柱体积在线计算机,(完整版)圆柱体积计算练习题.docx

    圆柱体积在线计算机,(完整版)圆柱体积计算练习题.docx柱的表面和体积的计算练习题一个蓄水池是圆柱形的,底面面积为31.4平方分米,高2.8分米,这个水池最多能容多少升水?一个圆柱体的高是37.68厘米,它的侧面展开后恰好是正方形,这个圆柱体的体积是多少?一个圆柱形水桶的体积是24立方分米,底面积是6平方分米,桶的装满了水,求水面高是多少分米?一个圆柱形量桶,底面半径是5厘米,把一块铁块从这个量桶里取出后,水面下降厘米,这块…

    2025年12月5日
    5
  • CentOS7中关闭firewall,并使用iptables管理防火墙

    CentOS7中关闭firewall,并使用iptables管理防火墙

    2021年10月19日
    43
  • Java:使用wait()与notify()实现线程间协作

    Java:使用wait()与notify()实现线程间协作

    2021年7月26日
    53
  • CPU指令集——AVX2

    CPU指令集——AVX21.查看CPU所支持的指令集借助CPU-Z工具,可查看当前CPU所支持的指令集:由此可知,Inteli7-7700CPU支持AVX2指令集,但是不支持AVX-512指令集。根据https://medium.com/@hdevalence/even-faster-edwards-curves-with-ifma-8b1e576a00e9可知,其基于AVX512-IFMA的实现是AVX2速…

    2022年5月7日
    1.3K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号