1、2. 关键代码8五、设计结果22六、设计体会24七、附录24一、设计题目第15题:1. 建立相应的数据结构;2. 在屏幕上显示页面的状况;3. 时间的流逝可以用下面几种方法模拟:(a) 按键盘,每按一次可以认为过一个时间单位;(b) 相应WM_TIMER;4. 将一批页的置换情况存入磁盘文件,以后可以读出并重放;5. 计算页面的缺页次数、缺页后的页面置换次数;6. 支持算法:FIFO、LRU、最佳置换算法。二、开发环境与工具开发环境:Windows开发工具:VC6.0 、 Eclipse三、设计原理1.最佳(Optimal)置换算法最佳置换算法是由Belady于1966年提出的一种理论上的算法
2、。其所选择的被淘汰页面将是以后永不使用的,或是在未来最长时间内不再被访问的页面。采用最佳置换算法通常可以保证获得最低的缺页率,但由于人们目前还无法预知,一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以用该算法去评价其他算法。现举例说明如下:假定系统为某进程分配了三个物理快,并考虑有以下的页面号引用串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运行时,先将7,0,1三个页面放入内存。以后,当进程要访问页面2时,将会产生缺页中断。此时OS根据最佳置换算法将将选择页面7予
3、以淘汰。这是因为页面0将作为第5个被访问的页面,页面1是第14个被访问的页面,而页面7则要在第18次页面访问是才需调入。下次访问页面0时,因它已在内存而不必产生缺页中断。当进程访问页面3时,又讲引起页面1被淘汰;因为它在现在的1,2,0三个页面中,将是以后最晚才被访问的。图1示出了采用最佳置换算法时的置换图。由图可以看出,采用最佳置换算法发生了6次页面置换。 页面号71234物理快1物理快2物理快32.先进先出(FIFO)页面置换算法FIFO算法是最早出现的置换算法,该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面予以淘汰。该算法实现简单,只需要把已经调入内存的页面按先后次序
4、排成一个队列,当发生缺页时,将队首页面出队,再将找到的页面入队,这样就完成了页面置换的任务。以书上的为例有如下表格:70 1 2 0 3 4 2 30 3 2 1 2 0 1 7 0 但该算法与程序的运行规律不相适应,它忽视了程序运行的局部性原理。有可能造成需要访问的页面经常性的被置换。3.最近最久未使用(LRU)页面置换算法FIFO算法性能较差,它是根据页面进入的先后次序进行置换,并不能反映页面的使用情况。最近最久未使用(LRU)算法的基本思想是利用“最近的过去”来预测“最近的未来”,这个也是根据程序运行的局部性原理。由于最佳置换算法只有理论价值,实际系统中是无法使用的,所以就利用最近的过去
5、来预测未来。该算法每访问一个字段,记录一个自上次以来被访问以来所经历的时间t。当需要淘汰一个页面时,选择所有页面中t值最大的,即最近最久未使用的页面予以置换。以书上为例,有如下表格:四、重要算法1.算法流程图FIFO算法流程图:Yi+把pi的内容直接装入最上面一个空内存块,i+把page中最先装入的页面置换出去.i+Page是否有空当前p中第i个元素是否已在内存中页面走向存入数组p中,内存块用page表示初始化为0开始N输出当前内存块状态结束LRU算法流程图: 开始当前p中第i个元素是否已在内存把page中最近最久未使用的页面置换出去.i+OPT算法流程图: 结束把page中以后一段时间都不使
6、用或是使用时间离现在最远的换出.i+2. 关键代码1. FIFO算法代码:public class FIFOControl /private int num = 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1;/使用无参构造函数private int num = new int50;private int numLength;private int pg = new int10;private int timepg = new int10;private int PageNum;public int store;FIFOControl()this.PageNum
7、 = 3;numLength = 20;int numtemp = 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1;for( int i = 0; i numLength; i+ )numi = numtempi;for(int i = 0; 10; i+)pgi = -1;timepgi = 1;store = new intnumLengthPageNum+1;for( int i = 1; PageNum+1;for( int j = 0; j j+ )storeji = -1;for( int k = 0; k k+ )storek0 = 0;FIFOC
8、ontrol( int nump, int n, int nlength )/参数:1.物理块数 2.页面序列号 3.页面序列号数组长度 meiyongthis.PageNum = nump;numLength = nlength;for(int j = 0; nlength; j+)numj = nj;private boolean checkInPage( int p, int plength, int keynum )for( int jj = 0; jj plength; jj+)timepgjj+;if( keynum = pj )return true;return false;private void caculate()/将物理页框装满int timer = 0;/横着的指针 PageNum;pgi = numi; i; j+)/加时间timepgj+;for(int jj = 0; jj+)/数据放到store中去storetimerjj+1 = pgjj;timer+;/把后面的数据按先进先出的顺序放到物理块中for( int i = PageNum;if( checkIn
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1