操作系统地址变换(十进制)
设计程序,实现地址变换功能。具体要求如下:
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;
}