📄 duanye.cpp
字号:
//////////////////////////////////////////////////////
//计算机0607薛昆仑 0120610340725
//段页式存储管理的地址转换
#include<iostream.h>
#include<stdlib.h>
#include <string.h>
#include<stdio.h>
#include<iomanip.h>
#include<time.h>
#define LISTLEN 100
#define BLOCKSMAX 1000
///////////////////////////////////////////////////////////
//主要的数据结构定义
struct pageList //页表
{
int num;
int blockcode[LISTLEN];
};
struct segmentList //段表,相当于一个进程的信息体
{
pageList segments[LISTLEN];
char procname[20];
int Isdiaoyong;
int num;
int pagecount;
};
segmentList procs[LISTLEN]; //进程请求表
int memory=0;
int block=0;
int procnum=0;
int emptyblocks[BLOCKSMAX];
int usedblocks=0;
int blockcount;
///////////////////////////////////////////////////////////////
//所有函数声明
//四个主要函数
int procShow();
void procApply();
void procDiaodu();
void addTranslate();
//与内存空闲区管理有关的几个函数
void adjustempty(int a);
void initempty();
void Showempty();
//显示某进程的段表和页表信息
void procShowone(int );
//显示信息和服务选单
void showInfomenu();
void showServermenu();
/////////////////////////////////////////////////////////////////
//四个主要功能的函数.
//申请创建进程
void procApply()
{
cout<<"请输入你想创建进程的个数:";
cin>>procnum;
for(int i=0;i<procnum;i++){
cout<<"第"<<i<<"个进程的名字为:";
cin>>procs[i].procname;
cout<<"该进程的段数为:";
cin>>procs[i].num;
int pagesum=0;
for(int j=0;j<procs[i].num;j++)
{
cout<<"进程第"<<j<<"段的页数为:";
cin>>procs[i].segments[j].num ;
pagesum=pagesum+procs[i].segments[j].num;
}
procs[i].Isdiaoyong=0;
procs[i].pagecount=pagesum;
}
}
//将进程调度入内存
void procDiaodu()
{
cout<<"您要调度的进程的标号是:";
int n;
cin>>n;
if(n+1>procnum)
cout<<"进程不存在!"<<endl;
else if(procs[n].Isdiaoyong==1)
cout<<"操作错误,该进程已经被调入到内存!"<<endl;
else if(procs[n].pagecount>blockcount-usedblocks)
cout<<"内存空间不足,调度不成功!"<<endl;
else
{
for(int j=0;j<procs[n].num;j++)
{
for(int i=0;i<procs[n].segments[j].num;i++){
srand((unsigned) time(NULL));
int randnum=rand()%(blockcount-usedblocks);
procs[n].segments[j].blockcode[i]=emptyblocks[randnum];
usedblocks++;
adjustempty(randnum);
}
cout<<"段"<<j<<"的内存分配完毕."<<endl;
}
cout<<"已经为进程"<<procs[n].procname<<"分配内存空间:"<<endl;
procs[n].Isdiaoyong =1;
}
}
//显示进程请求表
int procShow()
{ cout<<"______________________________________________"<<endl;
cout<<setw(6)<<"进程号"<<setw(8)<<"进程名"<<setw(10)<<"分配状态"<<setw(6)<<"段数"<<setw(6)<<"页数"<<endl;
for(int i=0;i<procnum;i++)
cout<<setw(6)<<i<<setw(8)<<procs[i].procname<<setw(10)<<procs[i].Isdiaoyong<<setw(6)<<procs[i].num<<setw(6)<<procs[i].pagecount<<endl;
cout<<"______________________________________________"<<endl;
showInfomenu();
int d;
while(1)
{
cout<<"请选择:";
cin>>d;
switch(d){
case 1: Showempty();break;
case 2: {
cout<<"你想查看哪个进程内存分配情况:";
int n;
cin>>n;
if(n+1>procnum)
cout<<"进程不存在!"<<endl;
else if(procs[n].Isdiaoyong==0)
cout<<"操作错误,该进程尚未被调入内存!"<<endl;
else procShowone(n);
break;
}
case 3: return 0;
default:cout<<"error!请重新输入!"<<endl;
}
}
}
//进行地址转换
void addTranslate(){
cout<<"你要运行的是哪个进程:"<<endl;
int n;
cin>>n;
if(n+1>procnum)
cout<<"进程不存在!"<<endl;
else if(procs[n].Isdiaoyong==0)
cout<<"操作错误,该进程尚未被调入内存!"<<endl;
else{
int addphysical,segmentcode,pagecode,address,pagephysical;
cout<<"进程"<<procs[n].procname<<"开始运行....."<<endl;
cout<<"请按提示输入你想要进行转换的逻辑地址信息(十进制)."<<endl;
cout<<"段号s:";cin>>segmentcode;
cout<<"页号p:";cin>>pagecode;
cout<<"页内相对地址d:";cin>>address;
if(segmentcode>=procs[n].num)cout<<"段号超过段表长,越界中断"<<endl;
else{
if(pagecode>=procs[n].segments[segmentcode].num)cout<<"页号超过页表长,越界中断"<<endl;
else{
if(address>=block)cout<<"页内相对地址超过块大小,输入错误."<<endl;
else{
pagephysical=procs[n].segments[segmentcode].blockcode[pagecode];
addphysical=pagephysical*block+address;
cout<<"该逻辑地址对应的物理块为:"<<pagephysical<<endl;
cout<<"其物理地址为:"<<addphysical<<endl;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
//其他的零碎的小功能函数.
//显示指定进程的段表和页表信息
void procShowone(int i){
cout<<"_____________________________________________"<<endl;
cout<<"进程"<<procs[i].procname<<"有"<<procs[i].num<<"段."<<endl;
for(int j=0;j<procs[i].num;j++){
cout<<endl<<"其第"<<j<<"段有"<<procs[i].segments[j].num<<"页."<<endl<<"页表为:"<<endl;
cout<<"页号:";
for(int m=0;m<procs[i].segments[j].num;m++)cout<<setw(3)<<m;
cout<<endl;
cout<<"块号:";
for(int k=0;k<procs[i].segments[j].num;k++)cout<<setw(3)<<procs[i].segments[j].blockcode[k];
cout<<endl;
}
cout<<"_____________________________________________"<<endl;
}
//更新空闲页面表
void adjustempty(int a){
for(int i=a;i<=(blockcount-usedblocks-1);i++)
emptyblocks[i]=emptyblocks[i+1];
}
//初始化空闲页面表
void initempty(){
for(int i=0;i<=blockcount-1;i++){
emptyblocks[i]=i;
}
}
//显示空闲页面表的内容
void Showempty(){
cout<<"______________________________________________"<<endl;
cout<<"当前内存空闲表中空闲块个数为:"<<blockcount-usedblocks<<endl;
cout<<"依次为:"<<endl;
for(int i=0;i<=blockcount-usedblocks-1;i++){
if(i%26==0 && i!=0)
cout<<endl<<setw(3)<<emptyblocks[i];
else cout<<setw(3)<<emptyblocks[i];
}
cout<<endl;
cout<<"______________________________________________"<<endl;
}
void showInfomenu(){
cout<<"**********************************************"<<endl;
cout<<" 你是否还想显示其他信息: "<<endl;
cout<<" "<<endl;
cout<<" 1:空闲表 "<<endl;
cout<<" 2:内存分配情况 "<<endl;
cout<<" 3:返回菜单 "<<endl;
cout<<" "<<endl;
cout<<"**********************************************"<<endl;
}
void showServermenu(){
cout<<"*************************************************"<<endl;
cout<<" 模拟段页式虚拟存储管理中地址转换 "<<endl;
cout<<" "<<endl;
cout<<" 1:显示进程表 "<<endl;
cout<<" 2:创建进程结构 "<<endl;
cout<<" 3:进程分配内存 "<<endl;
cout<<" 4:地址转换 "<<endl;
cout<<" 5:退出 "<<endl;
cout<<" "<<endl;
cout<<"*************************************************"<<endl;
}
//////////////////////////////////////////////////////////////////////////////////////////
//主函数.
int main()
{
cout<<"请输入内存的大小:";
cin>>memory;
cout<<"请输入内存块的大小:";
int mod;
do{
cin>>block;
blockcount=memory/block;
mod=memory % block;
if(mod)cout<<"内存块大小输入不合适,请重新输入:";
}while(mod);
initempty();
showServermenu();
int d;
while(1)
{
cout<<"请选择服务种类:";
cin>>d;
switch(d){
case 1: procShow();showServermenu();break;
case 2: procApply();break;
case 3: procDiaodu();break;
case 4: addTranslate();break;
case 5: cout<<"服务完毕!"<<endl; return 0;
default:cout<<"error!请重新输入!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -