当前位置:
文档之家› 请求页式存储管理的模拟实现_参考代码_
请求页式存储管理的模拟实现_参考代码_
}
out->ReplaceSel(info);
switch (ptr_memAccReq.reqType){
case REQUEST_READ:
ptr_pageTabIt->count++;
if(!(ptr_pageTabIt->proType&READABLE)){
do_error(ERROR_READ_DENY);
do_init(){
int i,j;
srand(time(NULL));
for(i=0;i<PAGE_SUM;i++){
pageTable[i].pageNum=i;
pageTable[i].effective=mFALSE;
pageTable[i].modified=mFALSE;
pageTable[i].count=0;
CString info;
info.Format(_T("页面不在内存\n产生缺页中断,开始进行调页。。。\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
for(i=0;i<BLOCK_SUM;i++){
if(!blockStatus[i])//有空闲页面
out->SetSel(-1, -1);
out->ReplaceSel(info);
ptr_pageTabIt=&pageTable[pageNum];
if(!ptr_pageTabIt->effective)
do_page_fault(ptr_pageTabIt);
else {
info.Format(_T("页面在内存,不用调页\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
if(pageTable[page].modified){
info.Format(_T("有修改,写回至外存\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
do_page_out(&pageTable[page]);
}
pageTable[page].effective=FALSE;//修改被淘汰页的页表
pageTable[page].count=0;
pageTable[page].modified=FALSE;
pageTable[page].blockNum=0;
do_page_in(ptr_pageTabIt,j);
Ptr_PageTableItem ptr_pageTabIt;
unsigned int pageNum,offAddr;
unsigned int actAddr;
CString info;
if(ptr_memAccReq.virAddr<0||ptr_memAccReq.virAddr>=VIRTUAL_MEMORY_SIZE){
out->SetSel(-1, -1);
out->ReplaceSel(info);
}
actAddr=ptr_pageTabIt->blockNum*PAGE_SIZE+offAddr;
info.Format(_T("实地址为:%u\n"),actAddr);
out->SetSel(-1, -1);
break;
case 6:
pageTable[i].proType=READABLE|WRITABLE| EXECUTABLE;
break;
default:
break;
pageTable[i].auxAddr = i*PAGE_SIZE*2;//逻辑页的外存址
}
for (j=0;j<BLOCK_SUM;j++)//内存物理页的初始化
do_error(ERROR_OVER_BOUNDARY);
return;
}
pageNum=ptr_memAccReq.virAddr/PAGE_SIZE;
offAddr=ptr_memAccReq.virAddr%PAGE_SIZE;
info.Format(_T("页号:%u\t页内偏移:%u\n\n"),pageNum,offAddr);
unsigned int i,min,page,j;
CString info;
info.Format(_T("没有空闲页面,开始LFU页面置换。。。\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
for(i=0,min=0xFFFFFFFF,page=0;i<PAGE_SUM ;i++){//找到count最小的页
ptr_memAccReq.reqType=REQUEST_EXECUTE;
info.Format(_T("\n产生请求:\n类型:执行\t"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
break;
default:
break;
}
}
do_response(){
break;
case REQUEST_EXECUTE:
ptr_pageTabIt->count++;
if(!(ptr_pageTabIt->proType&EXECUTABLE)){
do_error(ERROR_EXECUTE_DENY);
return ;
}
info.Format(_T("执行成功\n"));
do_error(ERROR_WRITE_DENY);
return ;
}
actMem[actAddr]=ptr_memAccReq.value;
ptr_pageTabIt->modified=TRUE;
info.Format(_T("写操作成功\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
{
info.Format(_T("有空闲页面\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
do_page_in(ptr_pageTabIt,i);
ptr_pageTabIt->blockNum=i;
ptr_pageTabIt->effective=TRUE;
ptr_pageTabIt->modified=FALSE;
ptr_pageTabIt->count=0;
blockStatus[i]=TRUE;
return;
}
}
do_LFU(ptr_pageTabIt);
}
//LFU
void CManager::do_LFU(Ptr_PageTableItem ptr_pageTabIt){
if(pageTable[i].count<min && pageTable[i].effective==TRUE){
min=pageTable[i].count;
j=pageTable[i].blockNum;//获得的物理块号
page=i;//要淘汰页的页号
}
}
info.Format(_T("选择页面%u进行替换\n"),j);
switch(rand()%7){
case 0:
pageTable[i].proType=READABLE;
break;
case 1:
pageTable[i].proType=WRITABLE;
break;
case 2:
pageTable[i].proType=EXECUTABLE;
break;
case 3:
ptr_pageTabIt->blockNum=j;//修改调入页的页表项
ptr_pageTabIt->effective=TRUE;
ptr_pageTabIt->count=0;
info.Format(_T("页面替换成功\n"));
out->SetSel(-1, -1);
out->ReplaceSel(info);
pageTable[i].proType=READABLE | WRITABLE;
break;
case 4:
pageTable[i].proType=READABLE | EXECUTABLE;
break;
case 5:
pageTable[i].proType=WRITABLE | EXECUTABLE;
return ;
}
info.Format(_T("读操作成功:值为%02X\n"),actMem[actAddr]);
out->SetSel(-1, -1);
out->ReplaceSel(info);
break;
case REQUEST_WRITE:
ptr_pageTabIt->count++;
if(!(ptr_pageTabIt->proType&WRITABLE)){