• 大小: 51KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: OPT  FIFO  LRU  报告  

资源简介

一、实验目的 1、了解虚拟存储器的基本原理和实现方法。 2、掌握几种页面置换算法。 二、实验内容 设计模拟实现采用不同内外存调度算法进行页面置换,并计算缺页率。 三、实验原理 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Window中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。 虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。它是采用一定的方法将一定的外存容量模拟成内存,同时对程序进出内存的方式进行管理,从而得到一个比实际内存容量大得多的内存空间,使得程序的运行不受内存大小的限制。虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。 虚拟内存的设置主要有两点,即内存大小和分页位置,内存大小就是设置虚拟内存最小为多少和最大为多少;而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。 1. 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。 2. 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 3. 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
 
#define Myprintf printf(“|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n“)   //*表格控制*/

int M; 
int N;  

typedef struct page 

int num;  /*记录页面号*/ 
int time;   /*记录调入内存时间*/        //(lru那用到)
int index;  //记录调入内存的先后次序   //从1开始(FIFO那用到)
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/ 
Page b[10];            /*内存单元数*/  //从0开始

int c[10][150];   /*暂保存内存当前的状态:缓冲区*/ 
int queue[100];       /*记录调入队列*/ 
int K;             /*调入队列计数变量*/ 


/*初始化内存单元、缓冲区*/ 
void Init(Page *bint c[10][150]) 

int ij; 
for(i=0;i
b[i].num=-1; 
b[i].time=M-i-1; 
b[i].index=i+1;

for(i=0;i for(j=0;j c[i][j]=-1; 


/*取得在内存中停留最久的页面默认状态下为最早调入的页面*/ 
int GetMaxTime(Page *b) 
{
int i;
int max=-1; 
int tag=0; 
for(i=0;i
if(b[i].time>max) 

max=b[i].time; 
tag=i; 


return tag; 


int GetMinTime(Page *b) 
{
int i;
int min=1000; 
int tag=0; 
for(i=0;i
if(b[i].time
min=b[i].time; 
tag=i; 


return tag; 


/*判断页面是否已在内存中*/ 
int    Equation(int foldPage *b) 

int i; 
for(i=0;i
if (fold==b[i].num) 
return i; 

return -1; 


//LRU核心部分     最近最久未使用置换算法
void Lru(int foldPage *b) 

int i; 
int val; 
val=Equation(foldb);   //判断页面是否已在内存中,val代表在内存中的位置
if (val>=0)       //在内存中

b[val].time=0;   //存在就把那个东西的时间变成0
for(i=0;i if (i!=val) 
b[i].time++;  // 其他的时间就要累加

else 

queue[++K]=fold;/*记录调入页面*/ 
val=GetMaxTime(b);    //取得在内存中停留最久的页面默认状态下为最早调入的页面,val代表在内存中的位置
b[val].num=fold; 
b[val].time=0; 
for(i=0;i if (i!=val) 
b[i].time++; 



//先进先出置换算法
void FIFO(int foldPage *b)
{
int i; 
int val; 
bool flag=false;
val=Equation(foldb);   //判断页面是否已在内存中,val代表在内存中的位置

if (val<0)       //不在内存中 
{
queue[++K]=fold;/*记录调入页面*/
for(i=0;i {
if (b[i].num<0)
{
b[i].num=fold;
b[i].index=i+1;
flag=true;
break;
}
}
if (flag==false)
{
for(i=0;i
if(b[i].index==1) 

val=i; 


b[val].num=fold; 
b[val].index=M;  
for(i=0;i {
if(i!=val) 
      b[i].index--; 
}
}
}  
}

//最佳置换算法
void Optimal(int a[150]int posPage *b)
{
int ij; 
int val;
int fold=a[pos];
bool flag=false;

val=Equation(foldb);   //判断页面是否已在内存中,val代表在内存中的位置

if (val<0)       //不在内存中 
{
queue[++K]=fold;/*记录调入页面*/
for(i=0;i {
if (b[i].num<0)
{
b[i].num=fold;
flag=true;
break;
}
}
if (flag==false)
{
for(i=0;i
for(j=pos+1;j {
if (b[i].num!=a[j])
{ b[i].time= 1000; }
else
{
b[i].time=j;
break;
}
}

val=Ge

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6732  2011-12-14 18:05  虚拟存储器.cpp

     文件     111616  2012-01-15 12:17  虚拟存储器.doc

----------- ---------  ---------- -----  ----

               118348                    2


评论

共有 条评论