?? 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 + -