1、图1 页式存储管理程序参考流程四、实验环境硬件设备:个人计算机。系统软件:windows操作系统,Visual C+6.0编译环境。五、实验结果说明:模拟产生35个指令地址,随机产生20个指令地址进行排队,假设主存中共有10个工作集页帧。将前9个指令调入内存,因为前9个指令中,页号为13的指令有两个,所以调入内存中共有8页。此时主存中还有两个空闲帧。此时按刚才随机顺序进行访问指令工作。前9页因都在主存中可直接调用。第10个随机地址为页号为5的指令,也在主存中,也可直接调用。页号为24,3因不在主存中,需要调用进主存。此时主存已满。然后主存需要进行调用页号为27号的指令,因主存已满,需要执行FI
2、FO算法,将最先进入主存的页号为30的指令调出,将27号放入第1000000帧。以后需要调用的页面按照存在就无需调用,否则按FIFO原则进行调页工作。六、实验感想七、实验代码#include iomanipstdlib.htime.h vectorqueue/#include using namespace std ;#define PAGETABLE_NUM35/模拟进程的页表表项数量;#define AVAILABLEFRAME_NUM10/主存中固定工作集页帧的数量;#define RANDOMNUMBER_NUM20/产生随机指令地址的数量;struct PageTableEntryu
3、nsigned int FrameNum ;bool Pressent ;void InitRandomAddr(vector &RandomAddr) ;void InitIdleFrameQueue(queueIdleFrameQueue) ;void InitPageTable(vectorPageTable, vectorRandomAddr, queueIdleFrameQueue, queueAvtiveFrameQueue) ;void SetPTE(PageTableEntry &PTE) ;int main()int a ;/初始化RANDERNUMBER_NUM条随机的32
4、位指令地址;vector RandomAddr(RANDOMNUMBER_NUM) ;InitRandomAddr(RandomAddr) ;/初始化FIFS指针;:iterator FIFS_pintor ;FIFS_pintor = RandomAddr.begin() ;/初始空闲帧队列;queue IdleFrameQueue, ActiveFrameQueue ;InitIdleFrameQueue(IdleFrameQueue) ;/初始进程页表(模拟进程初始时,工作集已经使用至少10个页帧); PageTable(PAGETABLE_NUM) ;InitPageTable(Pag
5、eTable, RandomAddr, IdleFrameQueue, ActiveFrameQueue) ;/Testcout 12 ;cout地址:0xhex*pt_RandomAddrdect页号:PageNum;if ( PageTablePageNum.Pressent = 0 )/该页不在主存中 ;coutt该页不在主存,;if (IdleFrameQueue.empty()/工作集空闲页帧已用完;cout 12.Pressent = 0 ;/标记此页已经被置换出主存;/置换进新页;PageTablePageNum.FrameNum = Frame_Num ;PageTablePa
6、geNum.Pressent = 1 ;ActiveFrameQueue.push(Frame_Num) ;/移动FIFS指针 ;FIFS_pintor+ ;else调入所需页到空闲页t/调入当前所需的页到空闲页中;Frame_Num = IdleFrameQueue.front() ;IdleFrameQueue.pop() ; elset该页在主存t帧号:PageTablePageNum.FrameNumendl ;return 0 ;RandomAddr) 生成随机指令地址 niterator pd ;srand( (unsigned)time( NULL ) );for( pd = R
7、andomAddr.begin(); pd ! pd+ )/产生随机页号0PAGETABLE_NUM - 1;unsigned int High_20 = rand() % PAGETABLE_NUM ;/产生随机偏移量04095 ;unsigned int Low_12 = rand() % 4096 ;unsigned int Addr = (High_20 12) | Low_12 ;*pd = Addr ;随机指令地址:setw(8)setfill(0) setiosflags(ios:uppercase | ios:fixed)*pdHigh_20t偏移量:Low_12IdleFra
8、meQueue)/帧号从01048575,这里取10000001000016;for ( unsigned int FrameNum = 1000000; FrameNum 1000000 + AVAILABLEFRAME_NUM; FrameNum+ )IdleFrameQueue.push(FrameNum) ;AvtiveFrameQueue) 初始化页表; nfor_each(PageTable.begin(), PageTable.end(), SetPTE) ;unsigned int Page_Num, Frame_Num ;for ( int count = 0; count if ( PageTablePage_Num.Pressent != 0 )break ;Frame_Num = IdleFrameQueue.front() ;IdleFrameQueue.pop() ;PageTablePage_Num.FrameNum = Frame_Num ;/设置页帧号;PageTablePage_Num.Pressent = 1 ;/标记页帧在主存中;AvtiveFrameQueue.push(Frame_Num) ;/记录活动页帧;将模拟进程的第Page_Num页初始化至主存中,帧号为:Frame_Numendl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1