操作系统:虚拟存储管理技术

news2024/11/23 14:21:30

文章目录

  • 虚拟存储管理技术
    • 一、实验目的
    • 二、实验要求与内容、过程与结果
  • 系列文章

虚拟存储管理技术

一、实验目的

存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。

二、实验要求与内容、过程与结果

1.用随机数产生一个指令序列,共320条指令。其地址按下述原则生成:

①50%的指令是顺序执行的;
②25%的指令是均匀分布在前地址部分;
③25%的指令是均匀分布在后地址部分;

具体的实施方法是:

A.在[0,319]的指令地址之间随机选区一起点M;
B.顺序执行一条指令,即执行地址为M+1的指令;
C.在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’;
D.顺序执行一条指令,其地址为M’+1;
E.在后地址[M’+2,319]中随机选取一条指令并执行;
F.重复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先进先出的算法
LRU最近最少使用算法
LFU最少访问页面算法

4.运行实例程序,内存块分别为4和5时,记录运行结果。缺页率有何变化?

内存块为4时 FIFO:

4.1

内存块为4时 LRU:

4.2

内存块为4时 LFU:

4.3

内存块为5时 FIFO:

4.4

内存块为5时 LRU:

4.5

内存块为5时 LFU:

4.6

答:随内存块数量的增加,缺页率降低。

5.参照示例程序,实现OPT算法。

提示:

A.缺页率=页面失效次数/页地址流长度=缺页次数/页面访问次数。
B.为了调试方便,可设置页地址流长度(页面访问次数)为100,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
C.关于随机数产生方法,采用函数RAND()和RANDOMIZE()来产生。
D.OPT算法可修改示例程序,先生成页面访问序列,在需要淘汰页面时,从内存块中选择未来最久才被访问的页淘汰之。

程序代码:

