【操作系统实验】页面置换算法FIFO LRU算法+作业

本文通过实例解析了FIFO和LRU两种页面置换算法的工作原理,包括缺页中断次数的计算和页面淘汰顺序的展示,有助于理解内存管理中的关键概念。

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

一.题目名称

假设进程 P 有 6 个页,分别为:1、2、3、4、5、6,已在内存中分配给该进程 4 个页面。

二.问题描述

  1. 自行设计进程 P 访问页的顺序,访问页的总数量不少于 16 个,编写程序输出缺页中断次数和页面淘汰顺序(输出形式参考实验文档)。
  2. 使用两种页面置换算法(不限定具体算法)分别实现第 1 项要求。

三.问题分析

页面访问顺序:1,2,3,4,3,1,6,4,3,5,4,1,3,6,1,2,3,4,5
重难点:
FIFO先进先出页面置换算法:当新页面与现有页面不匹配时,则淘汰第四行的页面,所有页面向下移动一行,新来的页面占据第1行。
LRU最久未使用页面调度算法:当要发生页面置换时,淘汰计数值最小的页面,淘汰后将其计数值置为0,每当访问新页面,将其计数值在现有计数值最大的基础上加1。

四.解决方案

三个页面LRU样例
#include <stdafx.h>
void max_value(int x, int cc[][2]); //函数声明,页表处理
int r_algorithm(int cc[][2]); //函数声明,选择页面淘汰算法
char cc[13]; //Y 表示产生缺页中断,N 表示未产生缺页中断
void page_table(int page1, int c[5][2]); //打印页表
void main( )
{
    
int i, j, page, row=0, col=1; //b[row]][col],行/列指针
int k=0; //记录缺页中断次数
int a[12]={
   4,3,2,1,4,3,5,4,3,2,1,5}; //存放页的调度顺序
int b[3][12]; //模拟内存(分配三个页面)
int c[5][2]={
   {
   1,0},{
   2,0},{
   3,0},{
   4,0},{
   5,0}}; //定义页表并赋初值
int d[13],p=0; //存放页面淘汰顺序,p 页面淘汰数组 d 的指针 
b[0][0]=0; //数组的初值不确定,0 表示页面为空
b[1][0]=0;
b[2][0]=0;
//*************************页面调度处理************************
for(i=0;i<12;i++)
{
    
if(a[i]==b[0][i]||a[i]==b[1][i]||a[i]==b[2][i])
{
    
b[0][i+1]=b[0][i]; //将前一列数据复制到下一列
b[1][i+1]=b[1][i];
b[2][i+1]=b[2][i];
max_value(a[i],c); //处理页表,a[i]页面是刚被访问的页面
page_table(a[i],c); //打印页表
cc[i]='F';
col++; //col 指向下一列
}
else //页面不在内存
{
   
if(row>2) //row>2 表示内存已没有空闲页面
{
    
page = r_algorithm(c); //返回淘汰的页面 page
d[p] = page; //d[]存放被淘汰的页面
p++;
k++; //缺页中断次数
b[0][i+1]=b[0][i]; //将前一列数据复制到下一列
b[1][i+1]=b[1][i];
b[2][i+1]=b[2][i];
cc[i]='Y';
if(b[0][i+1]==page) 
b[0][i+1]=a[i]; 
if(b[1][i+1]==page)
b[1][i+1]=a[i]; 
if(b[2][i+1]==page) 
b[2][i+1]=a[i]; 
max_value(a[i],c); //访问 a[i]页面, i 页面是刚被访问的页面
page_table(a[i],c); //打印页表
}
else
{
   
b[0][i+1]=b[0][i]; //将前一列数据复制到下一列
b[1][i+1]=b[1][i];
b[2][i+1]=b[2][i];
cc[i]='Y';
b[row][col]=a[i]; //a[i]页面进入内存
max_value(a[i],c); //访问 a[i]页面,i 页面是刚被访问的页面
col++;
k++; //缺页中断次数
row++;
page_table(a[i],c); //打印页表
}
}
} 
//======================显示处理结果=====================
printf("\n ");
for(i=0;i<12;i++)
printf("%6d",a[i]); //显示页面调度顺序
printf("\n =========================================\n");
for(j=0;j<13;j++)
printf("%6d",b[0][j]);
printf("\n ---------------------------------------------------------------------\n");
for(j=0;j<13;j++)
printf("%6d",b[1][j]);
 printf("\n ------------------------------------------
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值