页式虚存地址和缺页中断(LRU的计数器算法)

本文介绍了一个简单的页面置换算法实现,通过模拟缺页中断处理过程,展示了如何选择被淘汰的页面及更新页表信息。该程序使用C++编写,通过用户输入初始化页表和主存状态,并根据逻辑地址访问请求进行页面调度。

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

#include"iostream.h"
#include"stdio.h"
#define n 64
#define length 10
//using namespace std;
struct{
 int lnumber;//页号
 int flag;//表示页是否在主存,“1”表示在,“0”表示不在
 int pnumber;//该页所在主存块的块号
 int write;
 int dnumber;
 int count;
}page[n];//页表定义
int m;
int page_length;
int p[length];
int head;
void page_interrupt(int lnumber)
{ int j,z=0;
printf("发生缺页中断*%/n",lnumber);
for(int x=0;x<page_length;x++)
if(page[x].flag==1)
if(page[x].count>z)
z=page[x].count;
for(int y=0;y<m;y++)
if(page[y].count==z)
j=y%3;
if(page[j].write==1)
printf("将%d页写回磁盘第%d块/n",j,page[j].dnumber);
page[j].flag=0;
page[lnumber].pnumber=page[j].pnumber;
page[j].count=0;
page[lnumber].flag=1;
page[lnumber].write=0;
printf("淘汰主存块%2d中的页%2d从磁盘第块中调入页%2d/n",page[j].pnumber,page[lnumber].dnumber,lnumber);
}
void command(unsigned laddress,int write){
 int paddress,ad,pnumber,lnumber;
kk:
 lnumber=laddress>>10;
 ad=laddress&0x3ff;
 if(lnumber>page_length)
 {
  printf("不存在该页/n");
  return;
 }
 if(page[lnumber].flag==1)//页在主存
 {
  cout<<"为被访问的内存块和累计次数是:"<<endl;
  for(int i=0;i<page_length;i++)
   if(page[i].flag==1)
    if(i==lnumber)
    {
     page[i].count=0;
     cout<<page[i].pnumber<<"  "<<page[i].count<<endl;
    }
    else
    {
     page[i].count=page[i].count+1;
     cout<<page[i].pnumber<<"  "<<page[i].count<<endl;
    }
    pnumber=page[lnumber].pnumber;
    paddress=pnumber<<10|ad;
    printf("逻辑地址是: %x     对应物理地址是:%x/n",laddress,paddress);
    if(write==1)
     page[lnumber].write=1;
    }
 else{
  page_interrupt(lnumber);
  goto kk;
 }
}
void main()
 {
  int lnumber,pnumber,write,dnumber;
  unsigned laddress;
  int i;
  printf("输入页表的信息,创建页表(若页号为-1,则结束输入)/n");
  printf("输入页号和辅存块号:/n");
  scanf("%d%d",&lnumber,&dnumber);
  i=0;
  while(lnumber!=-1)
  {
   page[i].lnumber=lnumber;
   page[i].flag=0;
   page[i].write=0;
   page[i].dnumber=dnumber;
   page[i].count=0;
   i++;
   printf("输入页号和辅存块号:/n");
   scanf("%d%d",&lnumber,&dnumber);
  }
  page_length=i;
  printf("输入主存块号,主存块数要小于%d,(以-1结束):/n",i);
  scanf("%d",&pnumber);
  m=0;
  head=0;
  while(pnumber!=-1)
  {
   if(m<i)
   {
    page[m].pnumber=pnumber;
    page[m].flag=1;
    p[m]=m;
    m++;
   }
   scanf("%d",&pnumber);
  }
  printf("输入指令性质(1-修改,0-不需要,其他-结束程序)和逻辑地址:/n");
  scanf("%d%x",&write,&laddress);
  while(write==0||write==1)
  {
   command(laddress,write);
   printf("输入指令性质(1-修改,0-不需要,其他-结束程序)和逻辑地址:/n");
   scanf("%d%x",&write,&laddress);
  }
 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值