在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
页面置换算法有很多种,比如Optimal(最佳置换)算法,FIFO(先进先出)算法,LRU(最近最久未使用)算法等等,最佳置换算法是不实际的,它只是一种构想,因为我们并不能预测哪个页面在将来再也不会被使用。那么对于FIFO算法和LRU算法那个更好呢?这就涉及到一个概念---“缺页率”。在进程的运行过程中,若其所要访问的页面不在内存中则缺页。我们不能让缺页率太高,所以必须选择一种使得缺页率较小的置换算法。
FIFO算法实现简单,但是性能较差,因为它依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况,LRU算法,是根据页面调入内存后的使用情况进行决策的,由于我们是无法预知页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,所以LRU算法选择了内存中最久没有被使用到的页面进行淘汰。
该算法赋予每一个页面一个访问字段,用来记录一个页面自上次被访问所经历的时间t。当产生缺页的时候,选择现有页面中t值最大的,即最近最久未使用的页面进行淘汰。
有如下例子
为了实现此算法,我们用java里面的ArrayList来模拟操作系统中的页面缓冲区,将页面放在里面,输入一个页面访问序列,在缓冲区中进行页面的置换。
1、首先我们定义页面属性,有页面编号和页面的时间t
package LRU;
public class Page {
char num;//页面编号
int time;//页面没有被访问到的时长
}
2、然后进行页面置换算法:
package LRU;
import java.util.ArrayList;
import java.util.Scanner;
public class LRU {
static ArrayList<Page> pages = new ArrayList<Page>();//模拟缓冲区的队列
int size = 4;//设置缓冲区大小为4个页面
public static void main(String[] args) {
LRU lru = new LRU();
lru.initList();
System.out.println("当前缓冲区大小"+lru.size+"\n缓冲区状态为:");
lru.printList();
lru.getPages();
}
/**
* 得到要置换的所有页面序列
*/
private void getPages() {
String str = null;
System.out.println("请输入页面序列");
Scanner sca = new Scanner(System.in);
str = sca.next();
toChars(str);
}
/**
* 将序列序号存入char型数组
*
* @param str
*/
private void toChars(String str) {
char[] ch = new char[str.length() + 1];
for (int i = 0; i < str.length(); i++) {
ch[i] = str.charAt(i);
}
ch[str.length()] = '#';
exchange(ch);
}
/**
* 初始化缓冲区(cache)
*/
private void initList() {
for (int i = 0; i < size; i++) {
Page page = new Page();
page.num = '#';
page.time = 0;
pages.add(page);
}
}
private void exchange(char[] ch) {
char temp;
int time = 0;
int i = 0;
printList();
while (ch[i] != '#') {
if(i<9){
System.out.print("\n"+"第"+0+(i+1)+"次置换----");
}
else{System.out.print("\n"+"第"+(i+1)+"次置换----");}
if (isIn(ch[i]) != -1) {
System.out.print("当前页面存在缓冲区:");
int position = isIn(ch[i]);
pages.get(position).time = 0;
timeAdd(position);
printList();
i++;
continue;
}
if (space(ch[i]) != -1) {
System.out.print("缓冲区内有空余页面:");
int position = space(ch[i]);
pages.get(position).num = ch[i];
pages.get(position).time = 0;
timeAdd(position);
printList();
i++;
continue;
}
if (isIn(ch[i]) == -1) {
System.out.print("当前页面不在缓冲区:");
int max = 0;
int position = 0;
for (int j = 0; j < size; j++) {
if (pages.get(j).time > max) {
max = pages.get(j).time;
position = j;
}
}
pages.get(position).num = ch[i];
pages.get(position).time = 0;
timeAdd(position);
printList();
i++;
continue;
}
}
}
/**
* 判断缓冲区是否有空位
* @param ch
* @return
*/
private int space(char ch) {
int flag = -1;
for (int i = 0; i < size; i++) {
if (pages.get(i).num != '#') {
continue;
}
flag = i;
break;
}
return flag;
}
/**
* 判断当前页面有没有在缓冲区内,返回位置
* @param ch
* @return
*/
private int isIn(char ch) {
int flag = -1;
for (int i = 0; i < size; i++) {
if (ch != pages.get(i).num) {
continue;
}
flag = i;
break;
}
return flag;
}
/**
* 打印缓冲区页面
*/
private void printList() {
for (int i = 0; i < size; i++) {
System.out.print(pages.get(i).num + "\t");
}
}
/**
* 增加页面时间属性
* @param position
*/
private void timeAdd(int position) {
for (int i = 0; i < size; i++) {
if (i == position || pages.get(i).num == '#') {
continue;
}
pages.get(i).time += 1;
}
}
}
运行结果如下:
相关推荐
使用LRU算法实现页面置换算法。LRU算法基于一种假设,长期不使用的数据,在未来的使用性也不大。因此,当数据占用内存达到一定的阙值时,我们要移除最近最少使用的数据。LRU算法中,使用了一种有趣的数据结构,叫做...
LRU页面置换算法 LRU 页面置换算法是一种常用的页面置换算法,主要用于操作系统中虚拟内存管理。该算法的核心思想是将最久未使用的页面从内存中置换出去,以腾出内存空间用于其他应用程序。 LRU 页面置换算法的...
FIFO、OPT、LRU页面置换算法实验代码和截图 在操作系统中,页面置换算法是指操作系统在内存不足时,如何将某些页面从内存中移除,以腾出空间供其他页面使用的算法。常见的页面置换算法有FIFO、OPT、LRU等。 FIFO...
在给定的`LRU页面置换算法.cpp`文件中,可能包含了LRU算法的C++实现,包括链表和哈希表的数据结构,以及相关的页面调入、置换和更新操作的代码逻辑。学习这个代码可以帮助理解LRU算法的具体工作流程,并可以作为实现...
总的来说,这个C语言项目为学习和实践LRU页面置换算法提供了一个实用的工具,有助于深入理解和掌握这一重要概念。通过阅读和分析源代码,开发者可以进一步了解如何在实际编程中实现这样的算法。
根据给定文件的信息,我们可以详细地探讨一下在虚拟存储管理中如何实现三种主要的页面置换算法:Optimal (OPT), First-In First-Out (FIFO), 和 Least Recently Used (LRU)。此外,我们还会简要提及Clock置换算法,...
### LRU页面置换算法详解与C/C++实现 在计算机科学中,页面置换算法是操作系统内存管理中的一个重要组成部分,主要用于解决虚拟内存环境下的页面调度问题。其中,“最近最少使用”(Least Recently Used,简称LRU)...
**LRU页面置换算法**: LRU算法则是根据页面的使用历史来决定淘汰哪个页面。它的核心思想是,最近被使用的页面在未来最有可能继续被使用,因此应该尽可能保留在内存中。当需要替换页面时,LRU会选择最近最久未使用的...
在C语言实现的LRU页面置换算法模拟中,通常会包含以下几个关键部分: 1. **数据结构设计**: - 链表:LRU算法通常用链表来存储页面,链表节点代表页面,节点中的信息包括页面号和时间戳(访问时间)。 - 哈希表:...
LRU 页面置换算法模拟最近最久未使用置换算法课程设计 本课程设计的主要目的是使用 C 语言实现最近最久未使用(LRU)置换算法,了解内存分页管理策略,掌握调页策略和一般常用的调度算法,并模拟实现 LRU 算法。 ...
本主题聚焦于通过链表实现的存储管理,特别是涉及了三种重要的页面置换算法:先出(FIFO)页面置换算法、最近最少使用(LRU)页面置换算法和最佳(OPT)置换算法。 首先,内存分配与回收是存储管理的基础。当一个新...
在Java中实现LRU页面置换算法,通常会用到数据结构如HashMap或LinkedHashMap,因为它们能够提供快速的查找和按照访问顺序排序的功能。HashMap提供了O(1)的时间复杂度进行查找,而LinkedHashMap则在HashMap的基础上...
LRU页面置换算法模拟(最近最久未使用置换算法).doc
在进行FIFO和LRU页面置换算法的模拟设计时,你需要考虑以下几个关键步骤: 1. **数据结构设计**:创建一个表示内存的数组或数据结构,存储当前在内存中的页面;另外,还需要一个结构来记录每个页面的访问信息,如...
本项目将深入探讨两种重要的页面置换算法:FIFO(先进先出)和LRU(最近最久未使用)。通过使用C语言在Linux环境下进行模拟,我们可以更好地理解这些算法的工作原理。 **FIFO(先进先出)页面置换算法**: FIFO是最...
lru置换算法是操作系统很经典的页面置换算法,此算法必能掉是通过。
该工程具体是在codeblock上面实现了操作系统课程上讲解的页面置换算法,包括先进先出(FIFO)、最佳置换算法(OPT)、最久最近未使用算法(LRU)。 具体实现功能有: 1、建立相应的数据结构 2、在屏幕上显示页面...