操作系统--页面置换算法(先进先出算法,最近最久未使用算法,最佳置换算法)--JAVA实现
2012-06-08 13:20
531 查看
模拟操作系统对内存与虚拟内存的页面置换算法,当分配的内存不足时,进行替换
大家直接看代码吧,里面的注释应该够了,这三个程序结构差不多,只是在替换算法有差别
1.先看最简单的先入先出算法:
2.最佳置换算法:这算法实际不可实现,当然现在我们手工输入程序运行需要哪些页面,实际是不知道的
3.最近最久未使用算法
尾注:文章来自 http://blog.csdn.net/mzlqh
大家直接看代码吧,里面的注释应该够了,这三个程序结构差不多,只是在替换算法有差别
1.先看最简单的先入先出算法:
public class FIFO { /** *先进先出算法 */ private static final int PRO_MEMORY = 5;//系统分配的内存块数 private static Page[] pages = new Page[PRO_MEMORY]; private static int countOldPoint ;//纪录最久的页面下标 private static int count ;//纪录当前在使用的总页面数 private static int lackTime;//缺页次数 private List<Integer> usePageNumList = new ArrayList<Integer>();//页面使用列表 public static void main(String[] args){ System.out.println("--------先进先出算法------------"); FIFO fifo = new FIFO(); fifo.init(); fifo.input(); fifo.running(); } //初始化 public void init(){ for(int i=0;i<pages.length;i++){ pages[i] = new Page(); } } //接收用户输入列表 public void input(){ System.out.print("请输入页面使用列表,以空格分开:"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String[] inputList = input.split("\\s"); try{ for(String in : inputList){ usePageNumList.add(Integer.valueOf(in)); } } catch(Exception e){ System.out.println("输入的必须是数字,请重新开始!!!"); System.exit(0); } } //系统运行 public void running(){ Iterator<Integer> it = usePageNumList.iterator(); //列表置入替换 while(it.hasNext()){ countOldPoint = countOldPoint % PRO_MEMORY; int inPageId = it.next(); //查找内存中是否有该页面 if(search(inPageId)){ System.out.println("内存中有ID为"+inPageId+" 这个页面,不进行替换"); } else if(count<PRO_MEMORY){//有空闲内存页 pages[count].setId( (Integer)inPageId); System.out.println("页号ID:"+pages[count].getId()+" 正在放入内存"); count ++; } else{//替换 replace(inPageId); lackTime ++; countOldPoint ++; } display(); } System.out.println("缺页次数为:"+lackTime+",缺页率是:"+(float)lackTime/usePageNumList.size()); } //查找内存中是否有该页面 public boolean search(int pageId){ for(int i=0;i<pages.length;i++){ if(pages[i].getId() == pageId){ return true; } } return false; } //替换算法 public void replace(int pageId){ //置换最久的页面 int outPageId = -1; outPageId = pages[countOldPoint].getId(); pages[countOldPoint].setId(pageId); System.out.println("页号ID:"+pageId+" 正在放入内存,页号ID:"+outPageId+"被替换出去"); } //显示当前内存页 public void display(){ System.out.print("当前内存保留的页数是:"); for(Page page : pages){ System.out.print(page.getId()+" "); } System.out.println(); } }
2.最佳置换算法:这算法实际不可实现,当然现在我们手工输入程序运行需要哪些页面,实际是不知道的
public class OPT { /** * 最佳置换算法 */ private static final int PRO_MEMORY = 5;//系统分配的内存块数 private static Page2[] pages = new Page2[PRO_MEMORY]; private static int count ;//纪录当前在使用的总页面数 private static int lackTime;//缺页次数 private List<Integer> usePageNumList = new ArrayList<Integer>();//页面使用列表 public static void main(String[] args) { System.out.println("-------- 最佳置换算法------------"); OPT opt = new OPT(); opt.init(); opt.input(); opt.running(); } //初始化 public void init(){ for(int i=0;i<pages.length;i++){ pages[i] = new Page2(); } } //接收用户输入列表 public void input(){ System.out.print("请输入页面使用列表,以空格分开:"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String[] inputList = input.split("\\s"); try{ for(String in : inputList){ usePageNumList.add(Integer.valueOf(in)); } } catch(Exception e){ System.out.println("输入的必须是数字,请重新开始!!!"); System.exit(0); } } //系统运行 public void running(){ Iterator<Integer> it = usePageNumList.iterator(); int currentPoint = 0;//当前读取输入列表的下标 //列表置入替换 while(it.hasNext()){ int inPageId = it.next(); //查找内存中是否有该页面 if(search(inPageId)){ System.out.println("内存中有ID为"+inPageId+" 这个页面,不进行替换"); } else if(count<PRO_MEMORY){//有空闲内存页 pages[count].setId( (Integer)inPageId); System.out.println("页号ID:"+pages[count].getId()+" 正在放入内存"); count ++; timeRefresh(); } else{//替换 replace(inPageId,currentPoint);//传入当前下标确定需要遍历的未来输入列表 timeRefresh(); lackTime ++; } currentPoint ++; display(); } System.out.println("缺页次数为:"+lackTime+",缺页率是:"+(float)lackTime/usePageNumList.size()); } //查找内存中是否有该页面 public boolean search(int pageId){ for(int i=0;i<pages.length;i++){ if(pages[i].getId() == pageId){ timeRefresh(); return true; } } return false; } //时间更新 public void timeRefresh(){ for(Page2 page : pages){ page.inc(); } } //替换算法 public void replace(int pageId,int currentPoint){ //寻找最长时间不使用的页面,count最大的内存块 int max = 0,perCount,outPageId = -1,cur = 0,searchCounter=0;//cur为内存块下标,searchCounter纪录是否内存块搜索完毕 //循环爆出最长为使用的页面 for(int i=currentPoint+1;i<usePageNumList.size();i++){ for(Page2 page : pages){ if(page.getId() == usePageNumList.get(i)){ searchCounter ++; } else{ page.inc();//未找到则增长值 } } if(searchCounter == pages.length){ break; } } //进行搜索,查找替换目标 for(int i=0;i<pages.length;i++){ perCount = pages[i].getCount(); if(max<perCount){ max = perCount; cur = i; outPageId = pages[i].getId(); } // System.out.println("--------当前-页号count------->"+perCount); } pages[cur].setId(pageId); System.out.println("页号ID:"+pageId+" 正在放入内存,页号ID:"+outPageId+"被替换出去"); reSet(); } //搜索完毕进行重置 public void reSet(){ for(Page2 page : pages){ page.setCount(0); } } //显示当前内存页 public void display(){ System.out.print("当前内存保留的页数是:"); for(Page2 page : pages){ System.out.print(page.getId()+" "); } System.out.println(); } } /* * 未来最久未使用纪录 */ class Page2{ private int id = -1; private int count; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCount() { return count; } public void inc() { count ++; } public void setCount(int count) { this.count = count; } }
3.最近最久未使用算法
public class LRU { /** * 最近最久未使用算法 */ private static final int PRO_MEMORY = 5;//系统分配的内存块数 private static Page[] pages = new Page[PRO_MEMORY]; private static int count ;//纪录当前在使用的总页面数 private static int lackTime;//缺页次数 private List<Integer> usePageNumList = new ArrayList<Integer>();//页面使用列表 public static void main(String[] args) { System.out.println("--------最近最久未使用算法------------"); LRU lru = new LRU(); lru.init(); lru.input(); lru.running(); } //初始化 public void init(){ for(int i=0;i<pages.length;i++){ pages[i] = new Page(); } } //接收用户输入列表 public void input(){ System.out.print("请输入页面使用列表,以空格分开:"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String[] inputList = input.split("\\s"); try{ for(String in : inputList){ usePageNumList.add(Integer.valueOf(in)); } } catch(Exception e){ System.out.println("输入的必须是数字,请重新开始!!!"); System.exit(0); } } //系统运行 public void running(){ Iterator<Integer> it = usePageNumList.iterator(); //列表置入替换 while(it.hasNext()){ int inPageId = it.next(); //查找内存中是否有该页面 if(search(inPageId)){ System.out.println("内存中有ID为"+inPageId+" 这个页面,不进行替换"); } else if(count<PRO_MEMORY){//有空闲内存页 pages[count].setId( (Integer)inPageId); System.out.println("页号ID:"+pages[count].getId()+" 正在放入内存"); reSet(count); count ++; timeRefresh(); } else{//替换 replace(inPageId); timeRefresh(); lackTime ++; } display(); } System.out.println("缺页次数为:"+lackTime+",缺页率是:"+(float)lackTime/usePageNumList.size()); } //查找内存中是否有该页面 public boolean search(int pageId){ for(int i=0;i<pages.length;i++){ if(pages[i].getId() == pageId){ timeRefresh(); reSet(i); return true; } } return false; } //访问后置0 public void reSet(int cur){ pages[cur].setCount(0); } //时间更新 public void timeRefresh(){ for(Page page : pages){ page.inc(); } } //替换算法 public void replace(int pageId){ //寻找时间数最大的页面 int max = 0,perCount,outPageId = -1,cur = 0;//cur为下标 for(int i=0;i<pages.length;i++){ perCount = pages[i].getCount(); if(max<perCount){ max = perCount; outPageId = pages[i].getId();//换出去的页号 cur = i; } } reSet(cur); pages[cur].setId(pageId); System.out.println("页号ID:"+pageId+" 正在放入内存,页号ID:"+outPageId+"被替换出去"); } //显示当前内存页 public void display(){ System.out.print("当前内存保留的页数是:"); for(Page page : pages){ System.out.print(page.getId()+" "); } System.out.println(); } } /* * 页面 */ class Page{ private int id = -1; private int count; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCount() { return count; } public void inc() { count ++; } public void setCount(int count) { this.count = count; } }
尾注:文章来自 http://blog.csdn.net/mzlqh
相关文章推荐
- 操作系统-页面置换算法-最佳置换算法
- 最近最久未使用页面淘汰算法———LRU算法(java实现)
- 最近最久未使用页面淘汰算法———LRU算法(java实现)
- 最佳淘汰算法(OPT) 先进先出的算法(FIFO) 最近最久未使用算法(LRU)
- java实现操作系统中的页面置换算法、进程调度算法、磁盘调度算法
- 操作系统-页面置换算法-先进先出置换算法
- Java使用Commons-FileUpload组件实现文件上传最佳方案
- 操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)
- java使用jdic组件调用ie内核-实现调用本地操作系统文件
- 机器学习与数据挖掘-K最近邻(KNN)算法的实现(java和python版)
- 基于欧几里德距离的K最近邻(KNN)算法的实现(JAVA版)
- Java使用异或运算实现简单的加密解密算法实例代码
- 10行Java代码实现最近被使用(LRU)缓存
- 操作系统进程调度算法(Java 实现)
- 说说如何使用 Java 的原生方法实现 AES 算法
- 自己实现的一个Cache 使用最近常使用算法
- 最近在做实验希望实现基于JNI技术在Java中使用 Slex.dll
- 最近最久未使用(LRU)置换算法
- java 使用二叉堆实现 TopK 算法
- 操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)