某学院操作系统课程设计报告(存储管理实验)内容摘要:

uction* 100% 结束 从 main[] 获取一个 CPU待处理得页面号 Y 该 page[]单元是否在内存中。 将内存页面和待处理的进程页面建立联系 是否有位 于内存中、以后 CPU不再处理的页面。 pagecontrol是否占满。 将其换出 找出 CPU最晚处理到的页面,将其换出 【 代码 】 文件: ifndef _PAGE_H //(条件编译命令)如果 —— PAGE_H 之前未被定义则编译 define_page_h define _PAGE_H //宏定义 class CPage { public: //以下的为公用部分 int m_nPageNumber, m_nPageFaceNumber, m_nCounter, m_nTime。 // 以上是定义 4 个类成员 ,都定义为整形变量 }。 endif 文件 : ifndef _PAGECONTROL_H //若 _PAGECONTROL_H 之前的未被定义则编译 define_pagecontrol_h define _PAGECONTROL_H class CPageControl { public: int m_nPageNumber,m_nPageFaceNumber。 class CPageControl * m_pNext。 //类似于一个结构体 }。 endif 文件 : ifndef _MEMORY_H //(条件编译)若 _MEMORY_H之前没被定义过,则编译 ifndef _MEMORY_H define _MEMORY_H //宏定义 class CMemory { //声明一个名为 CMemory 的类 public: //声明以下部分为公有的(即公有部分) CMemory()。 //构造函数 void initialize(const int nTotal_pf)。 //初始化函数对相关页面赋值 void FIFO(const int nTotal_pf)。 //先进先出的算法 void LRU(const int nTotal_pf)。 //最近最少使用的算法 void NUR(const int nTotal_pf)。 //最近未使用算法 void OPT(const int nTotal_pf)。 //最佳置换算法 //以上是对构造函数的原型声明 private: //声明以下部分为私有的成员变量 vectorCPage _vDiscPages。 vectorCPageControl _vMemoryPages。 //以上是分别创建两个向量的对象 ,_vDiscPages 和 _vMemoryPag CPageControl *_pFreepf_head,*_pBusypf,*_pBusypf_tail。 //定义 3 个指针变量,依次是空页面头的指针, 忙页面头的指针,忙页尾的指针 vector〈 int〉 _vMain,_vPage,_vOffset。 //定义 3 个增长数组 int _nDIseffect。 //定义一个整型变量,表示页面换入的次数 }。 CMemory::CMemory():_vDicsPages(TOTAL_VP), //以下是对构造函数里 用到的成员函数 _vMemoryPages(TOTAL_VP), //内存也 _vMain(TOTAL_VP), _vPage(TOTAL_INSTRUCTION), _vOffset(TOTAL_INSTRUCTION), //Offset 是, 320 份中每页的平均偏移量 int s,i nRand。 //定义 3 个整型变量,以备下面计 算随机序列所用 srand(getpid()*10)。 //以 getpid()*10 为种子产生随机数 nRand=rand()%32767。 //根据前面的种子,返回一个随机数, 对其取模余后赋给 nRand s=(float)319*nRand/32767+1。 //计算 s for(i=0。 iTOTAL_INSTRUCTION。 i+=4) { _vMain[i]=s。 //将 s 赋给随即序列 _vMain[i+1]= _vMain[i]+1。 nRand=rand()%32767。 _vMain[i+2]=(float)_vMain[i]*nRand/32767。 _vMain[i+3]= _vMain[i+2]+1。 nRand=rand()%32767。 s=(float)nRand*(318_vMain[i+2])/32767+_vMain[i+2]+2。 } for(i=0。 iTOTAL_INSTRUCTION。 i++) { _vPage= _vMain[i]/10。 _vOffset[i]= _vMain[i]%10。 //偏移量为随即序列对 10 取模余 _vPage[i]%=32。 } }/* 以上程序用于产生一个随机的进程页面序列 */ void CMemory::initialize(const nt nToatl_pf) { //对构造函数 initialize 的定义 int ix。 //定义一个临时变量 _nDiseffect=0。 //初始化页面换入次数为零 for(ix=0。 ix()。 ix++) { //for 循环,如果 ix 少于物理页的 size,则进行下面操作 _vDiscPages[ix].m_nPageNumber=ix。 //将 ix 赋为进程页面的页号 _vDiscPages[ix].m_nPageFaceNumber=INVALID。 //初始化页面号码为 INVALID,此时没把页面调入内存 _vDiscPages[ix].m_nCounter=0; //计数器初始化为零 _vDiscPages[ix].m_ntime=1。 //m_nTime 是一个用来记录某页面多久没被 CPU 使用的属性, 将其初始化为 1 } for(ix=1。 ixnTotal_pf。 ix++) { //当 ix 少于总共页面数时,执行 for 循环 _vMemoryPages[ix].m_pNext=amp。 _vMemoryPages[ix]。 //将内存页的地址赋给它的下一页 _vMemoryPages[ix].m_nPageFaceNumber=ix1。 //内存页面号码为 ix1 }/*此时,跳出 for 循环 */ _vMemoryPages[nTotal_pf1].m_pNext=NULL。 //内存最后一页的所指向的下一页为空 _vMemoryPages[nTotal_pf1].m_nPageFaceNumber=nTotal_pf1。 //内存最后一页的页面号码为 nTotal_pf1 _pFreepf_head=amp。 _vMemoryPages[0]。 //将空页面的头指针指向内存页中下标为 0 的那一页 } /*initialize () 是对程序执行前进行初始化,尚未有页面调入内存 *? void CMemory::FIFO(const int nTotal_pf) { int i。 CPageControl *p。 //定义 CPageControl 的指针 P initialize(nTotal_pf)。 //调用构造函数 initialize() _pBustpf_head=_pBustpf_tail=NULL。 //忙时的头指针和忙时的尾指针置空 for(i=0。 iTOTAL_INSTRUCTION。 i++){ //调入内存的次数 i 小于页面使用总数,执行 for 语句 if(_vDiscPages[_vPage[i]].m_nPageFageNumber==INVALID) //要调入的页面号不存在内存页面中,则执行 if 语句 { _nDiseffect+=1。 //页面交换总数加 1 if(_pFreepf_head==NUL。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。