目的
1、熟练掌握分页式管理基本原理,并在实验过程中体现内存空间的分配与
回收、地址转换过程。
2、 掌握利用“位示图”管理内存与置换空间的分配与回收。
3、 掌握基本的位运算。
4、 掌握请求分页式存储管理基本原理,并在实验过程中体现内存与置换空
间的分配与回收、地址转换以及缺页处理过程。
实现分页式存储管理内存分配和地址转换过
程。进一步实现请求分页式存储管理过程,包括内存和置换空间管理、地址转换
以及缺页处理,能够体现 FIFO 和 LRU 算法思想。
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define BLOCK_SiZE 1//块的大小
#define MEN_SIZE 64//内存大小
typedef struct Page
{
int kuai;//快号
int state;//状态
}P;
P p[10],p1[10];//页表
int n,m;
int c;//内存c*c
int b[10][10],b1[10][10];//位视图
float que = 0,que1 = 0;//缺页次数
float counts = 0,counts1 = 0;//总次数
int a[3] = {-1,-1,-1};//块表
int a1[3] = {-1,-1,-1};//块表1
void byteshow(int c)
{
int count = 0;
srand((unsigned)time(NULL));
for(int i = 0;i<c;i++)
{
for(int j = 0;j<c;j++)
{
b[i][j] = b1[i][j]=rand()%2;
if(b[i][j]==0)
{
count++;
}
if(count>3)
{
b[i][j] = b1[i][j]= 1;
}
printf("%d ",b[i][j]);
}
printf("\n");
}
}
int findNULL()
{
for(int i = 0;i<c;i++)
{
for(int j = 0;j<c;j++)
{
if(b[i][j] == 0)
{
//printf("%d ",i*m+j);
return i*c+j;
}
}
}
return -1;
}
int findNULL1()
{
for(int i = 0;i<c;i++)
{
for(int j = 0;j<c;j++)
{
if(b1[i][j] == 0)
{
//printf("%d ",i*m+j);
return i*c+j;
}
}
}
return -1;
}
void updatekuai(int yeNum)
{
for(int i = 2;i>=0;i--)
{
if(a[i]==-1)
{
a[i]=yeNum;
break;
}
}
}
void updatekuai1(int yeNum)
{
for(int i = 2;i>=0;i--)
{
if(a1[i]==-1)
{
a1[i]=yeNum;
break;
}
}
}
void showKuai()
{
printf("*******FIFO******* *******LRU*******\n");
printf("块表: 块表:\n");
for(int i = 0;i<3;i++)
{
printf("[%2d] [%2d]\n",a[i],a1[i]);
}
}
void showYe()
{
printf("*******FIFO******* *******LRU*******\n");
printf("页表 页表\n");
for(int i = 0;i<n;i++)
{
printf("%2d %2d %2d %2d %2d %2d\n",i,p[i].kuai,p[i].state,i,p1[i].kuai,p1[i].state);
}
}
void zhihuan(int yeNum)
{
p[yeNum].state = 1;//更新页表
p[yeNum].kuai = p[a[2]].kuai;
p[a[2]].state = -1;
p[a[2]].kuai = -1;
a[2] = a[1];//更新块表
a[1] = a[0];
a[0] = yeNum;
}
void zhihuan1(int yeNum)
{
p1[yeNum].state = 1;//更新页表
p1[yeNum].kuai = p[a1[2]].kuai;
p1[a1[2]].state = -1;
p1[a1[2]].kuai = -1;
a1[2] = a1[1];//更新块表
a1[1] = a1[0];
a1[0] = yeNum;
}
void LRU(int yeNum)
{
if(a1[0]==yeNum)
{
}
if(a1[1]==yeNum)
{
a1[1] = a1[0];
a1[0] = yeNum;
}
if(a1[2]==yeNum)
{
a1[2] = a1[1];
a1[1] = a1[0];
a1[0] = yeNum;
}
}
int main()
{
int flag = 1;
int len;
printf("请输入页长 剩余块的数目 块的大小(kb)\n");
scanf(" %d %d %d",&n,&m,&len);
for(int i = 0;i<n;i++)//初始化页表
{
p[i].state = -1;
p1[i].state = -1;
p[i].kuai = -1;
p1[i].kuai = -1;
}
c = sqrt(MEN_SIZE/BLOCK_SiZE);
byteshow(c);
while(flag)
{
int luo;//逻辑地址
int wuli,wuli1;//物理地址
int yeNum;//页号
int inyeNum;//页内地址
int k,k1;
printf("请输入逻辑地址\n");
scanf(" %d",&luo);
if(luo == -1)
{
flag = 0;
}
yeNum = luo/(BLOCK_SiZE*1024);
inyeNum = luo%(BLOCK_SiZE*1024);
if(yeNum>=n)
{
printf("逻辑地址越界\n");
}else
{
if(p[yeNum].state == -1)//p 缺页
{
counts++;
que++;
k = findNULL();//查找空闲块
if(k!=-1)
{
p[yeNum].kuai = k;//更新页表
p[yeNum].state = 1;
b[k/c][k%c] = 1;
updatekuai(yeNum);//更新块表
wuli = k*1024+inyeNum;
}else
{
wuli = p[a[2]].kuai*1024+inyeNum;
zhihuan(yeNum);
}
}
else//命中
{
counts++;
wuli = p[yeNum].kuai*1024+inyeNum;
}
if(p1[yeNum].state == -1)//p1[]缺页
{
counts1++;
que1++;
k1 = findNULL1();//查找空闲块
if(k!=-1)
{
p1[yeNum].kuai = k1;//更新页表
p1[yeNum].state = 1;
b1[k1/c][k1%c] = 1;
updatekuai1(yeNum);//更新块表
wuli1 = k*1024+inyeNum;
}else
{
wuli1 = p1[a1[2]].kuai*1024+inyeNum;
zhihuan1(yeNum);
}
}
else//命中
{
counts1++;
//2.LRU
LRU(yeNum);
wuli1 = p1[a1[0]].kuai*1024+inyeNum;
}
showYe();
showKuai();
printf("物理地址为: %d 物理地址为: %d\n",wuli,wuli1);
printf("访问次数%.lf 访问次数%.lf\n",counts,counts1);
printf("缺页次数%.lf 缺页次数%.lf\n",que,que1);
printf("缺页率%.2lf% 缺页率%.2lf%\n\n\n",(que/counts)*100,((que1/counts1)*100));
}
}
return 0;
}
图 2-3 位示图实现截图