操作系统实验存储管理

本文详细阐述了存储管理的基本概念与作用,重点介绍了分页式虚拟存储系统的地址转换过程及其产生的缺页中断处理策略,具体分析了先进先出(FIFO)和最近最少用(LRU)页面调度算法的原理与应用。通过实验证明了不同调度算法对缺页中断次数的影响,同时提供了实验代码以供实践验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验三  存储管理(3学时)

一、实验目的

1)加深对存储管理的作用和工作原理的理解。

2)进一步认识主存空间的分配和回收方法。

3)进一步认识虚拟存储器的工作原理。

二、实验类型

综合型。

三、预习内容

预习课本存储管理有关内容,包括各种内存分配方法和利用分页式存储管理实现虚拟存储器策略方法。

预习课本文件系统有关内容,包括文件和目录的创建和删除等基本原理。

四、实验要求与提示

本实验有三个题,其中第一必做,第二、第三题中任选一个。

第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。

【提示】

1)分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:

 

页号

标志

主存块号

在磁盘上的位置

 

 

 

 

 

其中,

l         标志——用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志位=0,则表示该页尚未装入主存。

l         主存块号——用来表示已经装入主存的页所占的块号。

l         在磁盘上的位置——用来指出作业副本的每一页被存放在磁盘上的位置。

2)作业执行时,指令中的逻辑地址指出了参加运算的操作数存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:

绝对地址=块号´块长+单元号

计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。按计算出的绝对地址可以取到操作数,完成一条指令的执行。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

3)设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断。该模拟程序的算法如图3-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

070

移位

4

053

+

1

050

+

5

023

´

2

015

1

037

3

021

2

078

0

056

+

4

001

-

6

040

6

084

 

运行设计的地址转换程序,显示或打印运行结果。因仅模拟地址转换,并不模拟指令的执行,故可不考虑上述指令序列中的操作。

 


3-1  地址转换模拟算法

 

第二题:用先进先出(FIFO)页面调度算法处理缺页中断。

【提示】

1)在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上。然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。

2FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。假定作业被选中时,把开始的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”表示未修改过,格式为:

 

页号

标志

主存块号

修改标志

在磁盘上的位置

 

 

 

 

 

 

 

 

 

 

 

由于是模拟调度算法,所以,不实际地启动调出一页和装入一页的程序,而用输出调出的页号和装入的页号来代替一次调出和装入的过程。

把第一题中程序稍作改动,与本题结合起来,FIFO页面调度模拟算法如图3-2

4)如果一个作业的副本已在磁盘上,在磁盘上的存放地址以及已装入主存的页和作业依次执行的指令序列都同第一题中(4)所示。于是增加了“修改标志”后的初始页表为:

 

页号

标志

主存块号

修改标志

在磁盘上的位置

0

1

5

0

011

1

1

8

0

012

2

1

9

0

013

3

1

1

0

021

4

0

 

0

022

5

0

 

0

023

6

0

 

0

121

 

按依次执行的指令序列,运行你所设计的程序,显示或打印每次调出和装入的页号,以及执行了最后一条指令后的数组P的值。

5)为了检查程序的正确性,可再任意确定一组指令序列,运行设计的程序,核对执行的结果。

第三题:用最近最少用(LRU)页面调度算法处理缺页中断。

【提示】

1)在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用LRU页面调度算法把该作业中距现在最久没有被访问过的一页调出,存放到磁盘上。然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。

 

 


3-2  FIFO页面调度模拟算法

 

2LRU页面调度算法总是淘汰该作业中距现在最久没被访问过的那页,因此可以用一个数组来表示该作业已在主存的页面。数组中的第一个元素总是指出当前刚访问的页号,因此最久没被访问过的页总是由最后一个元素指出。如果主存只有四块空闲块且执行第一题中提示(4)假设的指令序列,采用LRU页面调度算法,那么在主存中的页面变化情况如下:

 

3

 

0

 

6

 

4

 

5

 

1

 

2

 

4

 

6

2

 

3

 

0

 

6

 

4

 

5

 

1

 

2

 

4

1

 

2

 

3

 

0

 

6

 

4

 

5

 

1

 

2

0

 

1

 

2

 

3

 

0

 

6

 

4

 

5

 

1

 

当产生缺页中断后,操作系统总是淘汰由最后一个元素所指示的页,再把要访问的页装入淘汰页所占的主存块中,页号登记到数组的第一个元素中,重新启动刚才那条指令执行。

3)编制一个LRU页面调度程序,为了提高系统效率,如果淘汰的页在执行中没有修改过,则可不必把该页调出。参看第二题中提示(3)。模拟调度算法不实际地启动调出一页和装入一页的程序而用输出调出的页号和装入的页号来代替。把第一题中程序稍作改动,与本题结合起来,LRU页面调度模拟算法如图3-3


3-3  LRU页面调度模拟算法

 

4)按第一题中提示(4)的要求,建立一张初始页表,页表中为每一页增加“修改标志”位(参考第二题中提示(4))。然后按依次执行的指令序列,运行设计的程序,显示或打印每次调出和装入的页号,以及执行了最后一条指令后数组中的值。

