zoukankan      html  css  js  c++  java
  • 页式存储管理部分功能模拟

    先进先出(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
    */
  • 相关阅读:
    JQuery之动画效果
    JS (随着鼠标的移动,旁边显示放大图)
    jQuery 事件和动画
    jQuery 概述
    CSS (层叠样式表)
    css的文章部分的基本语句
    HTML基本语法
    Web
    JavaScript预解析案例,JavaScript预解析题目
    JavaScript预解析 变量提升与函数提升
  • 原文地址:https://www.cnblogs.com/NoSoul/p/2557940.html
Copyright © 2011-2022 走看看