实验五 页面置换算法的模拟

该博客聚焦虚拟存储技术与请求页式存储管理的页面置换算法。实验目的是了解虚拟存储特点,掌握OPT、FIFO、LRU算法。要求设计实现其中一种算法,完成代码编写并运行得出结果,最后还提醒关注打赏。

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

1.实验目的

1)了解虚拟存储技术的特点。

2)掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(LeastRecently Used)置换算法。

2.实验要求

1)设计模拟实现OPT、FIFO和LRU页面置换算法中的任意一种。

OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

2)完成算法代码。

3)运行程序,算出结果。

#include <cstdio>
#include <iostream>
#include <algorithm>
 
using namespace std;
#define MAX_L 1000
#define MAX_M 1000
int m,k;//可用内存块和作业的页面数分别为m和k
int ReqPage[MAX_L],L;//页面走向长度为L
 
double random() {  
	static double Seed = 233;  //随机种子,在此处可改变初值 
	Seed = 125.0 * (Seed + 1.0);
	Seed = Seed - 8192.0 * (int)(Seed/8192);
	return (Seed+0.5)/8192;
}
 
void CALC_FIFO() {
	cout << "FIFO算法\n"; 
	static int PageTable[MAX_M];
	int missNum = 0;
	for (int i = 0; i<m && i<L; i++) {
	  PageTable[i] = ReqPage[i];
	  missNum++;
	}
	int lastId = 0;
	if (L > m) {
		for (int i = m; i < L; i++) {
			int *pageIt = find(PageTable, PageTable+m, ReqPage[i]);
			if (pageIt != PageTable+m) continue;
			missNum++;
			printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[lastId]);
			PageTable[lastId] = ReqPage[i];	
			lastId = lastId+1;
			if (lastId == m) lastId = 0;
		}
	}
	printf("缺页率%g\n", 1.0*missNum/L); 
}
 
void CALC_LRU() {
	cout << "LRU算法\n"; 
    int PageTable[MAX_M];
    int LastVisitTime[MAX_M]; //记录最近访问时间 
	int missNum = 0;
	for (int i = 0; i<m && i<L; i++) {
	  PageTable[i] = ReqPage[i];
	  LastVisitTime[i] = i;
	  missNum++;
	}
	if (L > m) {
		for (int i = m; i < L; i++) {
			int *pageIt = find(PageTable, PageTable+m, ReqPage[i]);
			if (pageIt != PageTable+m) {
				LastVisitTime[pageIt - PageTable] = i;
			    continue;
			}
			missNum++;
			int *minLastVisitIt = min_element(LastVisitTime, LastVisitTime + m);
			int pageOutId = minLastVisitIt - LastVisitTime;
			printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[pageOutId]);
		    PageTable[pageOutId] = ReqPage[i];	
			LastVisitTime[pageOutId] = i;
		}
	}
	printf("\n缺页率%g\n", 1.0*missNum/L); 
}
 
int main() {
	cout << "请分别输入可用内存块m,作业的页面数k,页面走向长度为L\n";
	cin >> m >> k >> L;
	cout << "随机生成的页面走向为:\n";
	for (int i = 0; i < L; i++) {
	  ReqPage[i] = static_cast<int>(random() * k);
	  	// random()生成0~1,  random()*k 向零取整为0~k-1  
	  cout << ReqPage[i]<< " ";
    }
    puts("");
    
    CALC_FIFO();
    CALC_LRU();
	return 0;
} 

运行之后:

 记得关注打赏。

时钟算法 页面置换算法 #pragma once #include <iostream> #include "Pclass.h" using namespace std; class Allocation { private: int pnum;//页面数 int bnum;//分配块数 //int ID; int num;//访问页面次数 Pclass * block;//块数组 int *page;//页访问顺序 //int p; public: Allocation(int pn,int bl,int n) { pnum=pn; bnum=bl; num=n; //ID=id; block=new Pclass [bnum]; page=new int [num]; cout<<"页面访问顺序:"; for(int i=0;i<num;i++) { page[i]=rand()%pnum+1; cout<<page[i]<<" "; } cout<<endl; //p=0; } void FIFO() { cout<<"先进先出算法:"<<endl; int p=0; int nm=0; for(int i=0;i<num;i++) { if(Haven(page[i])!=(-1)) { nm++; } else { block[p].num=page[i]; p=(++p)%bnum; } for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } int Haven(int n) { for(int i=0;i<bnum;i++) { if(block[i].num==n) { return i; } } return -1; } void LRU() { int p=0; int nm=0; for(int i=0;i<bnum;i++) { block[i].num=0; block[i].visited=false; } for(int i=0;i<num;i++) { int temp=Haven(page[i]); if(temp!=(-1)) { block[temp].visited=true; nm++; } else { //int j=0; while(1) { if(block[p].visited==false) { block[p].num=page[i]; p=(++p)%bnum; break; } else { block[p].visited=false; p=(++p)%bnum; } } } for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } void SLRU() { int p=0; int nm=0; for(int i=0;i<bnum;i++) { block[i].num=0; block[i].visited=false; } for(int i=0;i<num;i++) { int temp=Haven(page[i]); if(temp!=(-1)) { block[temp].visited=true; nm++; } else { for(int j=0;j<bnum;j++) { if(block[p].visited==false&&block[p].changed==false) { block[p].num=page[i]; if(rand()%2) { block[p].changed=true; } p=(++p)%bnum; goto over; } else { block[p].visited=false; p=(++p)%bnum; } } while(1) { if(block[p].changed==false) { block[p].num=page[i]; p=(++p)%bnum; break; } else { block[p].changed=false; p=(++p)%bnum; } } } over: for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } ~Allocation(void) { } };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦与陌生人

打赏每人一元起步·小气鬼

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值