北理工操作系统内存管理实验报告Word文档格式.docx
《北理工操作系统内存管理实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《北理工操作系统内存管理实验报告Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
图1页式存储管理程序参考流程
四、实验环境
硬件设备:
个人计算机。
系统软件:
windows操作系统,VisualC++6.0编译环境。
五、实验结果
说明:
模拟产生35个指令地址,随机产生20个指令地址进行排队,假设主存中共有10个工作集页帧。
将前9个指令调入内存,因为前9个指令中,页号为13的指令有两个,所以调入内存中共有8页。
此时主存中还有两个空闲帧。
此时按刚才随机顺序进行访问指令工作。
前9页因都在主存中可直接调用。
第10个随机地址为页号为5的指令,也在主存中,也可直接调用。
页号为24,3因不在主存中,需要调用进主存。
此时主存已满。
然后主存需要进行调用页号为27号的指令,因主存已满,需要执行FIFO算法,将最先进入主存的页号为30的指令调出,将27号放入第1000000帧。
以后需要调用的页面按照存在就无需调用,否则按FIFO原则进行调页工作。
六、实验感想
七、实验代码
#include<
iostream>
iomanip>
stdlib.h>
time.h>
vector>
queue>
//#include<
algorithm>
usingnamespacestd;
#definePAGETABLE_NUM 35 //模拟进程的页表表项数量;
#defineAVAILABLEFRAME_NUM 10 //主存中固定工作集页帧的数量;
#defineRANDOMNUMBER_NUM 20 //产生随机指令地址的数量;
structPageTableEntry
{
unsignedintFrameNum;
boolPressent;
};
voidInitRandomAddr(vector<
unsignedint>
&
RandomAddr);
voidInitIdleFrameQueue(queue<
IdleFrameQueue);
voidInitPageTable(vector<
PageTableEntry>
PageTable,vector<
RandomAddr,queue<
IdleFrameQueue,queue<
AvtiveFrameQueue);
voidSetPTE(PageTableEntry&
PTE);
intmain()
inta;
//初始化RANDERNUMBER_NUM条随机的32位指令地址;
vector<
RandomAddr(RANDOMNUMBER_NUM);
InitRandomAddr(RandomAddr);
//初始化FIFS指针;
:
iteratorFIFS_pintor;
FIFS_pintor=RandomAddr.begin();
//初始空闲帧队列;
queue<
IdleFrameQueue,ActiveFrameQueue;
InitIdleFrameQueue(IdleFrameQueue);
//初始进程页表(模拟进程初始时,工作集已经使用至少10个页帧);
PageTable(PAGETABLE_NUM);
InitPageTable(PageTable,RandomAddr,IdleFrameQueue,ActiveFrameQueue);
//Test
cout<
<
"
开始访问指令地址\n"
;
iteratorpt_RandomAddr;
for(pt_RandomAddr=RandomAddr.begin();
pt_RandomAddr!
=RandomAddr.end();
pt_RandomAddr++)
{
unsignedintPageNum=(*pt_RandomAddr)>
>
12;
cout<
地址:
0x"
hex<
*pt_RandomAddr<
dec<
\t页号:
PageNum;
if(PageTable[PageNum].Pressent==0) //该页不在主存中;
{
cout<
\t该页不在主存,"
;
if(IdleFrameQueue.empty()) //工作集空闲页帧已用完;
{
cout<
执行FIFO淘汰算法\t"
//FIFS算法淘汰一页;
unsignedintFrame_Num;
Frame_Num=ActiveFrameQueue.front();
ActiveFrameQueue.pop();
PageTable[(*FIFS_pintor)>
12].Pressent=0;
//标记此页已经被置换出主存;
//置换进新页;
PageTable[PageNum].FrameNum=Frame_Num;
PageTable[PageNum].Pressent=1;
ActiveFrameQueue.push(Frame_Num);
//移动FIFS指针;
FIFS_pintor++;
}
else
调入所需页到空闲页\t"
//调入当前所需的页到空闲页中;
Frame_Num=IdleFrameQueue.front();
IdleFrameQueue.pop();
}
else
\t该页在主存"
\t帧号:
PageTable[PageNum].FrameNum<
endl;
}
return0;
}
RandomAddr)
生成随机指令地址\n"
iteratorpd;
srand((unsigned)time(NULL));
for(pd=RandomAddr.begin();
pd!
pd++)
//产生随机页号0~PAGETABLE_NUM-1;
unsignedintHigh_20=rand()%PAGETABLE_NUM;
//产生随机偏移量0~4095;
unsignedintLow_12=rand()%4096;
unsignedintAddr=(High_20<
12)|Low_12;
*pd=Addr;
随机指令地址:
setw(8)<
setfill('
0'
)<
setiosflags(ios:
uppercase|ios:
fixed)<
*pd<
High_20<
\t偏移量:
Low_12<
IdleFrameQueue)
//帧号从0~1048575,这里取1000000~1000016;
for(unsignedintFrameNum=1000000;
FrameNum<
1000000+AVAILABLEFRAME_NUM;
FrameNum++)
IdleFrameQueue.push(FrameNum);
AvtiveFrameQueue)
初始化页表;
\n"
for_each(PageTable.begin(),PageTable.end(),SetPTE);
unsignedintPage_Num,Frame_Num;
for(intcount=0;
count<
9;
count++)
while(true)
Page_Num=RandomAddr[count]>
if(PageTable[Page_Num].Pressent!
=0)
break;
Frame_Num=IdleFrameQueue.front();
IdleFrameQueue.pop();
PageTable[Page_Num].FrameNum=Frame_Num;
//设置页帧号;
PageTable[Page_Num].Pressent=1;
//标记页帧在主存中;
AvtiveFrameQueue.push(Frame_Num);
//记录活动页帧;
将模拟进程的第"
Page_Num<
页初始化至主存中,帧号为:
Frame_Num<
endl;
}