一.题目名称
假设进程 P 有 6 个页,分别为:1、2、3、4、5、6,已在内存中分配给该进程 4 个页面。
二.问题描述
- 自行设计进程 P 访问页的顺序,访问页的总数量不少于 16 个,编写程序输出缺页中断次数和页面淘汰顺序(输出形式参考实验文档)。
- 使用两种页面置换算法(不限定具体算法)分别实现第 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 ------------------------------------------