LRU页面调度算法实现
LRU页面调度算法实现学院计算机科学与技术专业计算机科学与技术学号学生姓名指导教师姓名2014年3月16 日目录1.实验要求 (2)2.实验目的 (2)3.实验内容 (2)4.相关知识 (2)5.实验原理 (3)6.流程图 (4)7.源代码 (5)8.运行结果 (9)9.实验心得 (10)10.参考文献 (11)LRU页调度算法实现一实验要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
2.对系统进行功能模块分析、画出总流程图和各模块流程图。
3.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单。
4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
5.所有程序需调试通过。
二实验目的:将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
进一步巩固和复习操作系统的基础知识。
培养学生结构化程序、模块化程序设计的方法和能力。
提高学生调试程序的技巧和软件设计的能力。
提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。
三实验内容:程序应模拟实现LRU 算法思想,对n个页面实现模拟调度。
四相关知识:1.虚拟存储器的引入:局部性原理:程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:时间局限性和空间局限性。
2.虚拟存储器的定义:虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。
3.虚拟存储器的实现方式:分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。
请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。
五.实验原理:目前有许多页面调度算法,本实验主要涉及最近最久未使用调度算法。
本实验使用页面调度算法时作如下假设,进程在创建时由操作系统为之分配一个固定数目物理页,执行过程中物理页的数目和位置不会改变。
也即进程进行页面调度时只能在分到的几个物理页中进行。
LRU基本思想:LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。
关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。
而内存的虚拟存储管理,是现在最通用,最成功的方式——在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。
这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。
虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。
LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。
这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。
因此,我们只需要在每次调换时,找到最近最少使用的那个页面调出内存。
这就是LRU算法的全部内容。
实验中是用一维数组page[pSIZE]存储页面号序列,memery[mSIZE]是存储装入物理块中的页面。
数组flag[10]标记页面的访问时间。
每当使用页面时,刷新访问时间。
发生缺页时,就从物理块中页面标记最小的一页,调出该页,换入所缺的页面。
六流程图:图1 实验流程图七源代码#include <stdio.h>#include <stdlib.h>int mSIZE; /*物理块数*/int pSIZE; /*页面号引用串个数*/int memory[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; /*物理块中的页号*/ int page[100]={0}; /*页面号引用串*/int temp[100][10];void Delay();void LRU();void design();void display(int m);void main(){int i,j,code;design();printf(" 请按任意键进行初始化操作... \n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━\n"); printf(" >>>");getchar();system("cls");printf("请输入物理块的个数(M<=10):");scanf("%d",&mSIZE);printf("请输入页面号引用串的个数(P<=100):");scanf("%d",&pSIZE);puts("请依次输入页面号引用串:");for(i=0;i<pSIZE;i++)scanf("%1d",&page[i]);for(i=0;i<100;i++)for(j=0;j<10;j++)temp[i][j]=-1;system("cls");do{printf("* * * * * * * * * * * * * * * * * * * * **\n");printf("* 请选择页面调度算法:\t\t\t *\n");printf("* --------------------------------------- \n");printf("* 1.最近最久未使用(LRU) *\n");printf("* 0.退出 *\n");printf("* * * * * * * * * * * * * * * * * * * * * *\n");printf("请选择操作:[ ]\b\b");scanf("%d",&code);switch(code){case 1:LRU();system("pause");system("cls");break;case 0:printf("┃谢谢使用! ┃\n");printf("┗━━━━━━━━━━━━━━━━┛\n");exit(0);default:printf("输入错误,请重新输入:");}printf("按任意键重新选择置换算法:>>>");getchar();system("cls");}while (code!=2);getchar();}void design(){printf("┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃页面调度算法┃\n"); printf("┃班级:11非师┃ \n");printf("┃学号:20111202005 ┃\n");printf("┣━━━━━━━━━━━━━━━━━━━━━━━┫\n");}void display(int m){int i,j,k;for(k=0;k<pSIZE;k++){printf("%d ",page[k]);}printf("\n");for(j=0;j<mSIZE;j++){for(i=0;i<pSIZE;i++){if(temp[i][j]==-1)printf(" ");elseprintf("|%d| ",temp[i][j]);}printf("\n");}printf("----------------------------------------\n");printf("缺页次数:%d\t\t",m+mSIZE);printf("缺页率:%d%%\n",(m+mSIZE)*100/pSIZE);printf("访问次数:%d\t\t",pSIZE-(m+mSIZE));printf("访问命中率:%d%%\n",(pSIZE-(m+mSIZE))*100/pSIZE);printf("----------------------------------------\n");}/*最近最久未使用置换算法*/void LRU(){int memory[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};int flag[10]={0}; /*记录进入物理块的时间*/int i,j,m;int max=0; /*记录换出页*/int count=0; /*记录置换次数*/int t=1; //用来记录已经存入数的物理块数;memory[0]=page[0];temp[0][0]=page[0];for(i=1;i<pSIZE;i++){for(j=0;j<mSIZE;j++){if(page[i]==memory[j]){flag[j]=i;break;}}if(page[i]==memory[j])continue;if(page[i]!=memory[j])//不在物理块中{if(t<mSIZE){for(int k=0;k<mSIZE;k++){if(memory[k]==-1){memory[k]=page[i];flag[k]=i;t++;break;}}for(j=0;j<mSIZE;j++)temp[i][j]=memory[j];}if(t==mSIZE){t++;continue;}if(t>=mSIZE) //物理块中已满{count++;max=flag[0]<flag[1]?0:1;for(m=2;m<mSIZE;m++)if(flag[m]<flag[max])max=m;memory[max]=page[i];flag[max]=i; //记录该页进入物理块的时间 for(j=0;j<mSIZE;j++)temp[i][j]=memory[j];}}}display(count);}八运行结果运行环境——Visual C++ 6.01.进入界面2.算法演示结果:3.退出程序:九实验心得通过此次的实验,我更加了解了全局替换策略,了解到先进先出页面替换算法总是淘汰最先调入主存的页面,淘汰主存中驻留时间最长的页面。
OPT、FIFO、LRU算法的实现
OPT、FIFO、LRU算法的实现⼀、实验⽬的1. 了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中⼏种基本页⾯置换算法的基本思想和实现过程,并⽐较它们的效率。
2. 了解程序设计技术和内存泄露的原因⼆、实验内容模拟实现请求页式存储管理的⼏种基本页⾯置换算法最佳淘汰算法(OPT)先进先出的算法(FIFO)最近最久未使⽤算法(LRU)三、实验原理1. 虚拟存储系统UNIX中,为了提⾼内存利⽤率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进⾏;⼀个进程只需将其⼀部分(段或页)调⼊内存便可运⾏;还⽀持请求调页的存储管理⽅式。
当进程在运⾏中需要访问某部分程序和数据时,发现其所在页⾯不在内存,就⽴即提出请求(向CPU发出缺中断),由系统将其所需页⾯调⼊内存。
这种页⾯调⼊⽅式叫请求调页。
为实现请求调页,核⼼配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。
2. 页⾯置换算法当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转⼊缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调⼊内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出⼀页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调⼊,修改页表。
利⽤修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页⾯的调⼊过程对⽤户是透明的。
最佳淘汰算法(OPT):选择永不使⽤或在未来最长时间内不再被访问的页⾯予以替换。
先进先出的算法(FIFO):选择在内存中驻留时间最久的页⾯予以替换。
最近最久未使⽤算法(LRU):选择过去最长时间未被访问的页⾯予以替换。
3. ⾸先⽤srand( )和rand( )函数定义和产⽣指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
(1)通过随机数产⽣⼀个指令序列,共320条指令。
【算法】页面置换算法FIFO、LRU和LFU的概述以及实现方式
【算法】页⾯置换算法FIFO、LRU和LFU的概述以及实现⽅式【算法】页⾯置换算法FIFO、LRU和LFU的概述以及实现⽅式页⾯置换算法,我们最常⽤的页⾯置换算法包括FIFO先来先服务,LRU最近最久未被使⽤,LFU最近最少被使⽤以及我们的时钟置换算法。
⼀、FIFO算法——先来先服务1、简述FIFO算法FIFO算法是我们⽐较简单的置换算法,就是先来先服务或者说是先进先出。
也就是说在进⾏页⾯置换的时候,最先来的那个会被最先置换出去。
先进⼊的指令先完成并引退,跟着才执⾏第⼆条指令。
2、FIFO算法的简单实现FIFO算法的简单实现:可以通过维护⼀个链表结构去存储当前调⼊的页⾯;将最先进⼊的页⾯维护在链表的最前,最后进⼊的页⾯维护在链表的最后;这样,当发⽣缺页中断时,需要进⾏置换的时候,淘汰表头的页⾯并将新调⼊的页⾯加到链表的尾部;当然除了链表以外我们还可以采⽤数组或者队列等来进⾏实现。
3、FIFO算法的特点(1)FIFO算法实现简单,易于理解易于编程。
FIFO算法实现简单,⽆须硬件⽀持,只需要⽤循环数组管理物理块即可。
(2)FIFO算法可能会出现Belady现象。
也就是在FIFO算法中,如果未分配够⼀个进程所要求的页⾯,有时就会出现分配的页⾯数增多,却也率反⽽增加Belady现象。
(3)FIFO算法可能会置换调重要的页⾯,其效率不⾼。
(4)在FIFO算法可能中会导致多次的页⾯置换。
当页⾯置换的时间⼤于所要操作的时间的时候,这时候其效率就会很低。
当其不停的进⾏页⾯置换的时候会出现⼤量的系统抖动现象。
⼆、LRU算法——最近最久未被使⽤1、简述LRU算法LRU算法是最近最久未被使⽤的⼀种置换算法。
也就是说LRU是向前查看。
在进⾏页⾯置换的时候,查找到当前最近最久未被使⽤的那个页⾯,将其剔除在内存中,并将新来的页⾯加载进来。
2、LRU算法的实现LRU的实现就相对于FIFO的实现复杂⼀点。
我们可以采⽤哈希映射和链表相结合。
用JAVA实现操作系统先进先出和LRU调度算法
FIFO调度算法的实现======================================================================= //1:访问内存//如果在内存,输出//如果不在内存,判断内存是否已满//如果满了,将第一个元素挤出,其他元素迁移,再把访问的元素放入队尾//再将内存中的元素输出//如果没满,找到第一个内存空快,并把元素放入该空快,跳出//输出内存中的元素import java.util.*;public class fifo {private static final String end = null;int[] page;int[] ram;public void initpages(int a)//初始化页面{t his.page=new int[a];for(int i=0;i<a;i++){page[i]=i;}}////////////////////////////////////public void intram(int a)//初始化内存{t his.ram =new int[a];f or(int i=0; i<a; i++){ram[i]=-1;}}///////////////////////////////////public void visitpage(int a)// 访问内存中的页面{if (a>=0&&a<page.length)//判断输入的页面号范围{i nt exit_element;f or(int i=0;i<=ram.length-1;i++){exit_element=ram[i];//////if (exit_element==a)//内存中存在访问的页面{for(int j=0;j<=ram.length-1; j++)//输出内存中的页面{if (ram[j]==-1){System.out.print(" null");}elseSystem.out.print(" "+ram[j]);//输出内存中的页面 }break;//跳出循环体,visitpage结束}/////else if(i==ram.length-1&& ram[i]==-1)//内存未满{for(int r=0;r<=ram.length-1;r++){if (ram[r]==-1){ram[r]=a;//将页面调入第一个空内存块break;//跳出}}for(int j=0;j<=ram.length-1; j++)//输出内存中的页面{if(ram[j]==-1){System.out.print(" null");}elseSystem.out.print(" "+ram[j]);//输出内存中的页面}}//////else if(i==ram.length-1&& ram[i]!=-1)//内存已满{for(int j=0;j<ram.length-1;j++)//先进先出置换{ram[j]=ram[j+1];}ram[ram.length-1]=a; //页面调入内存f or(int r=0; r<=ram.length-1;r++)//输出内存页面中的{System.out.print(" "+ram[r]);}b reak; //跳出循环体,visitpage结束}/////////////else{}}}//访问页面越界elseS ystem.out.println("\n 页面访问不存在!");}public static void main(String[] args){fifo jhy = new fifo();int page;int ramnumber;int visit_pagenumber;System.out.println("请输入页面数:");Scanner input1 = new Scanner(System.in);page=input1.nextInt();jhy.initpages(page);System.out.println("请输入内存块的个数:");Scanner input2 = new Scanner(System.in);ramnumber=input2.nextInt();jhy.intram(ramnumber);while(1==1){System.out.println("\n 请输入访问的页面号");Scanner input3 =new Scanner(System.in);visit_pagenumber=input3.nextInt();jhy.visitpage(visit_pagenumber);}}}运行结果:请输入页面数:8请输入内存块的个数:4请输入访问的页面号11 null null null请输入访问的页面号31 3 null null请输入访问的页面号1 3 4 null请输入访问的页面号51 3 4 5请输入访问的页面号63 4 5 6请输入访问的页面号33 4 5 6请输入访问的页面号43 4 5 6请输入访问的页面号74 5 6 7请输入访问的页面号8页面访问不存在!请输入访问的页面号35 6 7 3请输入访问的页面号2LRU调度算法的实现//1:访问内存//如果在内存,将它后面的非空块的值往前移,它放入最后一个非空块,再输出//如果不在内存,判断内存是否已满//如果满了,将第一个元素挤出,其他元素迁移,再把访问的元素放入队尾//再将内存中的元素输出//如果没满,找到第一个内存空快,并把元素放入该空快,跳出//输出内存中的元素import java.util.*;public class lru {private static final String end = null;int[] page;int[] ram;public void initpages(int a)//初始化页面{t his.page=new int[a];for(int i=0;i<a;i++){page[i]=i;}}////////////////////////////////////public void intram(int a)//初始化内存{t his.ram =new int[a];f or(int i=0; i<a; i++){ram[i]=-1;}}///////////////////////////////////public void visitpage(int a)// 访问内存中的页面{if (a>=0&&a<page.length)//判断输入的页面号范围{i nt exit_element;f or(int i=0;i<=ram.length-1;i++){exit_element=ram[i];//////if (exit_element==a)//内存中存在访问的页面{int r=i;if(ram[ram.length-1]==-1)//内存没满,进入,找到最后一个非空的元素的下标{while(ram[r]!=-1 && r<ram.length-1){r++; //r 为第一个非空内存块的下标+1}}else{w hile(r<ram.length)r++; //r 为第一个非空内存块的下标+1}int k=r;for(int j=i;j<k-1;j++)//Lru移位{ram[j]=ram[j+1];}ram[r-1]=a;for(int j=0;j<=ram.length-1; j++)//输出内存中的页面{if (ram[j]==-1){System.out.print(" null");}elseSystem.out.print(" "+ram[j]);//输出内存中的页面 }break;//跳出循环体,visitpage结束}/////else if(i==ram.length-1&& ram[i]==-1)//内存未满{for(int r=0;r<=ram.length-1;r++){if (ram[r]==-1){ram[r]=a;//将页面调入第一个空内存块break;//跳出}}for(int j=0;j<=ram.length-1; j++)//输出内存中的页面{if(ram[j]==-1){System.out.print(" null");}elseSystem.out.print(" "+ram[j]);//输出内存中的页面}}//////else if(i==ram.length-1&& ram[i]!=-1)//内存已满{for(int j=0;j<ram.length-1;j++)//Lru置换{ram[j]=ram[j+1];}ram[ram.length-1]=a; //页面调入内存f or(int r=0; r<=ram.length-1;r++)//输出内存页面中的{System.out.print(" "+ram[r]);}b reak; //跳出循环体,visitpage结束}/////////////else{}}}//访问页面越界elseS ystem.out.println("\n 页面访问不存在!");}public static void main(String[] args){lru jhy = new lru();int page;int ramnumber;int visit_pagenumber;System.out.println("请输入页面数:");Scanner input1 = new Scanner(System.in);page=input1.nextInt();jhy.initpages(page);System.out.println("请输入内存块的个数:");Scanner input2 = new Scanner(System.in);ramnumber=input2.nextInt();jhy.intram(ramnumber);while(1==1){System.out.println("\n 请输入访问的页面号");Scanner input3 =new Scanner(System.in);visit_pagenumber=input3.nextInt();jhy.visitpage(visit_pagenumber);}}}运行结果:请输入页面数:8请输入内存块的个数:4请输入访问的页面号11 null null null请输入访问的页面号21 2 null null请输入访问的页面号31 2 3 null请输入访问的页面号21 32 null请输入访问的页面号13 2 1 null请输入访问的页面号53 2 1 5请输入访问的页面号62 1 5 6请输入访问的页面号52 1 6 5请输入访问的页面号8页面访问不存在!。
操作系统页面置换算法(opt,lru,fifo,clock)实现
操作系统页⾯置换算法(opt,lru,fifo,clock )实现选择调出页⾯的算法就称为页⾯置换算法。
好的页⾯置换算法应有较低的页⾯更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页⾯先调出。
常见的置换算法有以下四种(以下来⾃操作系统课本)。
1. 最佳置换算法(OPT)最佳(Optimal, OPT)置换算法所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。
但由于⼈们⽬前⽆法预知进程在内存下的若千页⾯中哪个是未来最长时间内不再被访问的,因⽽该算法⽆法实现。
最佳置换算法可以⽤来评价其他算法。
假定系统为某进程分配了三个物理块,并考虑有以下页⾯号引⽤串: 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运⾏时,先将7, 0, 1三个页⾯依次装⼊内存。
进程要访问页⾯2时,产⽣缺页中断,根据最佳置换算法,选择第18次访问才需调⼊的页⾯7予以淘汰。
然后,访问页⾯0时,因为已在内存中所以不必产⽣缺页中断。
访问页⾯3时⼜会根据最佳置换算法将页⾯1淘汰……依此类推,如图3-26所⽰。
从图中可以看出⾤⽤最佳置换算法时的情况。
可以看到,发⽣缺页中断的次数为9,页⾯置换的次数为6。
图3-26 利⽤最佳置换算法时的置换图2. 先进先出(FIFO)页⾯置换算法优先淘汰最早进⼊内存的页⾯,亦即在内存中驻留时间最久的页⾯。
该算法实现简单,只需把调⼊内存的页⾯根据先后次序链接成队列,设置⼀个指针总指向最早的页⾯。
但该算法与进程实际运⾏时的规律不适应,因为在进程中,有的页⾯经常被访问。
图3-27 利⽤FIFO 置换算法时的置换图这⾥仍⽤上⾯的实例,⾤⽤FIFO 算法进⾏页⾯置换。
进程访问页⾯2时,把最早进⼊内存的页⾯7换出。
然后访问页⾯3时,再把2, 0, 1中最先进⼊内存的页换出。
操作系统课程设计面置换算法LRU算法
实验报告实验说明:执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页 面,腾出1个空闲块以便存放新调入的页面。
淘汰哪个页面的首要问题是 选择何种置换算法。
该程序采用LRU 方法选择,依置换策略选择一个可置 换的页面并计算它们的缺页率以便比较。
包括实验内容及条件) 主要参考书 计算机操作系统原理 操作系统 算法流程图:西安大学出版社 电子工业出版社 汤子涵主编 William Stallings 著主更算法流程图(包括实验步骤int ijndex=-l;for(i=0;i<M;i++){if(a[i]=-l){index=i;break:return index;void swap(int x){int i,k,temp,tempO;int index=isIn(xjeg|O]); /****判断x 是否在reg[O]数组中*******/if(index!=-l){reg[ 1 ][index]=reg[ 1 ] [index] A N; /**reg[ 1 ] [index]异或二进制数10000000**/}else{temp=isFull(reg[OJ);if(temp!=-l){ /*******内存没有满,直接调入页而************/reg[O][temp]=x;reg[ l][temp]=reg( l][tcnip]A N;}else if(temp==-l){k=min(reg[l ]);/**置换出寄存器中数值最小的对应的下标的页面***/tenipO=reg[O][k]; /*********临时保留要换出的页而号*****/ reg[O][k]=x;reg[l][k]=reg[l](kpN:printf(M the page %d is exchanged out!\n M,tempO);/******打印要置换出的页号** ******* *****/count++; /*********g 换次数加1 ♦*****♦*♦*****/ }}for(i=0;i<M;i++){reg[l][i]=reg[l][i]»l;/******** 寄存器中的所有数右移一位 *****/ }}niain(){ int x;system("cls");init();printfC^Input a sort of pages\n n); printf(v while you input -1 Jt will stop!\n H);scanf(M%d M,&x);/********输入页面号,宜到页而号为-!*♦*******/ while(x!=-l){num++; /*******输入的页而次数加1枠**#粋/swap(x);scanf(,r%d,\&x);}/** ****** *******打印缺页数和缺页率******* *** **** ****“$*/ printf(u the count of Exchanged is: %d \n H,count);printf(u the rate of exchanged is: %f\n,\count* 1.0/nuni); getch();)本次实践计划. 进度安排及完成情况05月09号商讨如何实现本次实验以及同学之间的分工. 05月10号査阅相关资料.05月16号~05月17号基本完成程序修改完善程序.代码测试.完成实验报告.主要测试方法及测试数据,包括测试结果及实验结果:Input a sort of pageswhile you input ~1 , it will stop! 712the page 7 is exchanged out!3the page 1 is exchanged out!4the page 2 is exchanged out!2the page 3 is exchanged out!43the page 0 is exchanged out!the page 2 is exchanged out!。
实验三 页面调度算法
实验报告院(系):数学与计算机科学学院专业班级:学号:姓名:实验地点:实验日期:年月日一、实验目的及要求通过本实验可以加深理解有关虚拟存储器的工作原理,进一步体会和了解页面替换算法的具体实现方法。
二、实验环境PC /Windows系统/Visual C++6.0三、实验内容①实现三种算法:先进先出;OPT;LRU②页面序列从指定的文本文件(TXT文件)中取出③输出:第一行:每次淘汰的页面号,第二行:显示缺页的总次数/*全局变量*/int mSIZE; /*物理块数*/int pSIZE; /*页面号引用串个数*/static int memery[10]={0}; /*物理块中的页号*/static int page[100]={0}; /*页面号引用串*/static int temp[100][10]={0}; /*辅助数组*//*置换算法函数*/void FIFO();void LRU();void OPT();/*辅助函数*/void print(unsigned int t);void designBy();void download();void mDelay(unsigned int Delay);/*先进先出页面置换算法*/void FIFO(){int memery[10]={0};int time[10]={0}; /*记录进入物理块的时间*/int i,j,k,m;int max=0; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];time[i]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){/*判断新页面号是否在物理块中*/for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;}if(k==mSIZE) /*如果不在物理块中*/{count++; /*计算换出页*/max=time[0]<time[1]?0:1;for(m=2;m<mSIZE;m++)if(time[m]<time[max])max=m;memery[max]=page[i];time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}else{for(j=0;j<mSIZE;j++)你temp[i][j]=memery[j];}}compute();print(count);}/*最近最久未使用置换算法*/void LRU(){int memery[10]={0};int flag[10]={0}; /*记录页面的访问时间*/int i,j,k,m;int max=0; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];flag[i]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){/*判断新页面号是否在物理块中*/for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;elseflag[j]=i; /*刷新该页的访问时间*/ }if(k==mSIZE) /*如果不在物理块中*/{count++; /*计算换出页*/ max=flag[0]<flag[1]?0:1;for(m=2;m<mSIZE;m++)if(flag[m]<flag[max])max=m;memery[max]=page[i];flag[max]=i; /*记录该页的访问时间*/ for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}elsefor(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}compute();print(count);}/*最佳置换算法*/void OPT(){int memery[10]={0};int next[10]={0}; /*记录下一次访问时间*/int i,j,k,l,m;int max; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){ /*判断新页面号是否在物理块中*/ for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;}if(k==mSIZE) /*如果不在物理块中*/{count++;/*得到物理快中各页下一次访问时间*/for(m=0;m<mSIZE;m++){for(l=i+1;l<pSIZE;l++)if(memery[m]==page[l])break;next[m]=l;}/*计算换出页*/max=next[0]>=next[1]?0:1;for(m=2;m<mSIZE;m++)if(next[m]>next[max])max=m;/*下一次访问时间都为pSIZE,则置换物理块中第一个*/ memery[max]=page[i];for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}elsefor(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}compute();print(count);}四、实验步骤页面置换:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。
(lru)的页面置换算法
LRU页面置换算法:虚拟内存中的高效内存管理LRU(Least Recently Used)页面置换算法是一种常用的页面置换算法,用于在计算机操作系统中管理虚拟内存。
当内存空间不足时,操作系统需要选择一个页面进行置换,以释放空间。
LRU算法选择最近最久未使用的页面进行置换,以减少访问冲突和提高内存利用率。
以下是LRU页面置换算法的详细解释:1.定义:LRU算法将最近使用的页面保存在内存中,而将最久未使用的页面置换出去。
这样可以确保经常访问的页面能够在内存中随时可用,从而提高程序的执行效率。
2.数据结构:为了实现LRU算法,需要使用一个数据结构来记录页面访问的顺序。
通常使用一个双向链表来实现,其中链表的每个节点代表一个页面,并包含页面标识、页面帧号、链表指针等信息。
3.访问过程:当CPU需要访问一个页面时,首先检查该页面是否在内存中。
如果页面不在内存中,则发生缺页中断,操作系统需要将某个页面置换出去,以便为新页面腾出空间。
4.置换策略:LRU算法选择最久未使用的页面进行置换。
具体实现时,可以从链表的头部开始查找,找到最早加入链表且未被访问的页面作为置换对象。
如果存在多个这样的页面,则选择最早加入链表的页面进行置换。
5.更新策略:每次访问一个页面时,需要将该页面从链表中删除,并将其重新加入到链表的头部。
这样,最近访问的页面总是在链表的头部,而最久未使用的页面则在链表的尾部。
6.性能分析:LRU算法在大多数情况下能够提供较好的性能,因为经常访问的页面往往更容易引起缺页中断。
但是,对于一些特殊的应用程序,如递归程序或循环程序,LRU算法可能无法获得最佳性能。
在这种情况下,可能需要采用其他更复杂的页面置换算法,如最近最少使用(LFU)算法或工作集算法等。
总之,LRU页面置换算法是一种简单而有效的内存管理算法,能够提高内存利用率和程序执行效率。
在实际应用中,需要根据具体的应用场景和需求选择合适的页面置换算法。
操作系统页面调度算法
{
int i;
printf("请输入作业序号(9个页面并用空格隔开):\n");
for(i=0;i<N;i++) scanf("%d",&b[i].Ye_Hao);
printf("发生缺页的面号分别为:\n");
int j,ii=0;
for(j=1;j<N;j++)
{int f=0;
for( k=0;k<=ii;k++)
{
if(b[j]==a[k]) {f=1;break;}中断
{
printf("%d ",b[j]);//打印缺页的页号
count++;
a[0].Ye_Hao=b[0].Ye_Hao;
a[0].falg=0;
b[0].falg=0;
printf("%d ",b[0].Ye_Hao);
int ii=0;
int k,j;
count++;
for(j=1;j<N;j++)
{int flag=0;
for( k=0;k<=ii;k++)
{
if(b[j].Ye_Hao==a[k].Ye_Hao) {flag=1;break;}//包含在中间找到,在末尾找到
五、实验操作过程及实验结果记录
1、FIFO页面置换算法:
此算法的思想是按照作业到来的顺序进行处理,以下是源代码,代码已经调试,可上机运行。
FIFO LRU OPT页面置换算法的模拟实现(已调试)
操作系统之FIFO、LRU、OPT模拟实现1.FIFO算法#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//FIFOn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i<n2; i++){for(j = 0 ;j<n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memorybreak;}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int minv;minv = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if(minv > mempages[k][1]){k2 = k;minv = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}2.LRU#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//LRUn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i<n2; i++){for(j = 0 ;j<n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memory{mempages[j][1]=i+1;break;}}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int minv;minv = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if(minv > mempages[k][1]){k2 = k;minv = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}3.OPT#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//FIFOn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i < n2; i++){for(j = 0 ;j < n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memorybreak;}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int max;int t;for(j = 0 ;j < n3; j++){for( t = i+1; t < n2; t++){if( mempages[j][0] == pageseq[t] ){mempages[j][1] = t;break;}}if( t == n2 )mempages[j][1] = n2+1;}//int max;max = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if( mempages[k][1] > max ){k2 = k;max = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];//mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}。
页面置换算法(FIFO算法_LRU算法)
实验四页面置换算法一、实验目的理解并掌握模拟分页式虚拟存储管理的缺页中断,以及选择页面调度算法处理缺页中断。
二、实验内容及要求选择一种或几种页面置换算法进行编程以实现该算法。
三、实验流程图四、实验程序1、FIFO算法#include"stdio.h"#define n 20#define m 4void main(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n");for(i=0;i<n;i++)scanf("%d",&ym[i]);printf("\n");for(i=0;i<n;i++) //查页表,看是否缺页{q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为‘*’else flag='';if(flag=='*'){for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的mem[j]=mem[j-1];mem[0]=ym[i];}for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}2、LRU算法#include"stdio.h"#define n 20#define m 5void main(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n");for(i=0;i<n;i++)scanf("%d",&ym[i]);printf("\n");for(i=0;i<n;i++) //查页表,看是否缺页{q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为‘*’else flag=' ';for(j=q;j>0;j--)mem[j]=mem[j-1];mem[0]=ym[i];for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}五、实验结果1、FIFO(四内存块)2、LRU(五内存块)。
