北理工操作系统内存管理实验报告.docx
- 文档编号:728476
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:9
- 大小:350.66KB
北理工操作系统内存管理实验报告.docx
《北理工操作系统内存管理实验报告.docx》由会员分享,可在线阅读,更多相关《北理工操作系统内存管理实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
实验三:
内存管理
班级:
学号:
姓名:
一、实验目的
1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解;
2.熟悉虚存管理的页面淘汰算法;
3.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
二、实验要求
1.设计一个请求页式存储管理方案(自己指定页面大小),并予以程序实现。
并产生一个 需要访问的指令地址流。
它是一系列需要访问的指令的地址。
为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。
2.页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。
而不再判断它是否被改写过,也不将它写回到辅存。
3.系统运行既可以在Windows,也可以在Linux。
三、实验流程图
图1页式存储管理程序参考流程
四、实验环境
硬件设备:
个人计算机。
系统软件:
windows操作系统,VisualC++6.0编译环境。
五、实验结果
说明:
模拟产生35个指令地址,随机产生20个指令地址进行排队,假设主存中共有10个工作集页帧。
将前9个指令调入内存,因为前9个指令中,页号为13的指令有两个,所以调入内存中共有8页。
此时主存中还有两个空闲帧。
此时按刚才随机顺序进行访问指令工作。
前9页因都在主存中可直接调用。
第10个随机地址为页号为5的指令,也在主存中,也可直接调用。
页号为24,3因不在主存中,需要调用进主存。
此时主存已满。
然后主存需要进行调用页号为27号的指令,因主存已满,需要执行FIFO算法,将最先进入主存的页号为30的指令调出,将27号放入第1000000帧。
以后需要调用的页面按照存在就无需调用,否则按FIFO原则进行调页工作。
六、实验感想
七、实验代码
#include
#include
#include
#include
#include
#include
//#include
usingnamespacestd;
#definePAGETABLE_NUM 35 //模拟进程的页表表项数量;
#defineAVAILABLEFRAME_NUM 10 //主存中固定工作集页帧的数量;
#defineRANDOMNUMBER_NUM 20 //产生随机指令地址的数量;
structPageTableEntry
{
unsignedintFrameNum;
boolPressent;
};
voidInitRandomAddr(vector
voidInitIdleFrameQueue(queue
voidInitPageTable(vector
voidSetPTE(PageTableEntry&PTE);
intmain()
{
inta;
//初始化RANDERNUMBER_NUM条随机的32位指令地址;
vector
InitRandomAddr(RandomAddr);
//初始化FIFS指针;
vector
:
iteratorFIFS_pintor;
FIFS_pintor=RandomAddr.begin();
//初始空闲帧队列;
queue
InitIdleFrameQueue(IdleFrameQueue);
//初始进程页表(模拟进程初始时,工作集已经使用至少10个页帧);
vector
InitPageTable(PageTable,RandomAddr,IdleFrameQueue,ActiveFrameQueue);
//Test
cout<<"开始访问指令地址\n";
vector
:
iteratorpt_RandomAddr;
for(pt_RandomAddr=RandomAddr.begin();pt_RandomAddr!
=RandomAddr.end();pt_RandomAddr++)
{
unsignedintPageNum=(*pt_RandomAddr)>>12;
cout<<"地址:
0x"< "< 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 { cout<<"调入所需页到空闲页\t"; //调入当前所需的页到空闲页中; unsignedintFrame_Num; Frame_Num=IdleFrameQueue.front(); IdleFrameQueue.pop(); PageTable[PageNum].FrameNum=Frame_Num; PageTable[PageNum].Pressent=1; ActiveFrameQueue.push(Frame_Num); } } else cout<<"\t该页在主存"; cout<<"\t帧号: "< } return0; } voidInitRandomAddr(vector { cout<<"生成随机指令地址\n"; vector : iteratorpd; srand((unsigned)time(NULL)); for(pd=RandomAddr.begin();pd! =RandomAddr.end();pd++) { //产生随机页号0~PAGETABLE_NUM-1; unsignedintHigh_20=rand()%PAGETABLE_NUM; //产生随机偏移量0~4095; unsignedintLow_12=rand()%4096; unsignedintAddr=(High_20<<12)|Low_12; *pd=Addr; cout<<"随机指令地址: 0x"< : uppercase|ios: : fixed)< "< 0x"< } } voidInitIdleFrameQueue(queue { //帧号从0~1048575,这里取1000000~1000016; for(unsignedintFrameNum=1000000;FrameNum<1000000+AVAILABLEFRAME_NUM;FrameNum++) IdleFrameQueue.push(FrameNum); } voidInitPageTable(vector { cout<<"初始化页表;\n"; for_each(PageTable.begin(),PageTable.end(),SetPTE); unsignedintPage_Num,Frame_Num; for(intcount=0;count<9;count++) { while(true) { Page_Num=RandomAddr[count]>>12; 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); //记录活动页帧; cout<<"将模拟进程的第"< "< } } cout<<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北理工 操作系统 内存 管理 实验 报告