操作系统-最佳置换算法(OPT)实现

  • 算法思想
    OPT算法在每次需要进行页面置换时,会选择当前内存中包含的所有页面中,未来最长时间内不会被访问的页面进行替换。

  • 算法特点
    是所有算法中耗时最短的一种算法,但是在实际情况中基本无法实现,其原因是未知未来多久哪些页面会被访问,哪些页面不会被访问,故实现起来十分困难,但可以用作其他算法优良的参考,还能起到鉴别其他算法合理性。

  • 算法实现
    1)当需要进行页面置换时,对当前物理块中的所有页面进行扫描。
    2)对于每个页面,计算它在未来又一次被访问的时间节点。
    3)选择具有最长不访问时间的页面进行置换。

注:本文将一开始向空的物理块调入页面也作为缺页处理,可能会与其他文章有所不同。

#include<bits/stdc++.h>
using namespace std;
int arr[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//测试数据
int page[3] = {7,0,1};//假设有三个物理块,可以根据实际需求进行修改
void OPT() {
	int pos[3] = {0,1,2};//记录初始位置
	int cishu = 3;//表示页面缺页的次数,初始值为3
	bool flag[3] = {false,false,false};
	for(int arr_pos = 3; arr_pos<sizeof(arr)/sizeof(arr[0]); arr_pos++) {
		bool change = true;
		flag[0] =false,flag[1] = false,flag[2] = false;
		for(int i = 0; i<3; i++) {
			cout<<"arr_pos:"<<arr_pos<<"值:"<<arr[arr_pos]<<" i: "<<i<<" 值: "<<page[i]<<endl;
			if(page[i]==arr[arr_pos])change = false; //页面有这个块号
		}
		if(change==true)continue;
		for(int i = 3; i<sizeof(arr)/sizeof(arr[0]); i++) {
			for(int j = 0; j<3; j++) {
				if(arr[i]==page[j]&&flag[j]==false) {
					pos[j] = i;
				}
			}
		}
		int now = -1;
		//找最大
		if(pos[0]<pos[1]) {
			if(pos[1]<pos[2]) {
				now = 2;
			} else {
				now = 1;
			}
		} else {
			if(pos[0]<pos[2]) {
				now = 2;
			} else {
				now = 0;
			}
		}
		page[now] = arr[arr_pos];
		cishu++;
	}
	cout<<"缺页次数:"<<cishu<<" 缺页率:"<<(float)cishu/(float)(sizeof(arr)/sizeof(arr[0]))<<endl;
}
int main() {
	OPT();
	return 0;
}

实验结果如下:
OPT算法实验结果

本文结束,希望上述的代码对你理解OPT算法有所帮助,如有出现错误的地方,还请批评指正,谢谢
如果你对操作系统其他的页面置换算法实现存在疑问,可以查看下列博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

献给塔奇克马的花束❀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值