【操作系统】页面置换算法

页面置换算法

在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置换算法。页面置换算法的好坏,将直接影响系统的性能。

一个好的页面置换算法,应做到减少页面置换的频率。尽量将以后不会用到的或较长时间不会使用的页面给置换出。

下面介绍几种常用的页面置换算法。


1. 最佳置换算法

该算法是一种理想化的算法,具有非常好的性能,但是由于目前无法预知未来,因此难以实现。

该算法选择淘汰的页面是:未来永远不会再使用的页面 or 未来最长时间不再被访问的页面。该算法保证了可以获得最低缺页率,但无法预知未来页面的使用情况,因此目前无法实现,但通常用来评价其他算法。

例:假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
进程运行时,先将 7,0,1 三个页面装入内存。以后,当进程要访问页面 2 时,将会产生缺页中断。此时 OS 根据最佳置换算法,将选择页面 7 予以淘汰。这是因为页面 0 将作为第 5 个被访问的页面,页面 1 是第 14 个被访问的页面,而页面 7 则要在第 18 次页面访问时才需调入。下次访问页面 0 时,因它已在内存而不必产生缺页中断。当进程访问页面 3时,又将引起页面 1 被淘汰;因为,它在现有的 1,2,0 三个页面中,将是以后最晚才被访问的。图 4-26 示出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了 6 次页面置换。

1


2. 先进先出(FIFO)页面置换算法

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

例:同上。当进程第一次访问页面 2 时,将把第 7 页换出,因为它是最先被调入内存的;在第一次访问页面 3 时,又将把第 0 页换出, 因为它在现有的 2, 0, 1 三个页面中是最老的页。 由图 4-27 可以看出,利用 FIFO 算法时进行了 12 次页面置换,比最佳置换算法正好多一倍。
2


3. 最近最久未使用(LRU)算法

该算法以过去预测未来,选择之前最长时间未使用的页面置换。但是由于利用“过去”作为“未来”的近似这一做法并非完全可靠,因此有时会造成缺页率非常高,导致效率会非常低。

例:同上。当进程第一次对页面 2 进行访问时,由于页面 7 是最近最久未被访问的,故将它置换出去。当进程第一次对页面 3进行访问时,第 1 页成为最近最久未使用的页,将它换出。由图可以看出,前 5 个时间的图像与最佳置换算法时的相同,但这并非是必然的结果。因为,最佳置换算法是从“向后看”的观点出发的,即它是依据以后各页的使用情况;而 LRU 算法则“向前看”的,即根据各页以前的使用情况来判断,而页面过去和未来的走向之间并无必然的联系。

3


4. 代码实现

该部分代码使用vector来实现,未使用链表。

