OS-实验报告5-虚拟存储器管理

实  验  报  告

学生姓名

**,**

学号

******

指导老师

***

实验地点

实验时间

班级

*****

  • 实验室名称:

  • 实验项目名称:

虚拟存储器管理

  • 实验学时:

4学时

  • 实验原理:

虚拟存储器作为现代操作系统中存储器管理的一项重要技术,实现了内存扩充功能。但该功能并非是从物理上实际地扩大内存的容量,而是从逻辑上实现对内存容量的扩充,让用户所感觉到的内存容量比实际内存容量大得多。于是便可以让比内存空间更大的程序运行,或者让更多的用户程序并发运行。这样既满足了用户的需要,又改善了系统的性能。

  • 实验目的:
  1. 学习和编程实现最佳(OPT)页面置换算法
  2. 学习和编程实现先进先出(FIFO)页面置换算法。
  3. 学习和编程实现最近最久未使用(LRU)页面置换算法。
  • 实验内容: 

假定某进程共有8页,且系统为之分配了三个物理块,并有以下页面调度序列∶7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

使用以下置换算法:最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最少用置换算法(LRU)。

计算并输出:页面置换情况和缺页率。

最佳置换算法输出效果如下:

OPT:f=0.45

7x,0x,1x,2x,0,3x,0,4x,2,3 ,0x,3,2,1x,2,0,1,7x,0,1

  1. 最佳(OPT)页面置换算法:       
  1. 流程图
  2. 算法分析和描述:
  3. 代码:
  4. 输出截图:
  1. 先进先出(FIFO)页面置换算法:   
  1. 流程图
  2. 算法分析和描述:
  3. 代码:
  4. 输出截图:
  1. 最近最久未使用(LRU)页面置换算法:
  1. 流程图                  
  2. 算法分析和描述:        
  3. 代码:                  
  4. 输出截图:

/**-------------------------------------------------实验开始--------------------------------------------------*/

1、最佳(OPT)页面置换算法:       

(1)流程图:

  1. 算法分析和描述:

 

(3)代码:

#include <iostream>

int num[20] = { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 };

int A[3] = { -1, -1, -1 };

int physicalBlock[3] = { -1, -1, -1 }; // 3个物理块

bool OPT(int index) {

int i; //标识物理块号

for (i = 0; i < 3; i++) {

if (A[i] == -1) //判断该物理块是否为空物理块

break; //如果当前物理块为空物理块,则证明后面的物理块都为空物理块,需要装入页面。

if (physicalBlock[i] == num[index]) // 判断页面是否在内存中

return true;

}

if (i == 3) { //没有空物理块,需要替换页面

int flag = 0; // 标记有几个物理块的页面在随后的访问中被访问;

for (int m = index + 1; m < 20; m++) {

if (flag == 2) {

break;

}

for (int n = 0; n < 3; n++) { // 遍历物理块

if (num[m] == physicalBlock[n]) { // 该物理块的页面会在随后的访问中被访问

if (A[n] != 0) {

A[n] = 0;

flag++;

}

break;

}

}

}

for (int i = 0; i < 3; i++) {

if (A[i] != 0) {

physicalBlock[i] = num[index]; // 替换出该物理块中的页面

A[i] = 1; // 将标记改成有页面

}

A[i] = 1;

}

return false;

} else {

physicalBlock[i] = num[index]; //第i个物理块中放入页面

A[i] = 1;

return false;

}

}

void OPT1() {

int N = 0; //页面置换次数

for (int i = 0; i < 20; i++) {

bool b = OPT(i);

if (b == true) {

printf("%d   ", num[i]);

}

if (b == false) { //页面发生了置换

printf("%dx   ", num[i]);

N++;

}

}

double d = (double)N / 20 ;

printf("\nOPT:f=%.2f", d);

}

int main() {

OPT1();

}

(4)输出截图:

2.先进先出(FIFO)页面置换算法:

