#include <stdio.h>
#include<stdlib.h> 
#include<iostream.h>                               
#define n 64 /*模拟实验中假定的页表长度*/
#define length 10

 struct
 {
  int lnumber;/*页号*/
  int flag; /*表示该页是否在主存,"1"表示在主存中,"0"表示不在*/
  int pnumber;/*该页所在主存块的块号*/
  int write; /*该页是否被修改过,"1"表示修改过,"0"表示没有修改过*/
  int dnumber;/*该页存放在磁盘上的位置,即磁盘块号*/
  int times;//被访问的次数
 }page[n]; /*页表定义*/

 int m; /*m为该作业在主存中的主存块块数*/
 int page_length;/*页表实际长度*/
 int p[length]; /*存放在主存中页的页号*/
 int head; /*主存中页号队列*/

 page_interrupt(int lnumber)
 {
     int j;
     printf("发生缺页中断* %d\n",lnumber);/*淘汰页*/
     j=p[head];
     p[head]=lnumber;
     head=(head+1)%m;
     if (page[j].write==1)
         printf("将页 %d写回磁盘第%d块\n",j,page[j].dnumber);
     page[j].flag=0;/* 第j页存在标志改为"0"*/
     page[lnumber].pnumber=page[j].pnumber;
     page[lnumber].flag=0;/* 第lnumber页存在标志改为"0"*/
     page[lnumber].write=1;/* 第lunmber页修改标志改为"1"*/
     printf("淘汰主存块%2d中的页%2d,从磁盘第%d块中调入页%2d\n", 
         page[j].pnumber,j,page[lnumber].dnumber,lnumber);
return lnumber; }/*缺页中断处理函数结束*/

 command(unsigned laddress,int write)
 {
     unsigned paddress,ad,pnumber,lnumber;
                        kk:
     /*取出逻辑地址laddress的页号lnumber(高6位)和页内地址ad*/
     lnumber=laddress>>10;
     ad=laddress&0x3ff;
     if(lnumber>=page_length)
     {
         printf("不存在该页\n");
         return 0;
     }
     if(page[lnumber].flag==1) /*页在主存*/
     {
         pnumber=page[lnumber].pnumber;/* 从页表中取得块号*/
         paddress=pnumber<<10|ad;/* 合并块号和块内地址形成物理地址paddress*/
         printf("逻辑地址是:%x 对应物理地址是:%x\n",laddress,paddress);
         if(write==1)/*如果需要写,修改页的修改标志位*/
             page[lnumber].write=1;
     }
     else
     {
         page_interrupt(lnumber);/*缺页中断*/
         goto kk;
     }
 }/*命令处理函数结束*/

void LRU(){
unsigned lnumber;
     
int i, temppage=0, times = 10000;    //最近最久未使用算法
for(i=0;i<n;i++) 

if(page[i].flag == 1) 

if(page[i].times<times) 

times = page[i].times; 
temppage = page[i].lnumber; 



cout<<"第"<<temppage<<"页将被替换!"<<endl; 
for(i=0;i<m;i++) 

if(p[i] == temppage) 

p[i] = lnumber; 


if(page[temppage].write == 1) 
{cout<<"第"<<temppage<<"页曾被修改过!"<<endl; 
page[temppage].flag = 0; 
page[lnumber].flag = 1; 
page[lnumber].write = 0; 
page[lnumber].pnumber = page[temppage].pnumber; 
page[temppage].pnumber = 10000; 
page[lnumber].times++; 
return; 

else 
{ cout<<"你输入有误,即将退出!"; 
exit(1); 

}

 void main( )
 {
     int lnumber,flag,pnumber,write,dnumber;
     unsigned laddress;
     int i;
     /*输入页表的信息,页号从0开始,依次编号,创建页表page*/
     printf("输入页表的信息,创建页表(若页号为-1,则结束输入))\n");
     printf("输入页号和辅存地址:");
     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;
         i++;
         printf("输入页号和辅存地址:");
         scanf("%d%d",&lnumber,&dnumber);
     }
     page_length=i;
     printf("输入主存块号,主存块数要小于%d,(以-1结束):",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-不需要,其他-结束程序运行)和逻辑地址:");
     scanf("%d%x",&write,&laddress);
     while(write==0||write==1)
     {
         command(laddress,write);/* 执行指令*/
         printf("输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:");
         scanf("%d%x",&write,&laddress);
     }
LRU();
 }/*main( )函数结束*/

[em10][em10]