设计程序,实现地址变换功能。具体要求如下:
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