一路向北~~
努力才会有惊喜

一、实验目的和要求

(一)目的

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

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

(二)要求

模拟页式虚拟存储管理中硬件的地址转换和缺页中断的处理过程,并用先进先出调度算法(FIFO)处理缺页中断。

二、实验内容

(1) 为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改过,则不必把该页重新写到磁盘上(因磁盘上已有副本)。因此,在页表中可以增加是否修改过的标志,当执行“存”指令、“写”指令时把对应页的修改标志置成“1”,表示该页修改过,否则为“0”,表示该页未修改过。页表格式如表2.1所示。

2.1   页表格式

    

    

   主存块号

   修改标志

   磁盘上的位置

 

 

 

 

 

 

 

 

(2) 设计一个地址转换程序来模拟硬件的地址转换和缺页中断处理过程。当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一条指令已完成。当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中断。模拟地址转换的程序流程如图3-1所示。

(3) 编制一个FIFO页面调度程序。FIFO页面调度算法总是先调出作业中最先进入主存的那一页,因此,可以用一个数组来构成页号队列。数组中每个元素是该作业已在主存的页面号,假定分配给作业的主存块数为m,且该作业开始的m页已装入主存,则数组可由m个元素组成:

P[0],P[1],…,P[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

在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT调出的页号”和“IN要装入的新页页号”来模拟一次调出和装入的过程。模拟程序的流程见图2.1。

(4) 假定主存的每块长度为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4块主存块,且该作业的第0页至第3页已经装入主存,其余3页尚未装入主存,该作业的页表见表3-2所示。

2.2 作业的页表

   页号

   标志

   主存块号

   修改标志

   在磁盘上的位置

    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

 

2.1 地址转换和FIFO页面调度流程

如果该作业依次执行的指令序列如表2.3所示。

2.3 作业依次执行的指令序列

   操作

   页号

  页内地址

   操作

   页号

  页内地址

    +

     0

    070

   移位

     4

    053

    +

     1

    050

    +

     5

    023

    ×

     2

    015

    

     1

    037

    

     3

    021

    

     2

    078

    

     0

    056

    +

     4

    001

    -

     6

    040

    

     6

    084

依次执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)

(5) 为了检查程序的正确性,可自行确定若干组指令序列,运行设计的程序,核对执行结果。

三、实验程序清单

#include "stdio.h"

#define size 1024

struct plist

{

int number;   

int flag;  

int block;  

int modify;  

int location;  

};

Struct plist p1[7]={{0,1,5,0,011},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6,0,-1,0,121}};

struct ilist

{

char operation[10];

int pagenumber;

int address;

};

struct ilist p2[12]={{"+",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 main()

{

    int i,lpage,pflage,replacedpage,pmodify;

int p[4]={0,1,2,3};

int k=0;

int m=4;

long memaddress;

printf("\n 操作\t 页号 \t页内地址   标志  绝对地址   修改页号   页架号  绝对地址\n");

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

{

lpage=p2[i].pagenumber;

pflage=p1[lpage].flag;

if(pflage==0)

{

replacedpage=p[k];

pmodify=p1[replacedpage].modify;

p[k]=lpage;

k=(k+1)%m;

p1[lpage].flag=1;     

/*此处作用:将标志位改为a1*/

p1[lpage].block=p1[replacedpage].block;

p1[replacedpage].block=-1;

p1[replacedpage].flag=0;

p1[replacedpage].modify=0;

}

memaddress=p1[lpage].block*size+p2[i].address;

if(p2[i].operation=="save")

p1[lpage].modify=1;

printf(" %s\t",p2[i].operation);

printf("  %d\t",p2[i].pagenumber);

printf("   %d\t",p2[i].address);

printf("     %d\t",pflage);

if(pflage==1)

printf("   %d\t",memaddress);

else

printf("   *%d\t",p2[i].pagenumber);

if(pflage==1)

printf("        \t");

else

printf("    %d->%d\t",p2[i].pagenumber,replacedpage);

printf("  %d\t",p1[lpage].block);

printf("  %d\t",memaddress);

printf("\n");

}

}

四、实验结果与分析

 

posted on 2022-06-02 21:33  一路向北~~  阅读(1050)  评论(0编辑  收藏  举报