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

实验五虚拟存储器管理一、实验目的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、 运行结果以及结论。

这里写图片描述

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 内连接,左右连接和全连接的区别是什么_sql左连接和右连接区别

    内连接,左右连接和全连接的区别是什么_sql左连接和右连接区别举例说明假设您有两个表,每个表只有一个列,表数据如下 AB–13243546 注意,(1,2)是A表唯一的,(3,4)是公共的,并且(5,6)是B表独有的 内连接 内连接是A表的所有行交上B表的所有行得出的结果集 select*fromaINNERJOINbona.a=b.b;se…

  • 图书销售管理系统的可行性研究背景搜集和前提分析

    图书销售管理系统的可行性研究背景搜集和前提分析完成小组成员:大佬(20160401084)DEDRAGON(20160401094)1引言1.1编写目的可行性研究的目的是研究图书管理系统的总体需求、实现方案,并分析开发系统的可行性,为决策者提供是否开发该系统的依据和建议。初拟系统实验报告,对软件开发中将要面临的问题及其解决方案进行初步设计及合理安排。明确开发风险及其所带来的经济效益。1.2背景项目名称:图书…

  • 【AI视野·今日NLP 自然语言处理论文速览 第十七期】Thu, 1 Jul 2021[通俗易懂]

    AI视野·今日CS.NLP自然语言处理论文速览Thu,1Jul2021Totally28papers????上期速览✈更多精彩请移步主页DailyComputationandLanguagePapersOnthePowerofSaturatedTransformers:AViewfromCircuitComplexityAuthorsWilliamMerrill,YoavGoldberg,RoySchwartz,NoahA.

  • datax(11):源码解读 ContainerCommunicator

    datax(11):源码解读 ContainerCommunicator前面看了datax的通讯类communication,现在看看在他之上包装的一个容器通信类ContainerCommunicator一、抽象基类AbstractContainerCommunicatordataX中提供了一个基类 AbstractContainerCommunicator来处理JobContainer、TaskGroupContainer和Task的通讯。AbstractContainerCommunicator提供了注册、收集信息等接口,信息的单位是Communication.

  • opencv——访问图像元素(imagedata widthstep)

    opencv——访问图像元素(imagedata widthstep)http://blog.sina.com.cn/s/blog_759803690101gtpx.html怎么访问图像元素(坐标起点相对于图像原点 image origin 从 0 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL) 假设有 8-bit 1-通道的图像 I (IplIma

  • 最长回文子串(Longest Palindromic Substring)——三种时间复杂度的解法「建议收藏」

    最长回文子串(Longest Palindromic Substring)——三种时间复杂度的解法「建议收藏」  子串:小于等于原字符串长度由原字符串中任意个连续字符组成的子序列  回文:关于中间字符对称的文法,即“aba”(单核)、“cabbac”(双核)等  最长回文子串:1.寻找回文子串;2.该子串是回文子串中长度最长的。一、O(n^3)时间复杂度方法——暴力求解1.思想:    1)从最长的子串开始,遍历所有该原字符串的子串;    2)每找出一个字符串,就判断该字符串是否为回文;  …

发表回复

您的电子邮箱地址不会被公开。

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