#include <iostream>
#include<stdio.h>
#include <stdlib.h>
#include<time.h>
using namespace std;
#define Options 100  //共100条指令
struct MemBlock
{
    int page;
    int count;
    MemBlock* next;
};
int main()
{
    time_t t;
    srand(unsigned(time(&t)));
    int i,n,j,ii,m,answer,ffalse,count,fangfa,min;
    double sum;
    MemBlock *head,*tail,*temp,*table,*first,*ti,*Loadin;

    cout<<"输入分配的内存块数目【2-6】:"<<endl;
    cin>>m;
    cout<<endl;
    cout<<"内存块初始化:\n";
    table=new(MemBlock);
    temp=table;
    table->page=-1;
    table->count=0;
    head=table;
    for(ii=2; ii<=m; ii++)
    {
        table=new(MemBlock);
        table->page=-1;
        table->count=0;
        temp->next=table;
        temp=table;
        if (ii==m)
            table->next=NULL;
    }
    for(ti=head; ti!=NULL; ti=ti->next)
        cout<<ti->page<<"["<<ti->count<<"]"<<"\t\t";
    cout<<endl;
    cout<<"采用页面置换法:\n"<<"1-FIFO\n"<<"2-LRU\n"<<"3-LFU\n"<<"4-OPT"<<endl;
    cout<<"请选择【1-4】:";
    cin>>fangfa;
    tail=table;
    temp=head;
    ffalse=0;
    answer=0;
    first=head;
    count=0;
    i=0;
    int index=0;
    int z;
    int input[Options];
    for(z=0;z<Options;z++)
    {
        input[z]=(rand()%Options+1)%Options/10;
    }
    for(z=0;z<Options;z++)
    {
        if(z%5==0)
            printf("\n");
        printf("%3d",input[z]);
    }
    printf("\n");
    while(i<Options)  //320条指令,指令访问地址为0-319
    {
        table=head;
        temp=head;
        answer=0;
        min=400;
        //随机生成指令的访问地址n,j为页号
        if (count==0)
        {
            n=(rand()%Options+1)%Options;
            j=n/10;
        }
        if(count==1)
        {
            n=rand()%(n+1);
            j=n/10;
        }
        if(count==2)
        {
            j=((n+1)%Options)/10;
        }
        if(count==3)
        {
            j=((rand()%(Options-n-2))+n+2)/10;
        }
        if (fangfa==2||fangfa==3)
        {
            while(table!=NULL)
            {
                if (table->page==j) //访问的页已装入内存
                {
                    answer=1;
                    ++(table->count);
                    break;
                }
                table=table->next;
            }
            if(answer!=1) //访问的页不在内存
            {
                ++ffalse; //页面缺页次数加1
                cout<<j<<"页不在内存,请求装入!\n";
                table=head;
                while (table!=NULL) //查找最少访问的页temp
                {
                    if(table->page==-1)  //如果有空闲页,则不需要置换
                    {
                        temp=table;
                        break;
                    }
                    if (table->count<min)
                    {
                        temp=table;
                        min=table->count;
                    }
                    table=table->next;
                }
                if (temp->page!=-1)  //淘汰temp页
                    cout<<temp->page<<"页被淘汰!\n";
                temp->page=j;  //装入j页到temp块中
                temp->count=1;
                if(count==3)  //每过4次页面访问进行一次计数
                {
                    table=head;
                    while(table)
                    {
                        if(table->page!=j && table->count>0)
                            table->count-=1;
                        table=table->next;
                    }
                }
            }
        }
        if (fangfa==1)  //FIFO算法
        {
            int flag=0;
            Loadin=first;
            while(table!=NULL)
            {
                if (table->page==j)
                {
                    answer=1;
                    table->count++;
                    break;
                }
                if(flag==0&&table->page==-1) //空闲块
                {
                    Loadin=table;
                    flag=1;
                }
                table=table->next;
            }
            if(answer!=1)
            {
                ++ffalse;
                cout<<j<<"页不在内存,请求装入!\n";
                if (Loadin->page!=-1)
                {
                    cout<<Loadin->page<<"页被淘汰!\n";
                    first=first->next;    //下次被淘汰的页
                    if (first==NULL)
                        first=head;
                }
                Loadin->page=j;
                Loadin->count=1;
            }
        }
        if(fangfa==4)       //opt
        {
            while(table!=NULL)
            {
                if (table->page==input[index]) //访问的页已装入内存
                {
                    answer=1;
                    table->count++;
                    break;
                }
                table=table->next;
            }
            if(answer!=1) //访问的页不在内存
            {
                ++ffalse; //页面缺页次数加1
                cout<<input[index]<<"页不在内存,请求装入!\n";
                table=head;
                int h,max=index;
                while (table!=NULL) //查找未来最久才被访问的页temp
                {
                    if(table->page==-1)  //如果有空闲页,则不需要置换
                    {
                        temp=table;
                        break;
                    }
                    /*if (table->count<min)   //在input中
                    {                       //查找最久才被访问的页
                        temp=table;         //
                        min=table->count;   //
                    }*/                     //
                    //查找table->page在input中将要被访问的地址
                    for(h=index;h<Options;h++)
                    {
                        if(table->page==input[h])
                        {
                            if(h>max)
                            {
                                temp=table;
                                max=h;
                            }
                            break;
                        }
                    }
                    if(h>=20)
                    {
                        temp=table;
                        break;
                    }
                    table=table->next;
                }
                if (temp->page!=-1)  //淘汰temp页
                    cout<<temp->page<<"页被淘汰!\n";
                temp->page=input[index];  //装入j页到temp块中
                temp->count=1;
            }
        }
        ++i;index++;
        count=++count%4;
        for(ti=head; ti!=NULL; ti=ti->next)
            cout<<ti->page<<"["<<ti->count<<"]"<<"\t\t";
        cout<<endl;
    }
    cout<<"\n缺页率为:";
    sum=ffalse/(Options*1.0);
    cout<<sum<<endl;
}

运行效果:

5.1
5.2

程序分析:

本程序是一个模拟操作系统页面置换算法的程序,通过模拟程序的运行过程,来分析不同的页面置换算法的效率,从而选择最优的算法,以达到提高程序运行效率的目的。

程序中使用了四种页面置换算法,分别是FIFO(先进先出)、LRU(最近最少使用)、LFU(最不经常使用)和OPT(最优置换算法)。其中,FIFO算法是最简单的算法,即按顺序淘汰最先进入内存的页面;LRU算法是按页面最后一次被访问的时间来淘汰页面;LFU算法是按页面被访问的频率来淘汰页面;OPT算法是预测将来会被使用的页面,将最长时间不被使用的页面淘汰。

