📄 段页式1.cpp
字号:
// 段页式1.cpp : Defines the entry point for the console application.
//
// 段页.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
void pvisit();
void neicun();
void insertprogram();
void dch();
void dct();
int pro=0;
struct duantable1
{ int daddress;
int dstate;
int visit;
int dlenght;
int pdaddress;
};
struct duantable3
{
struct duantable1 duantable2[1000];
};
struct duantable3 duanstor[100];
struct storage
{
int styple;
int a[10];
int size;
int restsize;
};
struct storage stor[10000];
struct program
{
int paddress;
int length;
};
struct program programnum[100];
struct ppages
{ int paddress;
int pstate;
int pused;
int spage;
};
struct ppduans
{
struct ppages ppage1[10];
};
struct pagetables
{ struct ppduans pduan1[256];
};
struct pagetables pages[100];
int main(int argc, char* argv[])
{
int choice,i,j;
for(i=0;i<10000;i++)
{ stor[i].restsize=10;
stor[i].size=0;
stor[i].styple=0;
for(j=0;j<10;j++)
stor[i].a[j]=0;
}
for(i=0;i<100;i++)
{programnum[i].length=0;
programnum[i].paddress=0;
}
for(i=0;i<100;i++)
for(j=0;j<1000;j++)
{
duanstor[i].duantable2[j].daddress=0;
duanstor[i].duantable2[j].dlenght=0;
duanstor[i].duantable2[j].dstate=0;
duanstor[i].duantable2[j].pdaddress=0;
duanstor[i].duantable2[j].visit=0;
}
do
{printf(" ***************************段页式内存管理***************************\n");
printf(" 1:添加新的程序! 2:查询当前的内存使用情况!\n");
printf(" 3:查询当前的段表基址寄存器使用情况!\n");
printf(" 4:查询当前段表的使用情况!\n");
printf(" 5:对某道程序进行访问! 0:退出!\n");
printf("请选择操作:");
scanf("%d",&choice);
switch(choice)
{case 1:
insertprogram();
break;
case 2:
neicun();
break;
case 3:
dct();
break;
case 4:
dch();
break;
case 5:
pvisit();
break;
case 0:
printf("退出出操作!\n");
break;
default :printf("\n非法输入操作类型!请确认!\n");
}
}while(choice!=0);
return 0;
}
void insertprogram()
{ int i,j,flag,flag1,k,h,st,big,sum,st1,p,k1;
int psize,duancount,psize1;
st=0;
sum=0;
printf("Please insert the size of program:");
scanf("%d",&psize);
printf("\n");
psize1=psize;
duancount=psize/100;///////////////////计算段数
if(psize%100!=0)
duancount=duancount+1;
programnum[pro].length=duancount;
/////////////////////存放段///////////////////////////////
flag1=0;flag=0;
for(i=0,flag=0;i<10000;i++) //////////////查找足够的空间或最大的//////////
{
for(j=i;;j++)
if(stor[j].restsize==10)
{
flag=flag+10;
if(flag>=duancount)
break;
}
else
break;
if(flag>=duancount)
{ flag1=flag;st=i;st1=j;break;}
if(flag1<flag)
{flag1=flag;st=i;st1=j;}
flag=0;
i=j;
}
programnum[pro].paddress=st;
//////////////////////// 存储各个段/////////////////
/////////////////////////对于足空间的段的存储//////////////
if(flag1>10)
for(i=st;i<=st1;i++,st++)
{
for(j=0,k=0;j<10;j++)
{
stor[i].a[j]=1;
duancount--;
duanstor[pro].duantable2[k].daddress=st;
if(duancount==0&&(psize%100)!=0)
{ big=( psize%100)/10;
if((( psize%100)%10)!=0)
big++;
duanstor[pro].duantable2[k].dlenght=big;
}
else
duanstor[pro].duantable2[k].dlenght=10;
duanstor[pro].duantable2[k].dstate=1;
duanstor[pro].duantable2[k].pdaddress=0;
duanstor[pro].duantable2[k].visit=0;
k++;
if(duancount==0)
break;
}
if(j!=10)
j++;
stor[i].size=j;
stor[i].restsize=10-j;
stor[i].styple=1;
if(duancount==0)
break;
}
else
{
for(j=0,k=0;j<10;j++)
{
stor[st].a[j]=1;
duancount--;
duanstor[pro].duantable2[k].daddress=st;
if(duancount==0&&(psize%100)!=0)
{ big=( psize%100)/10;
if((( psize%100)%10)!=0)
big++;
duanstor[pro].duantable2[k].dlenght=big;
}
else
duanstor[pro].duantable2[k].dlenght=10;
duanstor[pro].duantable2[k].dstate=1;
duanstor[pro].duantable2[k].pdaddress=0;
duanstor[pro].duantable2[k].visit=0;
k++;
if(duancount==0)
break;
}
stor[st].size=j+1;
stor[st].restsize=10-j-1;
stor[st].styple=1;
}
///////////////////cha ru ye biao /////////////////////////
k=psize/10;
if(psize%10!=0)
k++;
k1=k;
for(i=0,p=0,flag=0,sum=0,h=0;i<10000&&k!=0;i++,k1=k)
if(stor[i].styple==0)
if(k<10)
{for(j=0;j<k1;j++)
{ sum++;
pages[pro].pduan1[p].ppage1[j].paddress=i+j;
pages[pro].pduan1[p].ppage1[j].pstate=1;
pages[pro].pduan1[p].ppage1[j].pused=0;
k--;
stor[i].a[h]=1;
h++;
}
stor[i].size=j;
stor[i].restsize=10-j;
stor[i].styple=2;
}
else
{
for(j=0;j<10;j++)
{ sum++;
pages[pro].pduan1[p].ppage1[j].paddress=i+j;
pages[pro].pduan1[p].ppage1[j].pstate=1;
pages[pro].pduan1[p].ppage1[j].pused=0;
k--;
stor[i].a[h]=1;
h++;
}
stor[i].size=10;
stor[i].restsize=0;
stor[i].styple=2;
}
/////////////////////shi ye////////////////////////////
sum=psize/10;
for(i=0,k=0,p=0;i<10000&&sum!=0;i++)
{ if(stor[i].restsize==10)
{
pages[pro].pduan1[k].ppage1[p].pused=1;
pages[pro].pduan1[k].ppage1[p].spage=i;
stor[i].size=10;
stor[i].restsize=0;
stor[i].styple=3;
sum--;
if(p==9)
{
k++;p=0;
}
p++;
}
}
if(psize%10!=0)
{
for( ;i<10000;i++)
if(stor[i].restsize==10)
{
pages[pro].pduan1[k].ppage1[p].pused=1;
pages[pro].pduan1[k].ppage1[p].spage=i;
stor[i].size=psize%10;
stor[i].restsize=10-psize%10;
stor[i].styple=3;
break;
}
}
////////////////////////////////////////////////////////
pro++;
}
void neicun()
{int i;
printf("类型 已用内存 剩余内存\n");
for(i=0;i<10000;i++)
{
if(stor[i].styple!=0)
printf("%d %d %d \n",stor[i].styple ,stor[i].size , stor[i].restsize);
}
}
void dch()
{ int i;
int p;
printf("请输入要查询的程序号:");
scanf("%d",&p);
if(p>pro)
{ printf("内存中无此程序号!\n");return;}
printf("段地址 段表长度 段表是否装入\n");
for(i=0;i<10000;i++)
if(duanstor[p].duantable2[i].dlenght!=0)
printf("%d %d %d\n ",duanstor[p].duantable2[i].daddress,duanstor[p].duantable2[i].dlenght,duanstor[p].duantable2[i].dstate);
}
void dct()
{int i;
printf("程序号 段的首地址 段长度\n");
for(i=0;i<100;i++)
if(programnum[i].length!=0)
printf("%d %d %d\n",i,programnum[i].paddress,programnum[i].length);
}
void pvisit()
{ int use,dnum,pnum,position, saddress;
printf("请输入用户标志!段号!叶号!叶内位移!\n");
scanf("%d%d%d%d",&use,&dnum,&pnum,&position);
if(use>pro)
{ printf("内存中没有此相关的的用户!出现调入新的程序!\n");return;}
if(dnum>programnum[use].length)
{ printf("发生缺段!\n");return;}
if(pages[use].pduan1[dnum].ppage1[pnum].pused==0)
{ printf("发生缺叶中断!\n");return;}
if(position>10)
{ printf("发生越界错误!\n");return;}
else
{ printf("%d\n",pages[use].pduan1[dnum].ppage1[pnum].paddress);
saddress=pages[use].pduan1[dnum].ppage1[pnum].spage*10+position;
printf("该逻辑地址映象到的物理地址为:%d\n",saddress);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -