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

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

理技术

一、实验目的

存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。

本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。

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

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时 LRU:

内存块为4时 LFU:

内存块为5时 FIFO:

内存块为5时 LRU:

内存块为5时 LFU:

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

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

运行效果:

程序分析:

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

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

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

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

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

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

目录
相关文章
|
2月前
|
存储 安全 物联网
操作系统的心脏:深入理解现代操作系统架构与核心技术
本文旨在为读者提供一个关于现代操作系统(OS)架构和核心技术的全面概述。通过分析OS的主要组件、功能以及它们如何协同工作,本文揭示了操作系统在计算机系统中的核心地位及其复杂性。我们将探讨进程管理、内存管理、文件系统和输入/输出(I/O)等关键技术,并讨论它们对系统性能的影响。此外,本文还将涵盖一些最新的操作系统趋势和技术,如云计算、虚拟化和物联网(IoT)。通过阅读本文,读者将获得对操作系统内部运作方式的深刻理解,这对于软件开发人员、IT专业人士以及对计算机科学感兴趣的任何人来说都是宝贵的知识。
|
2天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
15 4
|
1月前
|
机器学习/深度学习 人工智能 Android开发
移动应用开发与操作系统的协同进化:探索现代技术融合之道###
随着移动互联网的迅猛发展,移动应用已成为人们日常生活中不可或缺的一部分。本文深入探讨了移动应用开发的最新趋势、关键技术以及移动操作系统的发展如何相互促进,共同推动移动互联网的创新与变革。通过分析当前市场动态和技术挑战,本文旨在为开发者提供有价值的见解和指导,帮助他们在竞争激烈的市场中脱颖而出。
|
2月前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
59 2
|
3月前
|
人工智能 Linux 云栖大会
看过来!2024 云栖大会操作系统技术 Workshop 怎么玩?
报名倒计时2天啦,欢迎大家来“操作系统技术Workshop”打卡。专家讲解原理、现场实战演练,AI、C++ 20专场任选。
看过来!2024 云栖大会操作系统技术 Workshop 怎么玩?
|
1月前
|
人工智能 Anolis 开发者
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
103 12
|
3月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
119 6
|
3月前
|
人工智能 vr&ar Android开发
探索安卓与iOS的无限可能:移动操作系统的技术革新与未来展望
本文旨在探讨安卓和iOS这两大主流移动操作系统在技术上的创新与突破,以及它们如何塑造我们的数字生活。通过深入分析两者的最新进展、面临的挑战以及未来的发展趋势,文章揭示了移动操作系统在推动科技进步和满足用户需求方面的关键作用。我们将从技术角度出发,解读安卓的开放性与iOS的封闭性如何影响应用生态和用户体验,并探讨这些差异背后的设计理念和商业考量。同时,我们还将关注两大系统在安全性、隐私保护、人工智能集成等方面的最新动态,以及它们如何应对日益增长的网络安全威胁和用户对隐私保护的需求。此外,文章还将展望未来移动操作系统的发展,分析5G、物联网等新兴技术如何为安卓和iOS带来新的机遇和挑战,以及这两大
86 6
|
2月前
|
存储 前端开发 Java
MacOS环境-手写操作系统-18-图片分层技术
MacOS环境-手写操作系统-18-图片分层技术
31 0