/*************************************************************************> 测试数据> 20> 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1> 3************************************************************************/#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;class PageReplacement {
private:vector<int> page;int page_num;  //物理内存块数
public:PageReplacement() : page_num(0) {}void create();void print();void physical_block_print( const vector<int>& );bool isfind( const vector<int>&, int );  //查找是否已在内存物理块中void FIFO();  //FIFO页面置换算法void LRU();  //LRU页面置换算法void OPT(); //OPT页面置换算法
};void PageReplacement::create() {cout << "请输入页面个数: ";int n, t;cin >> n;cout << "请输入页面串:\n";while( n-- ) {cin >> t;page.push_back( t );}cout << "请输入内存物理块数: ";cin >> page_num;
}void PageReplacement::print() {int n = page.size();cout << "页面串:\n";for( int i = 0; i < n; i++ ) {cout << page[i] << ' ';}cout << endl;
}void PageReplacement::physical_block_print( const vector<int>& t ) {int n = t.size();for( int i = 0; i < n; i++ ) {cout << t[i] << ' ';}cout << endl;
}bool PageReplacement::isfind( const vector<int> & block, int t ) {if ( find( block.begin(), block.end(), t ) != block.end() ) {return true;}return false;
}/* FIFO页面置换算法 */
void PageReplacement::FIFO() {vector<int> physical_block( page_num, -1 );int n = page.size(), cur = 0;int not_found = 0;cout << "FIFO页面置换情况:\n";for( int i = 0; i < n; i++ ) {if( !isfind( physical_block, page[i] ) ) {physical_block[cur] = page[i];  //页面置换cur = (cur+1)%page_num;not_found++;}physical_block_print( physical_block );  //输出每个物理块信息}cout << "缺页次数:"<< not_found << endl;
}/* LRU页面置换算法 */
void PageReplacement::LRU() {vector<int> physical_block( page_num, -1 );map<int, int> page_time;int n = page.size();int not_found = 0;for( int i = 0; i < n; i++ ) {if ( !isfind( physical_block, page[i] ) ) {  //当前页不在为物理块中if ( page_time.size() < page_num ) { //物理块未放满physical_block[i] = page[i];page_time[page[i]] = i;} else {  //物理块放满,进行页面置换map<int, int>::iterator it = page_time.begin(), t = it;for( it++; it != page_time.end(); it++ ) {if ( t->second > it->second ) {t = it;}}int index;for( index = 0; index < page_num && physical_block[index]!=t->first; index++ );physical_block[index] = page[i];page_time.erase( t );page_time[page[i]] = i;}not_found++;} else {  //在物理块中,更新页面最后使用时间page_time[page[i]] = i;}physical_block_print( physical_block );}cout << "缺页次数:"<< not_found << endl;
}/* OPT页面置换算法 */
void PageReplacement::OPT() {vector<int> physical_block( page_num, -1 );int n = page.size();int not_found = 0;for( int i = 0; i < n; i++ ) {if( !isfind( physical_block, page[i] ) ) {  //当前页不在物理块中if( i < page_num ) {  //物理块未放满physical_block[i] = page[i];} else {  //物理块放满,进行页面置换map<int, int> page_time;int k, j;/* 获取物理块中页面此后的最先使用时间 */for( j = 0; j < page_num; j++ ) { //遍历physical_blockfor( k = i+1; k < n; k++ ) {  //遍历pageif( physical_block[j] == page[k] ) {page_time[page[k]] = k;break;}}if( k == n ) {page_time[physical_block[j]] = k;}}/* 寻找可以置换的页面 */map<int, int>::iterator it = page_time.begin(), t = it;for( ; it != page_time.end(); it++ ) {if ( t->second < it->second ) {t = it;}}/* 获取被置换页面在物理块的下标 */int index = 0;for( ; index < page_num && physical_block[index] != t->first; index++ );physical_block[index] = page[i];}not_found++;}physical_block_print( physical_block );}cout << "缺页次数:"<< not_found << endl;
}int main() {PageReplacement t;t.create();// t.FIFO();t.LRU();// t.OPT();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 1617——Laptop

题意&#xff1a;有n个长度为1的线段&#xff0c;确定它们的起点&#xff0c;使得第i个线段在【ri&#xff0c;di】之间&#xff0c;输出空隙数目的最小值。 思路&#xff1a;贪心。首先对区间进行排序&#xff0c;然后扫描一遍&#xff0c;当上一个线段最右边加1《当前最左的点…

ubuntu18.04安装、配置dosbox

1 安装dosbox&#xff1a;打开终端&#xff0c;输入&#xff1a; sudo apt install dosbox 2 安装完成后&#xff0c;启动dosbox&#xff0c;在终端输入&#xff1a; dosbox 3 设置自动挂载 退出dosbox&#xff0c;在终端中输入&#xff1a; vim .dosbox/dosbox-0.74.con…

关于 SENDKEYS 的代码

sendkeys 的用法&#xff08;MSDN&#xff09;&#xff1a; SendKeys 语句 将一个或多个按键消息发送到活动窗口&#xff0c;就如同在键盘上进行输入一样。 语法 SendKeys string[, wait] SendKeys 语句的语法具有以下几个命名参数&#xff1a; 部分描述string必需的。字符串表…

uva 1615——Highway

题意&#xff1a; 给定平面上n个点&#xff0c;和一个值D&#xff0c;要求在x轴上选出尽量少的点&#xff0c;使得对给定的点&#xff0c;都有一个点离他的欧几里德距离步超过D。 思路&#xff1a;区间覆盖问题。以平面上的点为圆心&#xff0c;以D为半径&#xff0c;求出来一个…

解决linux写入ntfs盘时报错:只读文件系统

[2018.10.28 更新] 可能因为在挂载wimdows盘后&#xff0c;强制关机造成的&#xff0c;可使用 sudo ntfsfix /dev/*** 来修复。其中&#xff0c;***为具体哪个盘&#xff0c;例如sudo ntfsfix /dev/sda4 之前一直可以对windows盘进行读写操作&#xff0c;但今天突然不能用了&am…

家里装AD了

通过关系&#xff0c;家里终于装上了ADSL&#xff0c;而且还是130包月的&#xff0c;还免了调测费转载于:https://www.cnblogs.com/d9394/archive/2005/09/28/10611828.html

uva 1613——K-Graph Oddity

题意&#xff1a;输入n个点m条边的联通图&#xff0c;n为奇数&#xff0c;设k为最小的奇数&#xff0c;使得每个点的度数不超过k&#xff0c;要求把节点都涂上颜色&#xff0c;使得相邻节点颜色不一样。 思路&#xff1a;dfs。k的值为奇数&#xff0c;所以k为节点最大度数&…

应用ADO.net得到表

----------------------------------------------------------开发者&#xff1a;开发时间&#xff1a;2004.9.9功能&#xff1a;应用ADO.net得到表----------------------------------------------------------Imports Zy_DataAccessImports SystemImports System.DataImports…

uva 11093——Just Finish it up

题意&#xff1a;环形跑道上有n个加油站&#xff0c;每个站可以加pi单位的油&#xff0c;从当前站开到下一站需要qi的油&#xff0c;问是否能够环游一圈。 思路&#xff1a;枚举。首先如果总需求量>总供给量&#xff0c;那么不可能。否则就枚举起点&#xff0c;如果油箱里的…

【计算机网络】TCP IP通信处理过程

1.数据包首部 每个分层中都会对所发送的数据附加一个首部&#xff0c;其中包含了该层必要的信息&#xff0c;如发送端地址、接收端地址以及协议等相关信息。 2.发送数据包 1&#xff09;应用程序处理 进行编码处理&#xff08;相当于表示层功能&#xff09;&#xff0c;管…

感觉自己越来越浮躁

重新审视自己的技术走向&#xff0c;不得不承认&#xff0c;越来越向上层迈进。但是这不是我喜欢的&#xff0c;一味的追求快速开发&#xff0c;希望自己的开发速度能一个人顶10个人&#xff0c;但是往往容易在项目中迷失自己&#xff0c;很希望能快点结束这段噩梦般的项目&…

uva 12627——Erratic Expansion

题意&#xff1a;一开始有1个红气球&#xff0c;每小时一个红气球都会变成3个红气球和1个蓝气球&#xff0c;1个蓝气球会变成4个蓝气球&#xff0c;问k个小时后a行到b行的红气球的数量。 思路&#xff1a;递推。a为偶数时&#xff0c;计算a1到b以及a本行的红气球数。b为奇数时&…

【计算机网络】数据链路相关技术

1.MAC地址 MAC地址长48字节。在使用网卡的情况下&#xff0c;一般会将MAC地址烧入到ROM中&#xff0c;任何一个网卡的MAC地址都是唯一的。例如 00:10:5A:70:33:61 MAC地址的3~24位表示厂商识别码&#xff0c;每个NIC厂商都有特定唯一的识别数字。25~48位是厂商内部为识别每个…

uva 714——Copying Books

题意&#xff1a;把一个m个整数的序列划分成k个连续非空的子序列&#xff0c;使得子序列和的最大值最小。 思路&#xff1a;二分。遇到最大值最小大多都二分了&#xff0c;让划分的子序列都不超过x&#xff0c;根据x来judge最终结果k个是多还是少&#xff0c;然后二分来调整x直…

[JavaScript]让footer总是停留在页面的底部(footer all the way at the bottom of the page)

在网页的底部总是保留着公司的版本信息&#xff0c;如何是这部分信息来实现呢&#xff1f;下面的一段javascript演示了如何让footer总是停留在页面的底部。这段代码我在实际使用的时候不是特别的完美&#xff0c;在包含有其他javascript控制的页面和控件的时候会出现重叠的现象…

【计算机网络】IP地址

IP地址的基础知识 在TCP/IP通信中&#xff0c;IP地址用于识别主机和路由器。 1.IP地址的定义 IPv4地址为32位&#xff0c;IPv6地址为128位。&#xff08;以下以IPv4为例&#xff09; 将32位的IP地址分为4组&#xff0c;每组8位&#xff0c;每组间用“.”隔开&#xff0c;再…

uva 1451——Average

题意&#xff1a;给定一个长度为n 的01串&#xff0c;然后选一个长度至少为L的子串&#xff0c;使得子串的平均值最大。 思路&#xff1a;单调队列。如果把所有的前缀和都求出来&#xff0c;那么所求即为max((s[j] - s[i]) / (j - i)) &#xff0c;转化成图也就是求斜率最大的那…

近期工作:帮忙师兄

C# 获取机器硬件状态简单的解释器 C# XML读写转载于:https://www.cnblogs.com/anf/archive/2005/12/14/296880.html

【操作系统】哲学家就餐问题

问题 有五个哲学家围坐在一圆桌旁&#xff0c;桌中央有一盘通心粉&#xff0c;每人面前有一只空盘子&#xff0c;每两人之间放一只筷子。每个哲学家的行为是思考&#xff0c;感到饥饿&#xff0c;然后吃通心粉。为了吃通心粉&#xff0c;每个哲学家必须拿到两只筷子&#xff0…

uva 11134——Fabled Rooks

题意&#xff1a;给定一个n*n的期棋盘放n个车&#xff0c;要求任意车之间不能相互攻击&#xff0c;并且每个车都在相应的方框内。 思路&#xff1a;贪心。因为没有对角线的条件约束&#xff0c;所以放的行号和列号没有影响。那么单独求出来行号和列号即可。对于每一行&#xff…