📄 pagedivide.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 + -