实验五 存储管理(实验报告格式)

时间:2024.3.19

实验五:存储管理

一、实验目的

(1)熟悉内存空闲分区的分配方式;

(2)理解动态分区存储管理方式;

(3)掌握动态分区的分配与回收的过程。

二、实验环境

微型计算机,Ubuntu Linux10.04 ,gedit,gcc

三、实验内容

根据流程图和参考程序,完成模拟内存分配和回收过程。内存空间大小为100,进程数为5,每个进程所需空间为随机产生,大小为1~20,编制程序,首先对5个进程进行内存分配,然后回收指定的进程空间,并进行适当的空闲分区合并操作,要求每次操作结束后都能显示当前的内存分配情况。

四、实验结果

截图一

截图二

截图三

五、源代码

#include

#include

typedef struct MEMORY_BLOCK{

int name; //进程名

int address; //起始地址

int length; //长度

int flag; //标志,表示该块是否被分配。

struct MEMORY_BLOCK *next; //指向下一个进程

}MEMORY_BLOCK;

#define NUM 5

#define LEN sizeof(MEMORY_BLOCK)

void allocation(MEMORY_BLOCK *Header,int name,int length_p){

MEMORY_BLOCK *temp,*t,*tt;

int minsize=2; //不可切割的分区阈值

t=Header;

while(t!=0){

if(t->length>length_p&&t->flag==0) break;

t=t->next;

}if(t->length-length_p>minsize){ //分割

temp=(MEMORY_BLOCK*)malloc(LEN);

temp->name=-1;

temp->flag=0;

temp->length=t->length-length_p;

temp->address=t->address+length_p;

t->name=name;

t->flag=1;

t->length=length_p;

temp->next=t->next;

t->next=temp;

}else{ //直接分配

t->name=name;

t->flag=1;

}

}

void reclaim(int processname, MEMORY_BLOCK *Header){

MEMORY_BLOCK *temp,*t,*tt;

t=Header;

temp=t;

while(t->name!=processname){

temp=t;

t=t->next;

}if(t->next!=NULL){ //t非尾结点

if(temp->flag==0&&t->next->flag==0){ //左右为空

temp->name=-1;

temp->length=temp->length+t->length+t->next->length;

tt=t->next;

temp->next=tt->next;

}else if(temp->flag==0){ //左为空

temp->name=-1;

temp->length=temp->length+t->length;

temp->next=t->next;

}else if(t->next->flag==0){ //右为空

t->name=-1;

t->length=t->length+t->next->length;

t->flag=0;

tt=t->next;

t->next=tt->next;

}else{ //左右不为空

t->name=-1;

t->flag=0;

}else{ //t是尾结点

if(temp->flag==0){ //左为空

temp->name=-1;

temp->length=temp->length+t->length;

temp=t->next;

}else{ //左不为空

t->name=-1;

t->flag=0;

}

}

}

void main(){ //主函数

int length_p,i,processname;

MEMORY_BLOCK *Header,*t;

Header=(MEMORY_BLOCK*)malloc(LEN); //初始化存储空间

Header->name=-1;

Header->address=0;

Header->length=100;

Header->flag=0;

Header->next=NULL;

srand((int)time(0));

for(i=1;i<=NUM+1;i++){

length_p=rand()%20+1; //随机产生进程所需存储空间,至少为1

allocation(Header,i,length_p);

}printf("当前内存分配情况:\n");

t=Header;

while(t!=0){

printf("process_name:%d,address:%d,length:%d,flag:%d\n",t->name,t->address,t->length,t->flag);

t=t->next;

}printf("请输入回收的进程号(输入0结束):\n");

scanf("%d",&processname);

while(processname!=0){

printf("回收 process name %d\n",processname);

reclaim(processname,Header);

printf("当前内存分配情况:\n");

t=Header;

while(t!=0){

printf("process_name:%d,address:%d,length=%d,flag=%d\n", t->name, t->address, t->length,t->flag);

t=t->next;

}


第二篇:实验报告关于请求调页存储管理方式


《网络操作系统》

课 程 设 计 报 告 书

题 目:请求调页存储管理方式的模拟

学 号:

学生姓名:

指导教师:

目录

一. 实验内容. 1

二. 实验目的. 1

三. 设计思想. 2

四. 程序流程图. 3

五. 程序清单. 4

六. 运行结果及分析. 10

七. 总结. 14

一、实验内容

1.假设每个页面中可存放10条指令,分配给作业的内存块数为4。

2.用C语言或C++语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。

在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

3.置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用(LRU)算法。

4.作业中指令的访问次序按下述原则生成;

50%的指令是顺序执行的;

25%的指令是均匀分布在前地址部分;

25%的指令均匀分布在后地址部分。

具体的实现办法是:

(1)在[0,319]之间随机选取一条起始执行指令,其序号为m;

(2)顺序执行下一条指令,其序号为m+1条指令;

(3)通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;

(4)顺序执行下一条指令,即序号为m1+1的指令;

(5)通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;

(6)顺序执行下一条指令,则序号为m2+1的指令;

(7)重复跳转到前地址部分,顺序执行,跳转到后地址部分;顺序执行的过程,直至执行320条指令。

二、实验目的

1.通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟储技术的特点。

2.通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。

3掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

三、设计思想

在进程运行过程中,若其所要访问的页面不在内存需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,所以需要根据一定的算法来确定。在这一过程中,选择换出页面的算法称为页面置换算法。一个好的页面置换算法,应具有较低的页面更换频率。页面置换算法的好坏,将直接影响到系统的性能。以下分别是实验要求的两个页面置换算法的介绍及设计思想。

(1)先进先出法(First In First Out):

该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。

在该算法的模拟过程中,每当页面被置换进入内存时,将置换页面所在的物理块中访问标记设为-1;并且每执行一次指令,便将物理块的访问标记自动加1,需要置换时将访问标记最大的物理块中的页面置换出去,这样能防止当物理块访问标记出现两个以上相同的值的错误执行,更好地模拟了先进先出法;

(2)最近最久未使用(Least Recently Used):

该算法以最近的过去作为不久将来的近似, 将过去最长一段时间里不曾被使用的页面置换掉。

在该算法的模拟过程中,每当物理块中的页面被访问时(包括原先存在的和后来置换进入的页面),便将其物理块访问标记置为-1。以后每执行一条指令,便将物理块中各页面的访问标记加1,需置换时访问标记最大的便是将要被置换的。

(3)最佳置换算法(OPT):

发生缺页时,有些页面在内存中,其中有一页见很快被访问(也包含紧接着的下一条指令的那页),而其他页面则可能要到10、100或者1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数进行标记。

  最佳页面置换算法只是简单地规定:标记最大的页应该被置换。如果某页在八百万条指令内不会被使用,另一页在600万条指令内不会被使用,则置换前一个页面,从而把因需要调回这一页发生的缺页推到将来,越远越好。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较。

四、程序流程图及数据结构

数据结构:

typedef struct BLOCK//声明一种新类型——物理块类型

{

int pagenum;//页号

int accessed;//访问字段,其值表示多久未被访问

}BLOCK;

int count;//程序计数器,用来记录指令的序号

int n;//缺页计数器,用来记录缺页的次数

static int temp[320];//用来存储320条随机数

BLOCK block[size]; //定义一大小为4的物理块数组

void init( ); //程序初始化函数

int findExist(int curpage);//查找物理块中是否有该页面

int findSpace( );//查找是否有空闲物理块

int findReplace( );//查找应予置换的页面

void display ( );//显示

void Random( );//产生320条随机数,显示并存储到temp[320]

void pagestring( );//显示调用的页面队列

void OPT( );//OPT算法

void LRU( );// LRU算法

void FIFO( );//FIFO算法

五、程序清单

#include

#include

#include

#include

#define size 4

typedef struct BLOCK//声明一种新类型——物理块类型

{

int pagenum;//页号

int accessed;//访问字段,其值表示多久未被访问

}BLOCK;

int count;//程序计数器,用来记录指令的序号

int n;//缺页计数器,用来记录缺页的次数

static int temp[320];//用来存储320条随机数

BLOCK block[size]; //定义一大小为4的物理块数组

void init( ); //程序初始化函数

int findExist(int curpage);//查找物理块中是否有该页面

int findSpace( );//查找是否有空闲物理块

int findReplace( );//查找应予置换的页面

void display ( );//显示

void Random( );//产生320条随机数,显示并存储到temp[320]

void pagestring( );//显示调用的页面队列

void OPT( );//OPT算法

void LRU( );// LRU算法

void FIFO( );//FIFO算法

void init( )

{

for(int i=0;i

{

block[i].pagenum=-1;

block[i].accessed=0;

count=n=0;

}

}

int findExist(int curpage) //查找物理块中是否有该页面

{

for(int i=0; i

{

if(block[i].pagenum == curpage )

return i; //检测到内存中有该页面,返回block中的位置

}

return -1;

}

int findSpace( ) //查找是否有空闲物理块

{

for(int i=0; i

{

if(block[i].pagenum == -1)

return i; //找到空闲的block,返回block中的位置

}

return -1;

}

int findReplace( ) //查找应予置换的页面

{

int pos = 0;

for(int i=0; i

{

if(block[i].accessed >block[pos].accessed)

pos = i;//找到应予置换页面,返回BLOCK中位置

}

return pos;

}

void display( )

{

for(int i=0; i

{

if(block[i].pagenum != -1) //物理块不空

{

printf(" %02d",block[i].pagenum);

}

}

cout<

}

void Random( )

{ int flag=0;

cin>>count;

cout<<"******按照要求产生的320个随机数:*******"<

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

{

temp[i]=count;

if(flag%2==0)count=++count%320;//产生50%的顺序执行指令(flag=0或2时顺序执行)

if(flag==1) count=rand( )% (count-1); //产生25%的均匀分布在前地址部分指令

if(flag==3) count=count+1+(rand( )%(320-(count+1))); //产生25%的均匀分布在后地址部分指令

flag=++flag%4;

printf(" %03d",temp[i]);

if((i+1)%10==0) cout<

}

}

void pagestring( ) //显示调用的页面队列

{

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

{

printf(" %02d",temp[i]/10);

if((i+1)%10==0) cout<

}

}

//------------最佳置换算法

void OPT( )

{

int exist,space,position ;

int curpage;

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

{

if(i%100==0) getch( );

count=temp[i];

curpage=count/10;

exist = findExist(curpage);

if(exist==-1)

{

space = findSpace ( );

if(space != -1)

{

block[space].pagenum = curpage;

display( );

n=n+1;

}

else

{

for(int k=0;k

{

for(int j=i;j<320;j++)

{

if(block[k].pagenum!= temp[j]/10)

{

block[k].accessed = 1000;

}//将来不会用,设置为一个很大数

else

{

block[k].accessed = j;

break;

}

}

}

position = findReplace( );

block[position].pagenum = curpage;

display( );

n++;

}

}

}

cout<<"缺页次数:"<

cout<<"缺页率:"<<(n/320.0)*100<<"%"<

}

//------------------ 最近最少使用算法

void LRU( )

{

int exist,space,position ;

int curpage;

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

{

if(i%100==0) getch( ); //getch直接从键盘获取键值

count=temp[i]; //指令在数组中的位置

curpage=count/10; //指令所在页面

exist = findExist(curpage); //查找物理块中是否有该页面,若有返回物理块号

if(exist==-1) //物理块中不存在该页

{

space = findSpace( ); //查找是否有空闲物理块

if(space != -1) //有空闲物理块

{

block[space].pagenum = curpage;

display( );

n=n+1;

}

else //无空闲物理块,则寻找置换页面

{

position = findReplace( ); //查找应予置换的页面

block[position].pagenum = curpage;

block[position].accessed = -1; //恢复刚调入的BLOCK中页面accessed为-1

display( );

n++;

}

}

else block[exist].accessed = -1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1

for(int j=0; j<4; j++)

{block[j].accessed++;}

}

cout<<"缺页次数:"<

cout<<"缺页率:"<<(n/320.0)*100<<"%"<

}

//--------------- 先进先出算法

void FIFO( )

{

int exist,space,position ;

int curpage;

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

{

if(i%100==0) getch( ); //getch直接从键盘获取键值

count=temp[i];

curpage=count/10;

exist = findExist(curpage); //查找物理块中是否有该页面

if(exist==-1)

{

space = findSpace( ); //查找是否有空闲物理块

if(space != -1) //有空闲物理块

{

block[space].pagenum = curpage;

display( );

n=n+1;

}

else //无空闲物理块,则寻找置换页面

{

position = findReplace( ); //查找应予置换的页面

block[position].pagenum = curpage;

display( );

n++;

block[position].accessed--; //置换页面所在的物理块中访问标记设为-1

}

}

else//若存在该页

{

for(int i=0; i

{ if(block[i].pagenum != -1) //物理块不空

printf(" %02d ",block[i].pagenum);

}

cout<<"指令已经存在! 其物理块地址为:"<<&block[exist]<

}

for(int j=0; j

block[j].accessed++;

}

cout<<"缺页次数:"<

cout<<"缺页率:"<<(n/320.0)*100<<"%"<

}

void main( )

{

int select;

cout<<"请输入第一条指令号(1~320): ";

Random( );

cout<<"*****对应的调用页面队列*******"<

pagestring( );

do

{

cout<<"****************************************"<

cout<<"* 1:OPT 2:LRU 3:FIFO 4:退出 *"<

cout<<"****************************************"<

cout<<" 请选择一种页面置换算法:";

cin>>select;

cout<<"****************************************"<

init( );

switch(select)

{

case 1:cout<<"最佳置换算法OPT:"<

cout<<"*****************"<

OPT( );

break;

case 2:cout<<"最近最久未使用置换算法LRU:"<

cout<<"**************************"<

LRU( );

break;

case 3:cout<<"先进先出置换算法FIFO:"<

cout<<"*********************"<

FIFO( );

break;

default: ;

}

}while(select!=4);

}

六、使用说明及运行结果分析

运行程序依次测试相应的算法:

1、 先输入一个指令号(1-319)随意输入;

2、 然后选择测试算法;

本程序能通过输入第一条指令号(用3位整数代表指令号),产生320个随机数,并以每行10个显示出来。再把这320个随机数转换成对应的页面号,并以每行10个显示出来。然后,通过输入选择键,分别执行两个置换算法。各个置换算法能显示页面置换的情况,如果所访问的指令已在内存,则显示“该指令已经存在”并显示其物理地址;如果所访问的指令还未装入内存,则显示“调入的页面是。。。”,并显示其调入后的物理地址。所有指令执行完毕后显示缺页次数,和缺页率。基本实现了对请求调页存储器管理方式的模拟。本程序的另一个亮点是使用getch( )使程序的执行过程能够暂停。本程序基本实现了实验要求,但是仍有一定的不足之处。

七、总结

通过本次操作系统实验,使我们对操作系统这门课程有了更进一步的认识和了解,通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟储技术的特点。通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。

本实验的难点之一在于如何用c语言按要求模拟生成随机指令,即50%的指令是顺序执行的,25%的指令是均匀分布在前地址部分,25%的指令是均匀分布在后地址部分,小组花了大量时间讨论和研究该算法,并参考了相关的资料、运用了随机函数,最终通过一个函数Random( )予以实现。第二,如何较好地模拟出先进先出算法(FIFO)、最近最少使用算法(LRU)也花费了较多时间。

在本次设计过程中,用到了许多C++的基本知识和操作系统的基本原理,是对平时所学知识的一次考验,尽管这些知识都学过,但运用到实际时,却不知从何下手,而且错误不断,往往为了找一个错误而花了大量的时间,这是专业知识掌握不够,缺乏实践动手能力的表现。在设计的过程中我们发现了许多自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,以后还要多加努力。

总之,通过该实验,使我学到很多知识以及认识到实践的重要性。也使我了解到编写程序不是首要任务,而是一种实现手段。我们最重要的是如何做好需求分析和理清思路,做出正确、简洁的流程设计,这样可以达到事半功倍的效果。


教师评语

更多相关推荐:
存储管理实验报告

软件学院计算机课程实验报告册课程名称计算机操作系统实验学期20xx年至20xx年第2学期学生所在院系软件学院年级11软件专业班级软工1班学生姓名朱水云学号1115114034指导教师陈自刚实验最终成绩软件学院实...

操作系统存储管理实验报告

北京邮电大学操作系统实验实验报告实验日期20xx1220实验名称存储管理一实验目的2二实验内容2三实验分析2对于伙伴算法2对于虚拟存储区和内存工作区的不同算法3四编程实现3伙伴算法3原理3伙伴的概念3内存的释放...

《操作系统》存储管理实验报告

大学学院实验报告

存储管理实验报告

北方工业大学北方工业大学20xx513第2页共8页北方工业大学20xx513第3页共8页北方工业大学20xx513第4页共8页北方工业大学20xx513第5页共8页北方工业大学20xx513第6页共8页北方工业...

存储管理实验报告

实验四存储管理实验报告一实验目的存储管理的主要功能之一是合理地分配空间请求页式管理是一种常用的虚拟存储管理技术本实验的目的是通过请求页式管理中页面置换算法模拟设计了解虚拟存储技术的特点掌握请求页式存储管理的页面...

存储管理实验报告

GDOUB11112广东海洋大学学生实验报告书学生用表实验名称存储管理学院系学生姓名课程名称专业学号操作系统课程号班级实验日期软件学院软件工程实验地点一实验目的修改MINIX操作系统内存管理的源程序将MINIX...

存储管理实验报告

实验三存储管理一实验目的一个好的计算机系统不仅要有一个足够容量的存取速度高的稳定可靠的主存储器而且要能合理地分配和使用这些存储空间当用户提出申请存储器空间时存储管理必须根据申请者的要求按一定的策略分析主存空间的...

存储管理算法设计实验报告

操作系统实验报告题目存储管理算法设计院系计算机科学与工程学院班级姓名学号一实验题目存储管理算法设计二实验日期20xx年11月3日三实验目的与要求1通过本实验帮助学生理解存储管理的功能掌握动态异长分区的存储分配与...

可变分区存储管理实验报告

沈阳工程学院学生实验报告实验室名称信息工程系信息安全实验室实验课程名称操作系统实验项目名称可变分区存储管理班级计专本121姓名郑永凯学号20xx461127实验日期20xx年5月27日实验台编号F608指导教师...

可变分区存储管理+实验报告+程序+设计思路和感悟

实验题目可变分区存储管理一实验目的可变分区存储管理方式是操作系统中存储管理的重要方式其主要思想是用户作业进行连续存储每次按照用户的请求如果内存中有能满足用户作业大小的空闲区就采用不同的算法分配给用户否则不分配可...

动态分区存储管理实验报告

实验报告实验题目动态分区存储管理姓名王辉学号20xx1101416班级四班组别协作者指导教师赵卿实验概述实验目的及要求目的1加深对存储管理概念的理解2熟练存储管理对作业的插入和回收过程中的内存地址分配3深入了解...

请求页式存储管理模拟实验源代码及实验报告

请求页式存储管理模拟实验源代码及实验报告自己写的程序写得比较简单只为方便学弟学妹们呵呵dlnuincludeltiostreamgtincludeltprocesshgtincludeltstdlibhgtin...

存储管理实验报告(53篇)