操作系统地址变换(十进制)

操作系统地址变换(十进制)

设计程序,实现地址变换功能。具体要求如下:
1、数据结构的设计:地址变换,包括了分页和分段两种方式,分页方式的基本数据结构为页表(由页号和块号组成),分段方式的基本数据结构为段表 (由段号,段基址和段长组成)。
2、具体功能需求:
(1)地址变换方式选择功能,如:
请输入要选择的地址变化方式:(0-分页;1-分段)
(2)数据初始化:
分页方式需初始化的数据为每页大小和页表,如:
请输入每页大小:(0-1K;1-2K;2-4K;3-随机选择)
随机选择在1K,2K,4K之间随机选择一个作为页面大小。
请输入页表项个数:(5到10之间整数,含端点)
请输入页表中每页对应的块号:(0-手动输入;1-随机生成0至10之间的非重复整数作为块号)
如选择手动输入,则从第0号页面开始输入相应块号,需要有判断功能,块号不能重复,如有重复,提示用户重新输入,如:
您输入的块号有误,与第*号页面输入的块号重复,请重新输入第&&号页面对应的块号!
如选择随机输入,需要有相应算法确保生成的块号不重复;

分段方式需初始化的数据为段表,如:
请输入段表项个数:(5到10之间整数,含端点)
请输入页表中每段对应的基址和段长:(0-手动输入;1-随机生成)
基址从1K至100K,K的整数倍随机生成或手动输入,不得重复;
段长从1K,2K,4K,8K中随机生成或手动输入。
需通过算法确保随机生成或用户输入的数据,不存在冲突(冲突原因是有两段或多段的地址重叠)
如选择手动输入,则从0号分段开始输入相应的基址和段长,如有冲突,需提示用户重新输入,如:
您输入的数据有误,与第号分段(基址**,段长**)冲突,请重新输入第&&号分段对应的基址和段长!
(3)数据输入完毕后,输出初始化的数据,并要求用户输入逻辑地址,如
您选择了分页方式,输入的数据如下:
每页大小*********K,页表为
页号 块号
0 1
1 2
请开始你的表演(输入逻辑地址)

您选择了分段方式,输入的数据如下:
段号 基址 段长
0 2K 4K
请开始你的表演(输入逻辑地址)
(4)地址变换功能
用户输入逻辑地址后,应首先判断该数据是否超出了页表/段表的地址范围,如超出,请用户重新输入,如:
您输入的地址已溢出,请重新输入!
用户输入正确的逻辑地址后,通过相应算法计算其物理地址,输出:
您选择了分页方式,输入的逻辑地址为***,其对应的页号为***,页偏移为***;
该地址对应的块号为***,块偏移为***,物理地址为。