5)为了检查程序的正确性,可再任意确定一组指令序列,运行设计的程序,核对执行的结果。

五、思考题

1)先进先出页面调度算法的思想?

2)最近最少用(LRU)页面调度算法思想?

3)比较两种调度算法的效率(哪种调度算法使产生缺页中断的次数少)?

4)分析在什么情况下采用哪种调度算法更有利?

六、实验报告

1)实验题目(第二题或第三题)。

2)程序中使用的数据结构及符号说明。

3)实现的核心代码。

4)打印初始页表、每次调出(要调出一页时)和装入的页号、执行最后一条指令后在主存中的页面号(即数组的值)。

 

       实验报告

 

姓名:邓涛                                  实验内容:存储器调度实验

一、     实验目的

1)加深对存储管理的作用和工作原理的理解。

2)进一步认识主存空间的分配和回收方法。

3)进一步认识虚拟存储器的工作原理。。

二、实验题目

     模拟分页式存储管理中硬件的地址转换和产生缺页中断用先进先出(FIFO)页面调度算法处理缺页中断

    

 

三、核心代码

#include<stdio.h>

#include<stdlib.h>

int paper_table[7][5]={

       {0,1,5,11,0},

    {1,1,8,12,0},

       {2,1,9,13,1},

       {3,1,1,21,1},

       {4,0,0,22,0},

       {5,0,0,23,0},

       {6,0,0,121,0}

};

 

char *oper_char[12]={"+","+","*","","","-","移位","+","","","+",""};

 

int oper_table[12][2]={

       {0,70},

       {1,50},

       {2,15},

       {3,21},

       {0,56},

       {6,40},

       {4,53},

       {5,23},

       {1,37},

       {2,78},

       {4,1},

       {6,84},

};

 

int fifo_table[4]={0};                   

int static count;

 

                         

void fifo_print(void);

void scheduler(void);

void init_print(void);

 

void main()

{  

   init_print();

   scheduler();

   printf("\n\n###############最后运行完的页表#################\n\n\n");

   init_print();

}

void init_print(void)

{

       int i,j;

       printf("-----------------页表--------------------\n");

     printf("页号   标志  主存块号  磁盘位置   修改标志  \n");

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

       {

              for(j=0;j<5;j++)

              {

                     printf("%d        ",*(*(paper_table+i)+j));

              }

              printf("\n");

       }

    printf("-----------------存储调度表--------------------\n");

     printf("操作  页号   偏移量  \n");

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

       {

              printf("%s ",*(oper_char+i));

              for(j=0;j<2;j++)

              {

                     printf("     %d",*(*(oper_table+i)+j));

              }

              printf("\n");

       }

    fifo_print();

}

void scheduler(void)

{

       int i,page,page_block,page_move;

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

       {

              page=**(oper_table+i);

         page_block=*(*(paper_table+page)+2);

            page_move=*(*(oper_table+i)+1);

              if(*(*(paper_table+page)+1)==1&&(count<3))

              {    

                      

              printf("页表中已经有对应的主存帧 块号为 %d 偏移量为 %d \n",page_block,page_move);

                       printf("对应的物理地址为: %d\n",page_block*128+page_move);

                      

                       fifo_table[page]=page;

                       fifo_print();

              }

              else

              {  

                    

                     printf("\n------页表中没有对应的内存帧,发生页错误,页中断处理,最后按照FIFO算法调度存储管理-----\n");

            printf("************************************\n");

             printf("FIFO算法换掉的页号为%d\n",fifo_table[count%4]);

                     printf("*************************************%d\n",count);

            fifo_table[count%4]=*(*(oper_table+i)+0);

            **(paper_table+count%4)=*(*(oper_table+i)+0);

                     count++;

                     fifo_print();

             

             printf("换入的新页对应的物理地址为: %d\n",(*(*(paper_table+(

                             count%4))+2))*128+page_move);

                  //init_print();

              }

    

       }

}

void fifo_print(void)

{

     int i;

     printf("\n------------------FIFO调度算法页表排序------------\n");

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

              {

              printf("%d\n",*(fifo_table+i));

              }

              printf("\n");

         _sleep(1000);

}

一. 实验目的: 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种面淘汰算法 2.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二.实验要求 实验程序由以下三大部分组成: (1) 通过随机数产生一个指令序列(实际上是指令的逻辑地址序列),320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令要实现向前跳转,均匀分布在前地址部分 C:25%的指令要实现向后跳转,均匀分布在后地址部分 具体的实施方法是: A:在[0319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1 E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320次指令 (2) 将每条指令的逻辑地址变换为地址 设:面大小为1K; 用户内存容量432; 用户虚存容量为32K。 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为: 第 0 条-第 9 条指令为第0(对应逻辑地址为[0,9]) 第10条-第19条指令为第1(对应逻辑地址为[10,19]) ……………………………… 第310条-第319条指令为第31(对应逻辑地址为[310319]) 按以上方式,用户指令可组成32。 (3) 分别使用FIFO算法和LFU算法,计算给用户进程的这32分配4,5,…,32个面(内存块)时其缺率。
实验目的】 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、付费专栏及课程。

余额充值