虚拟存储器-操作系统课程设计报告
// int.cpp : 定义控制台应用程序的入口点。
//
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define block_length 128
#define page_length 7
#define length 4 //加载的物理块个数
int pages[4]={0,1,2,3}; //该数组保存物理块对应的页号
int k;// 该数组的队列标记
struct pagetable{
int pagenum; //页号
int flag; //页标志,1表示存在主寸中,0表示在外存
int blocknum; //块号
int flag_modify; //修改标志
int local_disk; //磁盘位置
}pt[7]={{0,1,5,0,011},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6,0,-1,0,121}};
//显示页的信息
void display1()
{ int i;
printf("-------------------------------------------------------------------------------\n");
printf("页号\t\t标志\t\t主存块号\t\t修改标志\t磁盘位置\n");
for(i=0;i<page_length;i++)
{
printf(" %d\t\t%d\t\t%d\t\t\t%d\t\t %d\n",pt[i].pagenum,pt[i].flag,pt[i].blocknum,pt[i].flag_modify,pt[i].local_disk);
}
printf("-------------------------------------------------------------------------------\n");
}
//显示页的信息
void display()
{ int i;
printf("-------------------------------------------------------\n");
printf("页号\t\t标志\t\t主存块号\t磁盘位置\n");
for(i=0;i<page_length;i++)
{
printf(" %d\t\t%d\t\t%d\t\t%d\t\n",pt[i].pagenum,pt[i].flag,pt[i].blocknum,pt[i].local_disk);
}
printf("--------------------------------------------------------\n");
}
//地址转换及产生缺页中断
void dizhibianhuan()
{ int p,q;
int stop=0;
char r;
do{
printf("请输入要进行变换的页号和单元号\n\n");
loop: scanf("%d %d",&p,&q);
getchar();
if(p>6||q>127)
{
if(p>6)
printf("该页不存在,页号范围0-6,请重新输入页号与单元号\n");
else
printf("越界,单元号范围0-127,请重新输入页号与单元号\n");
goto loop; //转到LOOP重新输入
}
else
{
if(pt[p].flag==1)
{
printf("\n该页号和单元号的详细信息如下:\n");
getchar();
printf("页号\t\t标志\t\t主存块号\t磁盘位置\n");
printf(" %d\t\t%d\t\t%d\t\t%d\t\n",pt[p].pagenum,pt[p].flag,pt[p].blocknum,pt[p].local_disk);
printf("\n绝对地址为:\n");
getchar();
printf("%d\n",pt[p].blocknum*block_length+q); //输出绝对地址
}
else
{ printf("页号为 %d不在主存中,产生缺页中断\n\n",p); //产生缺页中断
}
}
printf("\n是否继续下一条指令,是则输入Y,否则输入N \n");
scanf("%c",&r);
if(r=='N')
stop=1; //是否停止继续下一条指令,stop为一停止,否则继续
}while(!stop);
}
//先进先出处理缺页中断
void FIFO()
{ int p,q,i;
int stop=0;
char r;
int k=0,m=0;;
do
{
printf("请输入要进行变换的页号和单元号\n\n");
loop1: scanf("%d %d",&p,&q);
getchar();
if(p>6||q>127)
{
if(p>6)
printf("该页不存在,页号范围0-6,请重新输入页号与单元号\n");
else
printf("越界,单元号范围0-127,请重新输入页号与单元号\n");
goto loop1;
}
if(pt[p].flag==1)
{
loop: printf("\n该页的详细信息如下:\n\n");
getchar();
printf("页号\t\t标志\t\t主存块号\t修改标志\t磁盘位置\n\n");
printf(" %d\t\t%d\t\t%d\t\t%d\t\t %d\n",pt[p].pagenum,pt[p].flag,pt[p].blocknum,pt[p].flag_modify,pt[p].local_disk);
printf("\n绝对地址为:\n");
getchar();
printf("%d\n\n",pt[p].blocknum*block_length+q);
printf("指令是否是存,是则输入Y,否则输入N\n");
scanf("%c",&r);
if(r=='Y')
{
pt[p].flag_modify=1;478