您选择了分段方式,输入的逻辑地址为***,其对应的段号为***,段偏移为***;
该段对应的基址为***,段偏移为***,物理地址为。

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<ctime>
#include<algorithm>
#define k 1024;
using namespace std;
static int logical=0,physical=0;//逻辑地址 ,物理地址
static int page;//页偏移 
static int para;//段偏移 
void Page(){
	cout<<"----------欢迎使用分页方式----------\n";
	cout<<"请输入每页大小:(0-1K;1-2K;2-4K;3-随机选择)\n";
	int pagesize=0;	//页面大小 
	int count=0;
	cin>>count;
	if(count==0||count==1||count==2){
	pagesize=pow(2,count)*k;
	}
    else{
    srand((unsigned)time(NULL));
    int j=0+(int)(2* rand()/(RAND_MAX+1));
    pagesize=pow(2,j)*k;
	}
	int pagesize1=pagesize/k;
        cout<<"每页大小为:"<<pagesize1<<"K\t";
		int bar[10];//定义块号 
		int num=0;
		cout<<"请输入页表项个数:(5到10之间整数,含端点)\n";
		cin>>num;
		cout<<"请输入页表中每页对应的块号:(0-手动输入(0至10之间的非重复整数);1-随机生成0至10之间的非重复整数作为块号)\n";
		int a=0;
		cin>>a;
	
		if(a==0){
		cout<<"请输入块号:\n";
		for(int i=0;i<num;i++){
			cin>>bar[i];
			}
			for(int i=0;i<num;i++){
				for(int j=0;j<num;j++){
					if(bar[i]==bar[j]&&i!=j){
				cout<<"您输入的块号有误,与第"<<i<<"号页面输入的块号重复,请重新输入第"<<j<<"号页面对应的块号!\n";//每个十年脑血栓不会一直重复的吧!!! 
			    cin>>bar[j];
			}
				}
			}
		}
		if(a==1){
			vector<int> l;
			vector<int>::iterator it;//迭代器
		    srand((unsigned)time(NULL));
			for(int i=0;i<11;i++){
				l.push_back(i);//产生不重复的随机数 
			} 	
			random_shuffle(l.begin(),l.end());
			int a=0;
			it=l.begin();
			while(a<num) {
			bar[a]=*it;
			cout<<"块号为:"<<*it<<"  "<<"\n";
			a++;
			it++;
		}	
		}	
	    	cout<<"您选择了分页方式,输入的数据如下:\n";
	    	cout<<"每页大小为:"<<pagesize1<<"K";
	    	cout<<"页表为 :\n"<<"页号\t"<<"块号\t\n";
	    	for(int i=0;i<num;i++){
	    		cout<<i<<"\t"<<bar[i]<<endl;
			}
			cout<<"请开始你的表演(输入逻辑地址):";
			cin>>logical;
			while(logical-num*pagesize>0){
				cout<<"您输入的地址已溢出,请重新输入!\n";
				cin>>logical;
			}
			page=logical%pagesize;//页偏移,即块偏移
			int yehao=logical/pagesize;
			physical=bar[yehao]*pagesize+page;
			cout<<"您选择了分页方式,输入的逻辑地址为"<<logical<<",其对应的页号为"<<yehao<<",页偏移为"<<page<<",\n该地址对应的块号为"<<bar[yehao]<<",块偏移为"<<page<<",物理地址为"<<physical<<endl;    
	    	
	    	
	
}
void Paragragh(){
	cout<<"----------欢迎使用分段方式----------\n";
	cout<<"请输入段表项个数:(5到10之间整数,含端点)\n";
	int num;//段表项个数
	int address[10];//基址
	int paralength[10];//段长 
	cin>>num;
	cout<<"请输入页表中每段对应的基址和段长:(0-手动输入;1-随机生成)\n";
	int a=0;
	cin>>a;
	if(a==0){
		cout<<"请输入基址:基址从1K至100K,手动输入K的整数倍,不得重复;\n"; 
		for(int i=0;i<num;i++){
			cin>>address[i];
		}
		cout<<"请输入段长: 段长从1K,2K,4K,8K中手动输入\n"; 
		for(int i=0;i<num;i++){
			cin>>paralength[i];
		}
		for(int i=0;i<num;i++)
		   for(int j=0;j<num;j++){
		   	if(address[i]==address[j]&&i!=j&&(address[i]+paralength[i])>address[i+1]){
		   		cout<<"您输入的数据有误,与第"<<j<<"号分段(基址"<<address[j]<<",段长"<<paralength[j]<<")冲突,请重新输入第"<<i<<"号分段对应的基址和段长!\n";
			   
		   	cin>>address[i]>>paralength[i];}
		   }
	}
	
	if(a==1){
		vector<int> l;
		vector<int>::iterator it1;//迭代器
		vector<int> list;

		srand((unsigned)time(NULL));
		for(int i=1;i<101;i++){
			l.push_back(i);//产生不重复的随机数 
		} 	
		random_shuffle(l.begin(),l.end());
		int a=0;
		it1=l.begin();
		while(a<num) {
		address[a]=*it1;
		a++;
		it1++;
        }
        
        for(int i=0;i<num;i++){
			list.push_back(rand()%(3)+0);
		} 	
		int b=0;
		it1=list.begin();
		while(it1!=list.end()&&b<num){
			paralength[b]=pow(2,*it1);
			b++;it1++;
		}	
	} 
	cout<<"您选择了分段方式,输入的数据如下:\n";
    cout<<"段号:\t基址:\t段长:\t\n";
    for(int i=0;i<num;i++)
	cout<<i<<"\t"<<address[i]<<"K\t"<<paralength[i]<<"K"<<endl; 
	cout<<"请开始你的表演(输入逻辑地址):";
	cin>>logical;
	int number=0;
	for(int i=0;i<num;i++)
	number+=paralength[i]*k;//总段长
	
	while(logical-number>0){
				cout<<"您输入的地址已溢出,请重新输入!\n";
				cin>>logical;
			}
	int duanhao;
	int mmm=logical;
	cout<<mmm; 
	int m=0;
	while(mmm>=0) {
		mmm=mmm-paralength[m]*k;
		cout<<mmm; 
		m++;
	}
	duanhao=m-1;
	if(duanhao==0) para=logical;
	else{ 
	for(int i=0;i<duanhao;i++)
		para=logical-paralength[i]*k;
	} 
	 

	physical=address[duanhao]*k+para;
    cout<<"您选择了分段方式,输入的逻辑地址为"<<logical<<",其对应的段号为"<<duanhao<<",段偏移为"<<para<<",\n该地址对应的基址为"<<address[duanhao]<<"K,段偏移为"<<para<<",物理地址为"<<physical<<endl;
}

int main(){
	
    int i=0;
    int temp=0; 
    while(i!=-1){	
    cout<<"----------欢迎使用地址变换系统----------\n";
	cout<<"请输入要选择的地址变化方式:(0-分页;1-分段)\n";
	cin>>temp; 
	if(temp==0) Page();
	else Paragragh();
	cout<<"是否继续使用系统,输入-1退出系统\n";
	cin>>i;
	}
	
	return 0;
}
一、 课程设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、课程设计的内容 1、分页方式的地址换算 2、分段方式的地址换算 3、段页式的地址换算 三、程序运行 1、 分页式地址转换: 数据: 逻辑地址:223、页面大小:23 2、 分段式地址转换 数据: 逻辑地址段号:223、段内地址:23 3、 段页式地址换算 逻辑地址的段号:2、页号:3 四、程序源代码 #include #include 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; //const int ptl ; int temp; 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("注意:请演示设定页表长度小于\n"); printf("请输入换算的逻辑地址:\n"); scanf("%d",&pa); printf("页面大小(B):\n"); scanf("%d",&pl); page(pa,pl); }break; case 2:{ printf("请演示设定段表长度小于\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("段内地址:\n"); scanf("%d",&sd); Segment(sn,sd); }break; case 3:{ printf("预设定段表长为,页面大小为\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;iL) 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); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值