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

实验五 虚拟存储器管理

一、实验目的

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、 运行结果以及结论。

这里写图片描述

  • 46
    点赞
  • 259
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
完整虚拟存储管理器实验报告!一、实验目的请求页虚存管理是常用的虚拟存储管理方案之一。通过请求页虚存管理页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页虚存管理的页面调度算法的理解。二、实验环境 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. 分页虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选时,可把作业 的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已 在主存,哪些页尚未装入主存,页表的格为: "页号 "标志 "主存块 "在磁盘上的位置 " " " "号 " " " " " " " 其,标志---- 用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志 位=0,则表示该页尚未装入主存。 主存块号----用来表示已经装入主存的页所占的块号。 在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。 2. 作业执行时,指令的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件地址转换机构按页号查页表,若该页对应标志为"1",则表示该页已在主存,这时 根据关系: 绝对地址=块号×块长+单元号 计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分 ,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为"0" ,则表示该页不在主存,这时硬件发"缺页中断"信号,有操作系统按该页在磁盘上 的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。 3. 设计一个"地址转换"程序来模拟硬件地址转换工作。当访问的页在主存时,则形成 绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行 。当访问的页不在主存时,则输出"* 该页页号",表示产生了一次缺页中断。该模拟程序的算法如图6-1。 图6-1 地址转换模拟算法 4. 假定主存的每块长度为128个字节;现有一个共七页的作业,其第0页至第3页已经 装入主存,其余三页尚未装入主存;该作业的页表为: "0 "1 "5 "011 " "1 "1 "8 "012 " "2 "1 "9 "013 " "3 "1 "1 "021 " "4 "0 " "022 " "5 "0 " "023 " "6 "0 " "121 " 如果作业依次执行的指令序列为: "操作 "页号 "单元 "操作 "页号 "单元 " " " "号 " " "号 " "+ "0 "70 "移位 "4 "053 " "+ "1 "50 "+ "5 "023 " "× "2 "15 "存 "1 "037 " "存 "3 "21 "取 "2 "078 " "取 "0 "56 "+ "4 "001 " "- "6 "40 "存 "6 "084 " 5. 运行设计的地址转换程序,显示或打印运行结果。因仅模拟地址转换,并不模拟指令 的执行,故可不考虑上述指令序列的操作。 第二题:用先进先出(FIFO)页面调度算法处理缺页中断。 [提示]: 1. 在分页虚拟存储系统,当硬件发出"缺页中断"后,引出操作系统来处理这个断 事件。如果主存已经没有空闲块,则可用FIFO页面调度算法把该作业最先进入 主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入 后都要修改页表页表对应页的标志。 2. FIFO页面调度算法总是淘汰该作业最先进入主存的那一页,因此可以用一个数组来 表示该作业已在主存的页面。假定作业被选时,把开始的m个页面装入主存,则 数组的元素可定为m个。例如: P[0],P[1],….,P[m-1] 其每一个P[i](i=0,1,….,m- 1)表示一个在主存页面号。它们的初值为: P[0]:=0,P[1]:=1,….,P[m-1]:=m-1 用一指针k指示当要装入新页时,应淘汰的页在数组的位置,k的初值为"0"。 当产生缺页中断后,操作系统选择P[k]所指出的页面调出,然后执行: P[k]:=要装入页的页号 k:=(k+1) mod m 再由装入程序把要访问的一页信息装入到主存。重新启动刚才那条指令执行。 3. 编制一个FIFO页面调度程序,为了提高系统效率,如果应淘汰的页在执行没有修改 过,则可不必把该页调出(因在磁盘上已有副本)而直接装入一个新页将其覆盖。 因此在页表增加是否修改过的标志,为"1"表示修改过,为"0"表示未修改过,格 为: 由于是模拟调度算法,所以,不实
【实验目的】 1. 通过编写和调试存储管理模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方  段管理  页管理  段页管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值