资源简介
一、实验目的
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
相关资源
- 发送字符到指定的IP和端口
- 深度学习之TensorFlow 入门、原理与进阶
- quartus2自动售货机程序基于verilog语言
- IAR for STM8注册机
- mod_sslapache SSL插件
- 三份个人简历word模板
- Google Hack V2.0.rar
- Beginning WF_Windows Workflow in .NET 4.0一书的
- springcloud 一整套,解压就能用
- Arduino感光灯
- IpOverUSB.reg
- 定义一个Tree树类,有成员ages树龄,成
- 《Premiere Pro CC 2018视频编辑基础教程》
- OpenHaptics_API_Reference 完整API翻译
- fortran与c混合编程fortran调用c
- VISIO 数字逻辑 集成电路引脚图 模具
- 快速傅里叶变换程序
- 立体像对前方交会对话框ogx
- MessageQueueDemo
- HP ProLiant DL388p Gen8 服务器 - LED 指示灯
- 罗技(Logitech) 游戏软件 G-series Lua
- VmwareHorizonView6.0.txt
- dspic33的PWM调试程序
- 基于AT89S52单片机数码管显示数字钟含
- win10win8win7xp 串口调试助手SerialProV1.
- ODX220_Parse.zip
- OPENJTAG驱动包
- Eagle 8.6.0 windows版本 破解补丁 V1.0
- Windows剪切板记录器(WinCopy )
- DICOM 协议中文版 1-6 部分 完整版
评论
共有 条评论