在程序开始运行时,需要输入分配的内存块数目,以及选择要使用的页面置换算法。程序首先进行内存块的初始化,将内存块中的页都设置为-1,表示还没有被装入页。然后程序通过随机生成指令的访问地址来模拟程序运行。每访问一次页面,程序会首先检查页面是否已经在内存中,如果在,则将其访问次数加1;如果不在,则需要进行页面置换。

在FIFO算法中,程序会检查页面是否在内存中,如果在,则将其访问次数加1;如果不在,则需要将最先进入内存的页面淘汰,将新的页面装入内存。在LRU算法和LFU算法中,程序会检查页面是否在内存中,如果在,则将其访问次数加1;如果不在,则需要淘汰最近或最不经常被使用的页面,将新的页面装入内存。在OPT算法中,程序会检查页面是否在内存中,如果在,则将其访问次数加1;如果不在,则需要预测将来会被使用的页面,并淘汰最长时间不被使用的页面,将新的页面装入内存。

程序最后输出缺页率,即页面置换的次数除以指令总数。

通过模拟程序运行过程,并比较四种不同的页面置换算法的缺页率,可以得出最优的页面置换算法。当然,不同的程序运行情况下,最优的页面置换算法可能会不同,需要根据实际情况进行选择。

系列文章

实验目录直达链接
实验一Linux初步https://want595.blog.csdn.net/article/details/133145097
实验二进程的控制和通信(Windows2000)https://want595.blog.csdn.net/article/details/133903234
实验三线程同步和调度https://want595.blog.csdn.net/article/details/133903419
实验四单处理机调度https://want595.blog.csdn.net/article/details/133903537
实验五银行家算法https://want595.blog.csdn.net/article/details/133903623
实验六虚拟存储管理技术https://want595.blog.csdn.net/article/details/133903701

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wpf Grid布局详解 `Auto` 和 `*` 是两种常见的设置方式 行或列占多个单元格,有点像excel里的合并单元格。使其余的列平均分配剩余的空间

比如只有行的界面 <Window x:Class"GenerateTokenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/exp…

GoLong的学习之路(二十)进阶,语法之反射(reflect包)

这个是为了接上之前的语法篇的。按照我的学习计划&#xff0c;这里此时应该有一个小项目来做一个统合。但是吧&#xff0c;突然觉得&#xff0c;似乎也没必要。能学go的大部分肯定都是有其他语言的基础的。 接下来说反射 文章目录 反射介绍reflect包TypeOftype name和type kin…

重磅!OpenAI发布GPT-4 Turbo,史上最强ChatGPT来了!

11月7日凌晨&#xff0c;OpenAI在美国旧金山举办首届开发者大会&#xff0c;与来自全球的开发者、企业、合作伙伴分享了最新产品。 微软首席执行官Satya Nadella作为特邀嘉宾出席了此次盛会。 会上&#xff0c;OpenAI发布了128K 上下文的GPT-4 Turbo、自定义GPT、DALLE 3 API…

vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案

文章目录 前情提要bug回顾解决方案最后 前情提要 说起来很耻辱&#xff0c;从mac环境换到window环境&#xff0c;vscode的配置都是云端更新过来的&#xff0c;应该是一切正常才对&#xff0c;奇怪的是我的项目环境出现问题了&#xff0c;关于组件的ts和追踪都没有效果&#xff…

Ansible入门—安装部署及各个模块应用案例(超详细)

目录 前言 一、环境概况 修改主机名&#xff08;可选项&#xff09; 二、安装部署 1.安装epel扩展源 2.安装Ansible 3.修改Ansible的hosts文件 4.生成密钥 三、Ansible模块使用介绍 Command模块 Shell模块 User模块 Copy模块 File模块 Hostname模块 Yum模块 Se…

企业数字展厅该如何设计?

设计企业数字展厅涉及创建一个虚拟空间&#xff0c;以引人入胜的沉浸式方式展示公司的产品、服务和品牌。以下步骤可帮助设计有效的数字展厅&#xff1a; 1.定义目标&#xff1a; 确定数字展厅的用途。是为了潜在客户开发、产品展示、品牌推广还是其他目的&#xff1f;明确的…

LoRaWan模块应用于智慧城市景观灯

