#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
typedef struct{
int seg_num; //段号
int addr_seg; //始址
int seg_length; //段长
string access_way; //存取控制方式
char in_out; //内外存
}seg_form; //表项定义
struct process{
string name; //进程名
seg_form *address_seg; //段表始址
int form_length; //表中段数
seg_form table[5]; //段表(预设最多5项)
int total; //该进程总的内存占用量
bool isused; //是否被调入内存中
}; //进程定义
struct memory{
int capacity; //容量
int used; //已使用容量
int count; //进程个数
seg_form *addr_reg; //段表始址寄存器
}; //内存定义
process pro[8]; //进程有关信息
memory mem; //内存
void initial(){ //初始化内存
cout<<"请输入内存的大小(单位:KB):";
cin>>mem.capacity; mem.used=0;
}
void menu(){ //主菜单
cout<<"*--------------------------------------------*"<<endl;
cout<<"* Welcome To The Address Trans System! *"<<endl;
cout<<"* [1]Create A Process *"<<endl;
cout<<"* [2]Transfer A Process *"<<endl;
cout<<"* [3]Print The SegForm of The Process *"<<endl;
cout<<"* [4]Choose A Process To Trans Address *"<<endl;
cout<<"* [5]Exit *"<<endl;
cout<<"*--------------------------------------------*"<<endl;
}
void create_proc(){ //创建进程
process proc; int i;
l4: cout<<"请输入该进程的名称:"; cin>>proc.name;
for(i=0;i<mem.count;i++)
if(pro[i].name==proc.name){cout<<"已有同名进程!"<<endl;goto l4;}
l3: cout<<"请输入该进程的表中段数(<=5):"; cin>>proc.form_length;
if(proc.form_length>5){cout<<"段数<=5!请重新输入!"<<endl;goto l3;}
proc.isused=false; proc.total=0;
for(i=0;i<proc.form_length;i++){
proc.table[i].seg_num=i;
cout<<"请输入段号为"<<i<<"的段长(单位:B):";cin>>proc.table[i].seg_length;
cout<<" 存取控制方式(写'w'/读'r'):";cin>>proc.table[i].access_way;
proc.table[i].in_out='w';
proc.total+=proc.table[i].seg_length;
}
proc.address_seg=proc.table;
pro[mem.count++]=proc;
}
void transfer_proc(){ //调用进程
string N; bool flag=false;
cout<<"请输入要调用的进程名:"; cin>>N;
for(int i=0;i<mem.count;i++)
if(pro[i].name==N)
if(pro[i].isused){cout<<"该进程已被调入内存!"<<endl;return;}
else{flag=true;mem.addr_reg=pro[i].table;break;}
if(flag==false){cout<<"没有查找到该进程!"<<endl;return;}
if(pro[i].total>mem.capacity*1024-mem.used){cout<<"内存容量不足,无法成功调度!"<<endl;return;}
pro[i].isused=true;
for(int j=0;j<pro[i].form_length;j++){
pro[i].table[j].addr_seg=mem.used;mem.used+=pro[i].table[j].seg_length;
pro[i].table[j].in_out='n';
}
cout<<"进程"<<pro[i].name<<"成功调入内存!"<<endl;
}
void print_proc(process proc){ //输出进程相关信息
cout<<"进程名:"<<proc.name<<endl;
cout<<"进程状态:";
if(proc.isused)cout<<"已调用"<<endl;
else cout<<"未调用"<<endl;
cout<<"__________________________________________________________"<<endl;
cout<<"seg_num addr_seg seg_length access_way in_out "<<endl;
if(proc.isused)
for(int i=0;i<proc.form_length;i++)
cout<<i<<setw(15)<<proc.table[i].addr_seg<<setw(15)<<proc.table[i].seg_length
<<setw(10)<<proc.table[i].access_way<<setw(15)<<proc.table[i].in_out<<endl;
else
for(int i=0;i<proc.form_length;i++)
cout<<i<<setw(28)<<proc.table[i].seg_length
<<setw(13)<<proc.table[i].access_way<<setw(12)<<proc.table[i].in_out<<endl;
cout<<"__________________________________________________________"<<endl;
}
void addr_trans(){ //地址转换函数
string N; bool flag=false,flag_r=false; int i,s,w;
cout<<"请输入进程名:"; cin>>N;
for(i=0;i<mem.count;i++)
if(pro[i].name==N)
if(pro[i].isused){flag=true;mem.addr_reg=pro[i].table;break;}
else{cout<<"该进程未被调入内存!"<<endl;return;}
if(flag==false){cout<<"没有查找到该进程!"<<endl;return;}
cout<<"请按要求输入要转换的逻辑地址"<<endl;
l2: cout<<" 请输入段号:"; cin>>s;
for(i=0;(i<5)&&(s>mem.addr_reg[i].seg_num);i++);
if((i==5)||(mem.addr_reg[i].seg_num!=s)){
cout<<"输入的段号超出范围!"<<endl;goto l2;
}
for(i=0;i<mem.addr_reg[s].access_way.length();i++)
if(mem.addr_reg[s].access_way.at(i)=='r'){flag_r=true;break;}
if(flag_r==false){cout<<"该段没有读取的权限!"<<endl;return;}
cout<<"请输入段内地址:"; cin>>w;
if(w>mem.addr_reg[s].seg_length){cout<<"段内地址越界!"<<endl;return;}
cout<<"对应的物理地址为:"<<mem.addr_reg[s].addr_seg+w<<endl;
}
void excute(){ //执行函数
char choice; int i;
initial(); menu();
l1: cout<<"Input A Choice:"; cin>>choice;
switch(choice){
case '1':system("cls");menu();
if(mem.count<8){create_proc();cout<<"进程创建成功!"<<endl;}
else cout<<"进程数已达到MAX!"<<endl;
break;
case '2':system("cls");menu();transfer_proc();break;
case '3':system("cls");menu(); if(mem.count==0)cout<<"当前没有任何进程!"<<endl;
for(i=0;i<mem.count;i++)print_proc(pro[i]);
break;
case '4':system("cls");menu();addr_trans();break;
case '5':cout<<" Thank you For Using The System !"<<endl;return;
default:cout<<"输入选项不合法!"<<endl;break;
}
goto l1;
}
int main(){
excute();
return 0;
}