模拟设计页式存储管理的分配与回收Word下载.docx
《模拟设计页式存储管理的分配与回收Word下载.docx》由会员分享,可在线阅读,更多相关《模拟设计页式存储管理的分配与回收Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
![模拟设计页式存储管理的分配与回收Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/12358c6f-547c-456d-9cc4-32532d8b6a8d/12358c6f-547c-456d-9cc4-32532d8b6a8d1.gif)
int(pagenum);
i++)
mempage[i]=0;
//数组全部赋初值
}
/*获取内存的使用情况*/
intGet_Mempagenum(void)
intsum=0;
for(inti=0;
if(mempage[i]==0)
sum++;
returnsum;
//判断有多少内存页面已经被使用
/*初始化默认的请求表*/
voidInit_Reqtable(void)
inti;
for(i=1;
=int(pnum);
{
reqtabitempreq;
preq.pid=i;
preq.reqpagenum=random.Random(4)+2;
//进程请求的页面大小-5
preq.state=false;
preq.pgtabadr=NULL;
reqtable.push_back(preq);
//依次压入容器
}
}
/*为默认的进程分配内存*/
voidInit_DistMem(void)
intreqpnum;
//进程请求页面数
inti;
:
iteratorpos=reqtable.begin();
for(;
pos!
=reqtable.end();
pos++)
reqpnum=(*pos).reqpagenum;
if(reqpnum>
int(Get_Mempagenum()))//判断请求的内存页面数
目是否大于剩余的
cout<
<
"
没有足够的内存!
endl;
}
else
(*pos).state=true;
pagetabletemp=newpgtabitem[reqpnum];
//新建临时页表数组
if(temp==NULL)
{
内存分配失败!
exit(0);
(*pos).pgtabadr=temp;
reqpnum;
temp[i].pagenum=i;
//页表的页号
intrandnum=random.Random(pagenum)+1;
//随机产生一块号
while(mempage[randnum]==1)
randnum=random.Random(pagenum)+1;
temp[i].blocknum=randnum;
//页表的块号
mempage[randnum]=1;
/*手动创建进程,并分配内存*/
voidDist_Mem(void)
{inti;
//新创建进程记录
intpid;
//进程号
intreqpnum;
//请求页面数
boolflag=false;
do
请输入进程号:
;
flag=false;
cin>
>
pid;
for(list<
iterator
pos=reqtable.begin();
if((*pos).pid==pid)
{
flag=true;
该进程号已经存在,请重新输入"
cout<
break;
}while(flag==true);
//循环直到输入的Pid满足条件
preq.pid=pid;
请输入需要的页面数:
preq.reqpagenum=reqpnum;
reqpnum=preq.reqpagenum;
Get_Mempagenum())
没有足够的内存,进程创建失败!
else
preq.state=true;
if(temp==NULL)
preq.pgtabadr=temp;
int(reqpnum);
i++)
{temp[i].pagenum=i;
//页表的页号
intrandnum=random.Random(pagenum)+1;
//随机产生一个块号
while(mempage[randnum]==1)
temp[i].blocknum=randnum;
//页表的块号
/*程序结束时,释放申请的动态内存*/
voidDestroy(void)
for(pos=reqtable.begin();
pos++)
if((*pos).state==true)
delete[](*pos).pgtabadr;
reqtable.clear();
}//将该进程的记录加入请求表
/*打印出进程请求表*/
voidPrintReqtable(void)
|------------------------------------------------------------------|"
|进程请求表|"
|"
setw(8)<
进程号"
setw(16)<
请求页面数"
页表起始地址"
<
页表长度"
状态|"
|-------------------------------------------------------------------|"
list<
(*pos).pid
(*pos).reqpagenum
(*pos).pgtabadr
((*pos).reqpagenum)*pagesize;
if((*pos).state)
setw(4)<
已分配|"
else
未分配|"
if((*pos).pid!
=reqtable.back().pid)
|--------------------------------------------------------------|"
end;
elsecout<
|-------------------------------------------------------------|"
/*打印页表*/
voidPrintPageTable(void)
unsignedpid;
for(pos=reqtable.begin();
if((*pos).pid==pid&
&
(*pos).state==true)
flag=true;
|---------------------------|"
|此进程的页表|"
页号"
setw(6)<
块号|"
intreqpagenum=(*pos).reqpagenum;
for(i=0;
reqpagenum;
(*pos).pgtabadr[i].pagenum
(*pos).pgtabadr[i].blocknum<
|"
if(i!
=reqpagenum-1)
if(flag==false)
系统中不存在该进程或者该进程还没有被分配内存!
\n"
voidPrintMem(void)
内存总块数为"
pagenum<
已经使用了
"
pagenum-Get_Mempagenum()<
块!
现在还有"
Get_Mempagenum()<
块内存区域空闲!
voidPrintBlockSize(void)
{cout<
物理块大小为:
pagesize<
KB"
/*结束指定进程*/
voidKill(void)
boolflag;
reqtabitemtemp;
if((*pos).pid==pid)
temp=*pos;
if(flag==false)
系统中不存在该进程!
}while(flag==false);
int(temp.reqpagenum);
mempage[temp.pgtabadr[i].blocknum]=0;
reqtable.remove(temp);
//重新为没有分配到内存的进程分配内存for(pos=reqtable.begin();
if((*pos).state==false)
if(reqpnum<
=Get_Mempagenum())
temp[i].pagenum=i;
//页表的页号号
mempage[randnum]=1;
}/*初始化系统*/
voidInitSys(void)
cout.setf(ios:
left);
//左对齐
Init_Mempage();
Init_Reqtable();
Init_DistMem();
/*输出主菜单*/
voidMainMenu(void)
页式存储管理的分配与回收"
1.手动创建进程"
2.显示进程页表"
3.显示请求表"
4.撤销进程"
5.显示内存使用情况"
6.显示物理块大小"
7.退出系统"
请输入您的选择(0--7):
/*选择函数*/
voidMainChoice()
intchoice;
do{MainMenu();
cin>
choice;
switch(choice)
case1:
Dist_Mem();
case2:
PrintPageTable();
break;
case3:
PrintReqtable();
case4:
Kill();
case5:
PrintMem();
case6:
PrintBlockSize();
case7:
default:
输入有误,请重新输入.\n"
}while(choice!
=7);
intmain()
InitSys();
//初始化系统
MainChoice();
//输出系统菜单
Destroy();
//释放申请的动态内存
return0;