智能路灯作为一种新型的市政公用设施&#xff0c;它不仅具备了常规的照明能力&#xff0c;还具备各种智能装置和感应器&#xff0c;能够实现对太阳的自发充电&#xff1b;视频监控&#xff0c;环境监测等多种应用。智能路灯集成了各种新型的设备&#xff0c;是智慧都市的基础&a…

还在按键进入BIOS?其实进入BIOS有更便捷的方法

在能够配置各种硬件参数之前,首先必须学习进入ASUS BIOS实用程序的正确方法。无论你面对的是PRIME、ROG、TUF GAMING还是任何其他型号,所涉及的步骤都是相同的。 华硕主板的BIOS访问键通常是“F2”或“Del”键。在启动或启动屏幕期间,只要ASUS徽标出现,就重复按下此键以进…

响应式建筑地产工程企业网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;9157 模板编码&#xff1a;UTF8 模板颜色&#xff1a;多色 模板分类&#xff1a;基建、施工、地产、物业 适合行业&#xff1a;建筑施工类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xf…

nuxt项目:vant打包后样式顺序错乱问题及解决方案

不要引入vant/nuxt这个 需要的时候引入即可

C++ set 的使用

set 的介绍 set是按照一定次序存储元素的容器在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可以从容器中插入或删除它们。在内部&#xff0…

CSS时间线样式

css实现时间线样式&#xff0c;效果如下图&#xff1a; 一、CSS代码 .timeline {padding-left: 5px} .timeline-item { position: relative;padding-bottom: 20px;} .timeline-axis {position: absolute;left: -5px;top: 0;z-index: 10;width: 20px;height: 20px;line-he…

抢购狂欢:跨境电商的区域购物节

随着全球贸易的不断扩展和数字化技术的崭新发展&#xff0c;跨境电商行业已经蓬勃发展&#xff0c;为消费者和商家带来了前所未有的便捷和机会。 其中&#xff0c;区域购物节已成为跨境电商领域的一大亮点&#xff0c;为在线消费者和电商平台提供了一个令人兴奋的购物体验。本…

在web页面音视频录制并下载到本地——MediaRecorder

音视频录制前需要获取到流&#xff0c;使用 navigator.mediaDevices 来完成。 navigator.mediaDevices MediaDevices 接口提供访问连接媒体输入的设备&#xff0c;如照相机和麦克风&#xff0c;以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。 简单介绍一下MediaDe…

外贸SEO前景怎么样?外贸网站优化的方法?

网站做外贸SEO的前景如何&#xff1f;谷歌SEO对海洋建站的影响&#xff1f; 外贸SEO前景一直备受关注&#xff0c;特别是在全球化经济的今天。随着跨境电子商务的崛起&#xff0c;外贸企业越来越重视搜索引擎优化来提升他们的在线可见性。顺风船将探讨外贸SEO前景的各个方面&a…

Synchronized关键字使用不合理,导致的多线程下线程阻塞问题排查

在为客户进行性能诊断调优时&#xff0c;碰到了一个Synchronized关键字使用不合理导致多线程下线程阻塞的情况。用文字记录下了问题的整个发现-排查-分析-优化过程&#xff0c;排查过程中使用了商业化产品——XLand性能分析平台&#xff0c;通过文章主要希望跟大家分享下分析和…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

SSM整合redis及redis的注解式开发和解决Redis缓存问题

一.SSM整合Redis 1.pom配置 用于解决运行时没有将数据库配置信息jdbc.properites加载到target文件中 <resource><directory>src/main/resources</directory><includes><include>*.properties</include><include>*.xml</includ…

《巧用ChatGPT快速提高职场晋升力》书籍推荐【包邮送书五本】

文章目录 书籍介绍内容介绍ChatGPT 在人工智能助手领域的应用1 智能客服2 语音助手3 个人助手4 内容创作与编辑5 数据分析与报告生成6 社交媒体管理7 智能编程助手 抽奖送书 书籍介绍 ★超实用 通过30多个实战案例和操作技巧&#xff0c;使读者能够快速上手并灵活运用ChatGPT技…

操作系统:银行家算法

文章目录 银行家算法一、实验目的二、实验要求与内容、过程与结果 系列文章 银行家算法 一、实验目的 1、理解银行家算法。 2、掌握进程安全性检查的方法及资源分配方法。 二、实验要求与内容、过程与结果 1、将图5-1补充完整&#xff0c;画出银行家算法的流程图。 图5-1 银…