⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 演示地址换算.cpp

📁 用C语言开发的操作系系统的地址换算演示,源代码
💻 CPP
字号:
#include <stdlib.h>  
#include <stdio.h>

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

typedef struct segtable //模拟段表的结构体
{
int segf[256];
int segl[256];
};

typedef struct segpagt
{
int segf[256];//分为256个段
int segl[256];//段长为256
int ptl[256];//页表数为256
int pt[256];//每页为256块
int pf[256];//页首地址数组
int pl;
};

void main()
{
	int code;
	int pl,pa,sn,sd,pd,pn;
    printf("=====================================\n");//主菜单
	printf("      操作系统课程设计第九题\n");
	printf("=====================================\n\n");
	do{
		printf("        1.分页式地址换算\n");
		printf("        2.分段式地址换算\n");
		printf("        3.段页式地址换算\n");
		printf("        4.退出\n\n");
		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);
			   SegPag(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++)//将256个0到512中的随机数存入数组
	{
	PT[i]=rand() %512;
	}

	P=A/L;//求页号,A/L取整
	d=A%L;//求页内地址,A%L求余

 if(P>256) 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 NULL;
 }
 }

//分段式地址换算
int Segment(int sn,int sd)
{
int i,wd;
segtable st;//定义段表ST
for(i=0;i<255;i++)//随机产生段首地址和段长度
{
st.segf[i]=rand()%255;
st.segl[i]=rand()%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+段内地址%d\n",st.segf[sn],sd); 
	wd=st.segf[sn]+sd;//计算物理地址
	printf("换算得到的物理地址为:%d\n\n",wd);
}
     return NULL;
}

//段页式地址换算
int SegPag(int sn,int pn,int pd)
{
int i,wd;
segpagt sp;
sp.pl=256;
for(i=0;i<255;i++)//随机模拟段页表
{
sp.pf[i]=sp.segf[i]=rand()%26624;
sp.ptl[i]=sp.segl[i]=rand()%512;
sp.pt[i]=rand()%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{
     wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;//计算物理地址
	 printf("通过段号%d找到页表首地址%d\n通过页号%d找到块号%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);
	 printf("物理地址为:%d\n\n",wd);
} 
   return NULL;
}

⌨️ 快捷键说明

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