⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagedivide.c

📁 这是一个基于C++的操作系统分页功能的模拟算法!虽然简单
💻 C
字号:
#include <stdio.h>
#include <string.h>
#define N 20


typedef struct
{
    int flag; /*标志页面是否在主存:0不在主存*/
    int AlterFlag;
    int MassNO;
}PMT;

typedef struct
{
    int PageNO;
    int offset;
}Page;

/****全局变量*****/
PMT pmtable[8];
Page Ptable[N];
int pagenum=0;
int masslong=100;
int kout=0;
int pagein[4];
char x=0;

/*******************函数声明*********************/
void displayPMT();
void intermit(int p,int i);
int judgepage(int i);
int CalAddress(int i,int j);
int BtoD(char a[]);
void input();
void pagedivide();
void execute(int p,int i);
/************************************************/

/*******************主函数***********************/
main()
{
    int j=0;            /* printf("asfdasfd");*/

    while(j<=7)            /*初始化PMT表,假定已有前4个页面进入主存*/
    {
        if(j<=3)
        {
            pmtable[j].flag=1;
            pmtable[j].MassNO=j+2;
            pagein[j]=j;
        }
        if(j>3)
        {
            pmtable[j].flag=0;
            pmtable[j].MassNO=0;
        }
        pmtable[j].AlterFlag=0;
        j++;
    }
    displayPMT();
    pagedivide();
}


/*******************函数定义**********************/
int judgepage(int i)
{
    if(pmtable[i].flag==0) return 0;
    else return 1;
}
int CalAddress(int i,int j)
{
    int address;
    address=pmtable[i].MassNO*100+Ptable[j].offset;
    return address;
}
int BtoD(char a[])
{
    int i=0,temp;
    temp=a[i]-'0';
    for(i=0;i<9;i++)
    {
        temp=temp*2+(a[i+1]-'0');
    }
    return temp;
}

void pagedivide()           /*分页请求存储管理*/
{
    char restruct[11];
    int temp;
    int i=0;


    /*加入一些输出初始PMT表的图*/
    printf("\n请输入指令序列:(结束请按*)\n");
    printf("输入格式:页号页内地址(十位二进制数0000000000-1100011111)\n");/*第一位为页号,后两位为页内地址*/
    while(1)
    {
        printf("第%d条指令码:",i+1);
        gets(restruct);
        if(restruct[0]=='*') break;
        temp=BtoD(restruct);
        printf("(对应十进制:%d)\n",temp);
        Ptable[i].PageNO=temp/100;Ptable[i].offset=temp%100;
        /*printf("\n%d,%d",Ptable[i].PageNO,Ptable[i].offset);*/
        i++;
    }
    pagenum=i;
    if(pagenum>0)
    for(i=0;i<pagenum;i++)
    {
        int p;
        p=Ptable[i].PageNO;
        printf("\n执行第%d条指令",i+1);
        if(judgepage(p))   execute(p,i);
        else
        {
            printf("\n请求的%d页面发生中断!",p);
            intermit(p,i);
        }
    }
}

void intermit(int p,int i)
{
    int j;
    j=pagein[kout];
    pagein[kout]=p;
    kout=(kout+1)%4;
    pmtable[j].flag=0;
    pmtable[p].flag=1;pmtable[p].MassNO=pmtable[j].MassNO;
    pmtable[j].MassNO=0;
    if(pmtable[j].AlterFlag==1)
    {
        printf("\n调出页面:%d;调入页面:%d",j,p);
        pmtable[j].AlterFlag=0;
    }
    else    printf("\n调入页面:%d",p);
    displayPMT();
    execute(p,i);
}
void input()
{
    char buffer[2],y;
    int i;
    for(i=0;i<=1&&(y=getchar())!=12;i++)
    buffer[i]=y;
    buffer[1]='\0';
    x=buffer[0];
}
void execute(int p,int i)
{
    int temp,j,t;

    char array[11];
    printf("\n该指令是否有修改数据?(Y/N):");
    input();
    if(x=='y'||x=='Y')
    { pmtable[p].AlterFlag=1;printf("***%d,%c**",pmtable[p].AlterFlag,x);}
    displayPMT();
    t=temp=CalAddress(p,i);
    for(j=9;j>=0;j--)
    {
        array[j]=temp%2+'0';
        temp=temp/2;
    }
    array[10]='\0';
    printf("\n第%d条指令执行完毕!(绝对地址:(%d)%s)\n\n",i+1,t,array);
}
void displayPMT()
{
    int i;
    printf("\n页号\t标志\t修改标志\t主存块号");
    for(i=0;i<8;i++)
    printf("\n %d \t %d \t   %d   \t\t    %d    ",i,pmtable[i].flag,pmtable[i].AlterFlag,pmtable[i].MassNO);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -