📄 虚拟存储器管理.c
字号:
#include "stdio.h"
struct Page_Table
{
int Page_ID;
int Page_Flag;
int MainBlock_ID;
int Modify;
int Out_Address;
}Page_Table[8]={
{0,1,5,1,011},
{1,1,8,1,012},
{2,1,9,0,013},
{3,1,10,0,015},
{4,0,NULL,NULL,017},
{5,0,NULL,NULL,025},
{6,0,NULL,NULL,212},
{7,0,NULL,NULL,213},
};
int main()
{
int P[4]={0,1,2,3};
int i;
int L,offset;
int K=0;
int J;
int choice1,choice2,choice3;
int absolute_address;
while(1)
{
printf("输入页号:\n");
scanf("%d",&L);
printf("输入偏移量:\n");
scanf("%d",&offset);
start:
if(Page_Table[L].Page_Flag==1)
{
absolute_address=Page_Table[L].MainBlock_ID*64+offset;
printf("绝对地址:%d\n",absolute_address);
printf("保存指令?(y/n)\n");
getchar();
scanf("%c",&choice1);
if(choice1=='y')
Page_Table[L]. Modify=1;
getchar();
printf("还有后继指令?(y/n)\n");
scanf("%c",&choice2);
if(choice2=='y')
continue;
else
return 0;
}
else
{
printf("该页不在主存,产生缺页中断!\n");
printf("该页修改过吗?( 即修改标志Modify是否为1)\n");
J=P[K];
if(Page_Table[J]. Modify==1)
{
P[K]=L;
K=(K+1)%4;
printf("调页%d到磁盘\n",J);
}
printf("调进页%d\n",L);
Page_Table[L].Page_Flag=1;
Page_Table[L].MainBlock_ID=Page_Table[J].MainBlock_ID;
Page_Table[J].Page_Flag=0;
Page_Table[J].MainBlock_ID=NULL;
goto start;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -