页式存储管理部分功能模拟

先进先出(FIFO)淘汰算法

#include <stdio.h>

/*页表长度,实际上是由系统按照作业的长度决定的*/
#define N 64
#define LENGTH 10

typedef struct
{
    int lnumber;/*页号*/
    int flag;/*是否在主存中,1表示在,0表示不在*/
    int pnumber;/*所在主存块的块号*/
    int write;/*是否修改过,1表示修改过,0表示没修改过*/
    int dnumber;/*磁盘块号*/
} Page;
/*页表定义*/
Page page[N];
int m;
int page_length;
int p[LENGTH];
int head;

void 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;
    page[lnumber].flag=1;
    page[lnumber].write=0;
    page[lnumber].pnumber=page[j].pnumber;
    printf("淘汰主存块%2d中的页%2d,从磁盘第%d块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);
    return;
}

void Command(unsigned laddress,int write)
{
    unsigned paddress,ad,pnumber,lnumber;
kk:
    lnumber=laddress>>10;
    ad=laddress&0x03ff;
    if(lnumber>=page_length)
    {
        printf("\t输出:不存在该页\n");
        Page_interrupt(lnumber);
    }
    if(page[lnumber].flag==1)
    {
        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;
    }
    return;
}

int main()
{
    //freopen("IO","r",stdin);
    int lnumber,pnumber,write,dnumber;
    unsigned laddress;
    int i=0;
    printf("输入页表的信息,创建页表(若页号为-1,则结束输入)\n");
    printf("输入页号和辅存地址:\n");
    scanf("%d",&lnumber);
    while(lnumber!=-1)
    {
        scanf("%d",&dnumber);
        page[i].lnumber=lnumber;
        page[i].flag=page[i].write=0;
        page[i++].dnumber=dnumber;
        printf("输入页号和辅存地址:\n");
        scanf("%d",&lnumber);
    }
    page_length=i;
    printf("输入主存块号,主存块数要不大于%d,(以-1结束):\n",i);
    scanf("%d",&pnumber);
    m=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);
    }
    printf("程序结束,按任意键返回!\n");
    return 0;
}
/*
IO:
2 7
4 9
8 8
3 5
-1
6 8 5 3 -1
0 78
1 64
0 785
1 abc
0 1000
1 1acb
0 1453
1 2010
2
*/
原文地址:https://www.cnblogs.com/NoSoul/p/2557940.html