(1)流程图

(2)算法分析和描述:

 

(3)代码:

①主函数

#include<stdio.h>

#include<iostream>

#include "Queue.h"

using namespace std;

void FIFO(int order[20],int visitied[20])

{

    cout<<"先进先出置换算法输出效果如下:"<<endl;

    SqQueue Q;InitQueue(Q);      //创建并初始化队列

    int i,j;

    float flag=0,per;   //缺页次数与缺页率

    for(i=0;i<20;i++)          //所要调度序列长度

    {

        if(Queue_FInd(Q,order[i]))   //判断是否缺页

        {//不缺

            visitied[i]=1;

            continue;

        }

        else

        {//缺页

            flag+=1;//缺页次数+1

            if(QueueFull(Q))          //判断物理块是否有剩余

            {//物理块用光了

                DeQueue(Q,j);         //FIFO   //队头出队

                EnQueue(Q,order[i]);           //队尾进队

            }

            else                     //使用剩余物理块

            {//物理块还有剩的

                EnQueue(Q,order[i]);  //入队

            }

            visitied[i]=0;

        }

    }

    per=flag/20;

    printf("FIFO:f=%.2f\n",per);

}

int main()

{

    int Order[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

    int visitied[20];  //为保持输出与规定的一样,现创建一个数组;缺页置0,不缺置1;

    FIFO(Order,visitied);

    for(int i=0;i<20;i++)

    {

        if(visitied[i]==0)

        {

            cout<<Order[i]<<'x'<<'\t';

        }

        else

        {

            cout<<Order[i]<<'\t';

        }

    }

    return 0;

}

②头文件——Queue.h

#include<stdio.h>

#include<iostream>

using namespace std;

#define MAXSIZE 4    //定义物理块数。实际使用中会少用一个空间来实现循环   队列

#define OK 1

#define ERROR 0

#define OVERFLOW -1

typedef int Status;

typedef struct

{

    int *base;  ///顺序表要加*号,要给空间,存基地址

                //or  int data[MAXSIZE];

    int Front;

    int Rear;

}SqQueue;

///初始化

Status InitQueue(SqQueue &Q)

{

    Q.base=new int[MAXSIZE];

    if(!Q.base) exit(OVERFLOW);

    Q.Front=Q.Rear=0;

    return OK;

}

///入队

Status EnQueue(SqQueue &Q,int e)

{

    if((Q.Rear+1)%MAXSIZE==Q.Front) return OVERFLOW;

    Q.base[Q.Rear]=e;

    Q.Rear=(Q.Rear+1)%MAXSIZE;    ///防溢出

    return OK;

}

///出队

Status DeQueue(SqQueue &Q,int &E)

{

    if(Q.Front==Q.Rear) return ERROR;

    E=Q.base[Q.Front];

    Q.Front=(Q.Front+1)%MAXSIZE;

    return OK;

}

///求队列长度

Status QueueLength(SqQueue Q)

{

    return (Q.Rear-Q.Front+MAXSIZE)%MAXSIZE;

}

///get head Elem

Status GetHead(SqQueue Q)

{

    if(Q.Front!=Q.Rear)

    {

        return Q.base[Q.Front];      //队头指针不变

    }

}

///判空

Status QueueEmpty(SqQueue Q)

{

    if(Q.Front==Q.Rear) return OK;

    else return ERROR;

}

///判满

bool QueueFull(SqQueue Q)

{

    if((Q.Rear+1)%MAXSIZE==Q.Front) return true;

    else return false;

}

///遍历队列查找

bool Queue_FInd(SqQueue Q,int E)

{

    int i,head,rear;

    head=Q.Front;rear=Q.Rear;

    /*if(QueueEmpty(Q))

    {

        cout<<"队列为空";

        return false;

    }*/

    for(i=0;i<QueueLength(Q);i++)

    {

        if(Q.base[head]==E)

        {

            return true;

        }

        head=(head+1)%MAXSIZE;

    }

    if(i==QueueLength(Q))

    {

        return false;

    }

}

///打印队列

int Queue_Printf(SqQueue Q)

{

    int i,head;

    head=Q.Front;

    if(QueueEmpty(Q))

    {

        cout<<"队列为空";

        return ERROR;

    }

    for(i=0;i<QueueLength(Q);i++)

    {

        cout<<Q.base[head]<<endl;

        head=(head+1)%MAXSIZE;

    }

}

(4)输出截图:

3.最近最久未使用(LRU)页面置换算法:

(1)流程图             

(2)算法分析和描述:     

(3)代码:(头文件——Queue.h 同上 此处略)

#include<stdio.h>

#include<iostream>

#include "Queue.h"

using namespace std;

///交换数值

void Swap(int &a,int &b)

{

    int t;

    t=a;

    a=b;

    b=t;

}

/**-----改变队列内元素顺序----*/

void Change_QElem(SqQueue &Q,int E)

{

    int L,Locate2;

    L=(Q.Front+QueueLength(Q)-1)%MAXSIZE;  //确定队尾元素的位置

    Locate2=(Q.Front+1)%MAXSIZE;   //确定队头后一个元素的位置

    if(Q.base[L]==E);//队尾元素是最新页,无需变换队列元素顺序

    else

    {//队尾元素不是最新页

        if(L==Locate2)      //队列只有两个元素时

        {

            Swap(Q.base[L],Q.base[Q.Front]);    //两个元素进行交换

        }

        else         //队列有三个元素时即队满,有两种情况:①队头是最新页②队头后一个元素是最新页

        {

            if(Q.base[Q.Front]==E)   //①

            {

                //方法一:利用第四个空间

                Q.base[Q.Rear]=Q.base[Q.Front];

                Q.base[Q.Front]=NULL;

                Q.Front=(Q.Front+1)%MAXSIZE;

                Q.Rear=(Q.Rear+1)%MAXSIZE;

                //方法二:两次交换

                /*Swap(Q.base[Q.Front],Q.base[Locate2]);

                Swap(Q.base[Locate2],Q.base[L]);*/

            }

            else                  //②

            {

                Swap(Q.base[L],Q.base[Locate2]);  //两个元素进行交换

            }

        }

    }

}

/**-------LRU--------*/

void LRU(int Order[20],int visited[20])

{

    int i=0,E;

    float flag=0,per;          //定义缺页次数与缺页率

    SqQueue Q;InitQueue(Q);

    for(i=0;i<20;i++)

    {

        if(Queue_FInd(Q,Order[i]))     //判断是否缺页

        {//不缺页

            visited[i]=1;

            Change_QElem(Q,Order[i]); ///按最近最久来重新排序队列内元素

        }

        else

        {//缺页

            flag+=1; //缺页次数+1

            if(QueueFull(Q))           //判断物理块是否有剩余

            {//无剩余

                DeQueue(Q,E);          //队头(最近最久未使用的页)出队

                EnQueue(Q,Order[i]);

            }

            else

            {//有剩余

                EnQueue(Q,Order[i]);

            }

            visited[i]=0;

        }

    }

    per=flag/20;

    cout<<"最佳置换算法输出效果如下"<<endl;

    printf("LRU:f=%.2f\n",per);

}

int main()

{

    int Order[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

    int visitied[20];  //为保持输出与规定的一样,现创建一个数组;缺页置0,不缺置1;

    LRU(Order,visitied);

    for(int i=0;i<20;i++)

    {

        if(visitied[i]==0)

        {

            cout<<Order[i]<<'x'<<'\t';

        }

        else

        {

            cout<<Order[i]<<'\t';

        }

    }

    return 0;

}

(4)输出截图:

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整虚拟存储管理器实验报告!一、实验目的请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。二、实验环境 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值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。~
【实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值