⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duanye.cpp

📁 段页式虚拟存储管理的地址转换程序,操作系统的课程设计,使用C++的控制台程序,结构化的.
💻 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 + -