play.c

来自「编程演示三种存储管理方式的地址换算过程 1)分页方式的地址换算 2)分段方式」· C语言 代码 · 共 145 行

C
145
字号
#include <stdlib.h>  
#include <stdio.h>

int page(int A,int L );
int Segment(int sn,int sl);
int SegPagt(int sn,int pn,int pd);

typedef struct segtable 
{
int segf[256];
int segl[256];
}segtable;
struct segtable st;


typedef struct segpagt
{
int segf[256];
int segl[256];
int ptl[256];
int pt[256];
int pf[256];
int pl;
}segpagt;
struct segpagt sp;

int main()
{
 int code;
 int pl,pa,sn,sd,pd,pn;
 do{
  printf("-------------------地址换算过程-------------------------\n\n");
  printf("	1.分页方式地址换算\n");
  printf("	2.分段方式地址换算\n");
  printf("	3.段页式地址换算\n");
  printf("	4.结束运行\n\n");
 printf("----------------------------------------------------------\n");
 printf("请输入您的选择:");
 
  scanf("%d",&code);
  switch(code)
  {
  case 1:{
   printf("注意:请演示设定页表长度小于256\n");
   printf("请输入换算的逻辑地址:\n");
   scanf("%d",&pa);
   printf("页面大小(B):\n");
   scanf("%d",&pl);
      page(pa,pl);
      }break;
  case 2:{
   printf("请演示设定段表长度小于256\n");
   printf("请输入逻辑地址的段号:\n");
   scanf("%d",&sn);
   printf("段内地址:\n");
   scanf("%d",&sd);
   Segment(sn,sd);
       }break;
  case 3:{
      
      printf("预设定段表长为256,页面大小为256\n");
      printf("请输入逻辑地址的段号:\n");
      scanf("%d",&sn);
      printf("页号:\n");
      scanf("%d",&pn);
      printf("页内地址:\n");
      scanf("%d",&pd);
      SegPagt(sn,pn,pd);
      }break;
  case 4:{}break;
  }
 }while (code<4);
}

int page(int A,int L)
{
 int d,P,kd,i;
 int WD;
 int PT[256];
 for(i=1;i<256;i++)
 {
 PT[i]=rand() %512;/* 定义随机产生的快号在1到512之间 */
 }

 P=A/L;/* 页号=逻辑地址/页面大小 */
 d=A%L;/* 页内地址=逻辑地址%页面大小 */

 if(P>L) printf("页号大于页表长度,越界中断\n\n");
 else {
    printf("页号=逻辑地址/页面大小=%d,页内地址=逻辑地址%页面大小=%d\n",P,d);
    kd=PT[P];
    printf("根据页号%d得到块号%d\n",P,kd);
    WD=kd*L+d;/* 计算物理地址的公式 */
    printf("物理地址=块号%d*页面大小%d+页内地址%d\n",kd,L,d);
    printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);
    return (0);
 }
 }



int Segment(int sn,int sd)
{
int i,wd;

for(i=0;i<255;i++)
{
st.segf[i]=rand()%255;/* 定义随机产生段首地址为1到255之间 */
st.segl[i]=rand()%2048;/* 定义随机产生段长度为1到2048之间 */
}
if(sn>256) printf("段号%d大于段表长度256,越界中断\n\n",sn);
else if(sd>st.segl[sn]) printf("段内地址%d大于段长度%d,越界中断\n",sd,st.segl[sn]);
else{
    printf("根据段号找到段首地址%d\n",st.segf[sn]);
    printf("物理地址=段首地址%d+段内地址%d\n",st.segf[sn],sd); 
    wd=st.segf[sn]+sd;
    printf("换算得到的物理地址为:%d\n\n",wd);
}
     return (0);
}


int SegPagt(int sn,int pn,int pd)
{
int i,wd;

sp.pl=256;
for(i=0;i<255;i++)
{
sp.pf[i]=sp.segf[i]=rand()%26624;/* 定义随机产生的数在1到26624之间 */
sp.ptl[i]=sp.segl[i]=rand()%512;/* 定义随机产生的数在1到512之间 */
sp.pt[i]=rand()%256;/* 定义随机产生的数在1到256之间 */
}
if(sn>256) printf("段号%d大于段表长度256,越界中断\n\n",sn);
else if(pn>sp.ptl[pn]) printf("页号%d大于页表长度%d,越界中断\n",pn,sp.ptl[pn]);
else if(pd>sp.pl) printf("页内地址%d大于页面长度%d,中断\n",pd,sp.pl);
else{
  
  printf("通过段号%d找到页表首地址%d\n通过页号%d找到块号%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);
  printf("物理地址=页表首地址%d+快号%d*页面长度%d+页内地址%d\n",sp.pf[sn],sp.pt[pn],sp.pl,pd);
  wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;
  printf("物理地址为:%d\n\n",wd);
}return (0);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?