#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <list>
#include<ctime>
using namespace std;
#define random(x) (rand()%x)
//頁表項結構
typedef struct _pagetableitem
{
int pagenum; //頁號
int blocknum; //塊號
}pgtabitem; //頁表
typedef pgtabitem *pagetable;
//請求表結構
typedef struct _reqtable
{
unsigned pid; //行程號
unsigned reqpagenum; //請求頁面數
pagetable pgtabadr; //頁表始址
bool state; //狀態
} reqtabitem;
list<reqtabitem> reqtable;
unsigned pagenum=random(80)+21; //記憶體頁面數21-100
unsigned pagesize=random(16)+5; //頁面大小 5-20
unsigned pnum=random(4)+5;//行程的個數5-8
int * mempage=new int[pagenum]; //用整數陣列模擬記憶體頁面數
/*初始化記憶體頁面*/
void Init_Mempage(void)
{
int i=0;
for(i=0;i<int(pagenum);i++)
mempage[i]=0; //陣列全部賦初值
}
/*獲取記憶體的使用情況*/
int Get_Mempagenum(void)
{
int sum=0;
for(int i=0;i<int(pagenum);i++)
if(mempage[i]==0)
sum++;
return sum; //判斷有多少記憶體頁面已經被使用
}
/*初始化默認的請求表*/
void Init_Reqtable(void)
{
int i;
for(i=1;i<=int(pnum);i++)
{
reqtabitem preq;
preq.pid=i;
preq.reqpagenum=random(4)+2;//行程請求的頁面大小-5
preq.state=false;
preq.pgtabadr=NULL;
reqtable.push_back(preq); //依次壓入容器
}
}
/*為默認的行程分配記憶體*/
void Init_DistMem(void)
{
int reqpnum; //行程請求頁面數
int i;
list<reqtabitem>::iterator pos=reqtable.begin();
for(;pos!=reqtable.end();pos++)
{
reqpnum=(*pos).reqpagenum;
if(reqpnum>int(Get_Mempagenum())) //判斷請求的記憶體頁面數目是否大于剩余的
{
cout<<"沒有足夠的記憶體!"<<endl;
cout<<endl;
}
else
{
(*pos).state=true;
pagetable temp = new pgtabitem[reqpnum]; //新建臨時頁表項陣列
if(temp==NULL)
{
cout<<"記憶體分配失敗!"<<endl;
exit(0);
}
(*pos).pgtabadr=temp;
for(i=0;i<reqpnum;i++)
{
temp[i].pagenum=i; //頁表的頁號
int randnum=random(pagenum)+1;//隨機產生一個塊號
while(mempage[randnum]==1) //尋找未被使用的物理塊
randnum=random(pagenum)+1;
temp[i].blocknum=randnum;//頁表的塊號
mempage[randnum]=1;
}
}
}
}
/*手動創建行程,并分配記憶體*/
void Dist_Mem(void)
{
int i;
reqtabitem preq; //新創建行程記錄
int pid; //行程號
int reqpnum; //請求頁面數
bool flag=false;
do{
cout<<"請輸入行程號:";
flag=false;
cin>>pid;
for(list<reqtabitem>::iterator pos=reqtable.begin();pos!=reqtable.end();pos++)
{
if((*pos).pid==pid)
{
flag=true;
cout<<"該行程號已經存在,請重新輸入"<<endl;
cout<<endl;
break;
}
}
}while(flag==true); //回圈直到輸入的Pid滿足條件
preq.pid=pid;
cout<<"請輸入需要的頁面數:";
cin>>reqpnum;
preq.reqpagenum=reqpnum;
preq.state=false;
preq.pgtabadr=NULL;
reqpnum=preq.reqpagenum;
if(reqpnum>Get_Mempagenum())
{
cout<<"沒有足夠的記憶體,行程創建失敗!"<<endl;
cout<<endl;
}
else
{
preq.state=true;
pagetable temp = new pgtabitem[reqpnum];
if(temp==NULL)
{
cout<<"記憶體分配失敗!"<<endl;
exit(0);
}
preq.pgtabadr=temp;
for(i=0;i<int(reqpnum);i++)
{
temp[i].pagenum=i; //頁表的頁號
int randnum=random(pagenum)+1;//隨機產生一個塊號
while(mempage[randnum]==1)
randnum=random(pagenum)+1;
temp[i].blocknum=randnum;//頁表的塊號
mempage[randnum]=1;
}
}
reqtable.push_back(preq); //將該行程的記錄加入請求表
}
/*程式結束時,釋放申請的動態記憶體*/
void Destroy(void)
{
list<reqtabitem>::iterator pos=reqtable.begin();
for(pos=reqtable.begin();pos!=reqtable.end();pos++)
{
if((*pos).state==true)
delete [](*pos).pgtabadr;
}
reqtable.clear();
}
/* 列印出行程請求表*/
void PrintReqtable(void)
{
cout<<endl;
cout<<"|--------------------------------------------------------------------|"<<endl;
cout<<"| 行程請求表 |"<<endl;
cout<<"|--------------------------------------------------------------------|"<<endl;
cout<<"|"<<setw(8)<<"行程號"
<<setw(16)<<"請求頁面數"
<<setw(16)<<"頁表起始地址"
<<setw(16)<<"頁表長度"
<<setw(16)<<"狀態 |"<<endl;
cout<<"|---------------------------------------------------------------------|"<<endl;
list<reqtabitem>::iterator pos=reqtable.begin();
for(pos=reqtable.begin();pos!=reqtable.end();pos++)
{
cout<<"|"<<setw(8)<<(*pos).pid
<<setw(16)<<(*pos).reqpagenum
<<setw(16)<<(*pos).pgtabadr
<<setw(16)<<((*pos).reqpagenum) * pagesize;
if((*pos).state)
cout<<setw(4)<<"已分配 |"<<endl;
else
cout<<setw(4)<<"未分配 |"<<endl;
if((*pos).pid!=reqtable.back().pid)
cout<<"|--------------------------------------------------------------------|"<<endl;
else
cout<<"|--------------------------------------------------------------------|"<<endl;
}
}
/*列印頁表*/
void PrintPageTable(void)
{
unsigned pid;
int i;
bool flag=false;
cout<<"請輸入行程號:";
cin>>pid;
list<reqtabitem>::iterator pos=reqtable.begin();
for(pos=reqtable.begin();pos!=reqtable.end();pos++)
{
if((*pos).pid==pid&&(*pos).state==true)
{
flag=true;
cout<<"|---------------------------|"<<endl;
cout<<"| 此行程的頁表 |"<<endl;
cout<<"|---------------------------|"<<endl;
cout<<"|"<<setw(16)<<"頁號"
<<setw(6)<<"塊號 |"<<endl;
cout<<"|---------------------------|"<<endl;
int reqpagenum=(*pos).reqpagenum;
for(i=0;i<reqpagenum;i++)
{
cout<<"|"<<setw(16)<<(*pos).pgtabadr[i].pagenum
<<setw(6)<<(*pos).pgtabadr[i].blocknum<<" |"<<endl;
if(i!=reqpagenum-1)
cout<<"|---------------------------|"<<endl;
else
cout<<"|---------------------------|"<<endl;
}
}
}
if(flag==false)
cout<<"系統中不存在該行程或者該行程還沒有被分配記憶體!\n";
cout<<endl;
}
void PrintMem(void)
{
cout<<"記憶體總塊數為"<<pagenum<<",已經使用了"<<pagenum-Get_Mempagenum()<<"塊!"<<endl;
cout<<"現在還有"<<Get_Mempagenum()<<"塊記憶體區域空閑!"<<endl;
cout<<endl;
}
void PrintBlockSize(void)
{
cout<<"物理塊大小為:"<<pagesize<<"KB"<<endl;
cout<<endl;
}
/*結束指定行程*/
void Kill()
{
bool flag;
int i;
reqtabitem temp;
list<reqtabitem>::iterator pos =reqtable.begin();
int pid;
do{
cout<<"請輸入行程號:";
flag=false;
cin>>pid;
for(pos=reqtable.begin();pos!=reqtable.end();pos++)
{
if((*pos).pid==pid)
{
flag=true;
temp=*pos;
break;
}
}
if(flag==false)
cout<<"系統中不存在該行程!"<<endl;
cout<<endl;
}while(flag==false);
for(i=0;i<int(temp.reqpagenum);i++)
mempage[temp.pgtabadr[i].blocknum]=0;
reqtable.remove(temp);
//重新為沒有分配到記憶體的行程分配記憶體
for(pos=reqtable.begin();pos!=reqtable.end();pos++)
{
if((*pos).state==false)
{
int reqpnum;
reqpnum=(*pos).reqpagenum;
if(reqpnum<=Get_Mempagenum())
{
(*pos).state=true;
pagetable temp = new pgtabitem[reqpnum];
if(temp==NULL)
{
cout<<"記憶體分配失敗!"<<endl;
cout<<endl;
exit(0);
}
(*pos).pgtabadr=temp;
for(i=0;i<int(reqpnum);i++)
{
temp[i].pagenum=i; //頁表的頁號
int randnum=random(pagenum)+1;//隨機產生一個塊號
while(mempage[randnum]==1)
randnum=random(pagenum)+1;
temp[i].blocknum=randnum;//頁表的塊號
mempage[randnum]=1;
}
}
}
}
}
/*初始化系統*/
void InitSys(void)
{
cout.setf(ios::left);//左對齊
Init_Mempage();
Init_Reqtable();
Init_DistMem();
}
/*輸出主選單*/
void MainMenu(void)
{
cout<<"頁式存盤管理的分配與回收"<<endl;
cout<<"1.手動創建行程"<<endl;
cout<<"2.顯示行程頁表"<<endl;
cout<<"3.顯示請求表"<<endl;
cout<<"4.撤銷行程"<<endl;
cout<<"5.顯示記憶體使用情況"<<endl;
cout<<"6.顯示物理塊大小"<<endl;
cout<<"7.退出系統"<<endl;
cout<<"請輸入您的選擇(0--7):";
}
/*選擇函式*/
void MainChoice()
{
int choice;
do{
MainMenu();
cin>>choice;
switch(choice)
{
case 1:
Dist_Mem();
break;
case 2:
PrintPageTable();
break;
case 3:
PrintReqtable();
break;
case 4:
Kill();
break;
case 5:
PrintMem();
break;
case 6:
PrintBlockSize();
break;
case 7:
break;
default :cout<<"輸入有誤,請重新輸入.\n";
cout<<endl;
break;
}
}while(choice!=7);
}
int main()
{
srand((int)time(0));
InitSys();//初始化系統
MainChoice();//輸出系統選單
Destroy();//釋放申請的動態記憶體
return 0;
}
uj5u.com熱心網友回復:
那么長,擼過算了
uj5u.com熱心網友回復:
俺來看看,小輝輝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140660.html
標籤:基礎類
上一篇:看懂一個Class檔案
下一篇:界面跳轉問題,求指導
