虚拟存储器管理.c

来自「操作系统课程的虚拟存储的模拟。简单版。很好用」· C语言 代码 · 共 75 行

C
75
字号
#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 + =
减小字号Ctrl + -
显示快捷键?