java实现操作系统中的最佳置换Optimal算法

在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用java语言去实现内部代码。

Swap指令

最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法通常保证获取最低的缺页率。但人们目前还无法与之,一个线程在内存的若干个页面中,哪个页面是未来最长时间内不再被访问的,因此该算法是无法实现的,但是可以利用该算法去评价其他算法。现在就说明如下。

假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:

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予以淘汰。这是因为页面0将作为第五个被访问的页面,页面1为第十四个被访问的页面,而页面7则是要在低18次访问才需要引入,以此类推。

以下是源代码实现部分:

package chapter02;

public class P175Optimal {
 //查找数组中是否存在并且未存储元素的索引
 public static int existEmpty(int[] place){
  for (int i = 0; i < place.length; i++) {
   if(place[i]==-1)
    return i;
  }
  //不为空
  return -1;
 }

 //查找元素是否在数组中存在
 public static boolean paramExist(int[] place,int param){
  for (int i = 0; i < place.length; i++) {
   if(place[i]==param)
    return true;
  }
  //不为空
  return false;
 }

 //获取最大距离值
 public static int getMaxIndexOfNeed(int[] place,int[] block,int start){
  //最近需求定位
  int minBlockIndex = -1;
  int minPlaceIndex = -1;
  for(int PlaceIndex = 0;PlaceIndex<place.length;PlaceIndex++){
   for (int BlockIndex = start + 1; BlockIndex < block.length; BlockIndex++) {
    if (block[BlockIndex] == place[PlaceIndex]) {
     if (minBlockIndex < BlockIndex) {
      minBlockIndex = BlockIndex;
      minPlaceIndex = PlaceIndex;
     }
     break;
    }
    //这操作是查找获取最大距离值的时,发现内存中的元素以后永久不使用的元素时候
    if(BlockIndex==block.length-1 && block[BlockIndex]!=place[PlaceIndex]){
     return PlaceIndex;
    }
   }
  }
  return minPlaceIndex;
 }
 public static void main(String[] args) {
  int[] block = new int[]{7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};
  int[] place = new int[]{-1, -1, -1};
  for (int index = 0; index < block.length; index++) {
   //假设元素存在则不需要进行任何操作
   if(paramExist(place,block[index])){
    continue;
   }else {
    int emptyIndex = existEmpty(place);
    //当前已经元素满了
    if(emptyIndex==-1){
     int maxIndex = getMaxIndexOfNeed(place,block,index);
     place[maxIndex] = block[index];
     for (int param : place) {
      System.out.print(param + " ");
     }
     System.out.println();
    }else{
     place[emptyIndex] = block[index];

    }
   }
  }
 }
}

实验结果:

"C:\Program Files\Java\jdk1.8.0_101\bin\java.exe"
2 0 1
2 0 3
2 4 3
2 0 3
2 0 1
7 0 1

实验结果与上结果一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现置换密码加密解密

    本文实例为大家分享了Java实现置换密码加密解密,供大家参考,具体内容如下 思路 置换密码只不过是简单的换位而已,这里写的是一个分组长度为7的置换密码因为所学知识有限,写的比较麻烦,这里先简单介绍一下思路: 1.因为置换密码首先要将其进行分组,这里分组长度为7,不足的位数补0,可以选取二维数组进行操作,定义二维数组,明文有多少个分组二维数组中就有多少个一维数组,其中一维的长度就是分组长度 2.定义一个一维数组key作为加密用的秘钥,一个一维数组trankey作为解密秘钥,这里其中的元素是自己写的

  • java实现操作系统中的最佳置换Optimal算法

    在学习操作系统这本书的时候,我们使用的是汤小丹老师的<计算机操作系统>接下来我将会使用java语言去实现内部代码. Swap指令 最佳置换算法是由Belady于1966年提出的一种理论上的算法.其所选择的被淘汰页面是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面.采用最佳置换算法通常保证获取最低的缺页率.但人们目前还无法与之,一个线程在内存的若干个页面中,哪个页面是未来最长时间内不再被访问的,因此该算法是无法实现的,但是可以利用该算法去评价其他算法.现在就说明如下. 假定系统为某进

  • java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 其实apache中的ant包(请自行GOOGLE之ant.jar)中有一个更好的类,已经支持中文了,我们就不重复制造轮子了,拿来用吧, 这里最主要的功能是实现了 可以指定多个文件 到同一个压缩包的功能 用org.apache.tools.zip压缩/解压缩zip文件的例子,用来解决中文乱码问题. 实例代码: import Java.io.BufferedInputStream; import java.io.

  • Java线程并发中常见的锁机制详细介绍

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac

  • 浅谈JAVA 线程状态中可能存在的一些误区

    BLOCKED 和 WAITING 的区别 BLOCKED 和 WAITING 两种状态从结果上来看,都是线程暂停,不会占用 CPU 资源,不过还是有一些区别的 BLOCKED 等待 Monitor 锁的阻塞线程的线程状态,处于阻塞状态的线程正在等待 Monitor 锁进入 synchronized   Block 或者 Method ,或者在调用 Object.wait 后重新进入同步块/方法.简单的说,就是线程等待 synchronized 形式的锁时的状态 下面这段代码中, t1 在等待

  • 浅析操作系统中的虚拟地址与物理地址

    目录 一.前言 二.你看到的所有地址都不是真的 三.物理寻址 Physical Addressing 四.虚拟寻址 Virtual Addressing 一.前言 先解释下一个困扰了我很久的问题:虚拟地址(vitural address)和逻辑地址(logical address)的区别. 大部分操作系统的书籍要么写的是虚拟地址,要么写的是逻辑地址,看的我一脸懵逼. 在<深入理解 Linux 内核>这本书中终于找到了确切的答案,这里我就不写出来了,扣概念的话这俩确实是有些区别的,不过对于我们日

  • Effective Java 在工作中的应用总结

    目录 一  创建和销毁对象篇 1  若有多个构造器参数时,优先考虑构造器 2  通过私有构造器强化不可实例化的能力 二  类和接口篇 1  最小化类和成员的可访问性 2  使可变形最小化 三  泛型篇 1  列表优先于数组 四  方法篇 1  校验参数的有效性 2  谨慎设计方法签名 3  返回零长度的数组或者集合,而不是null 五  通用程序设计篇 1  如果需要精确的答案,请避免使用float和double 2  基本类型优先于装箱基本类型 六  异常 1  每个方法抛出的异常都要有文档

  • Java 在生活中的 10 大应用

    目录 1. 桌面图形用户界面 2. 移动应用 3.人工智能 4. 网络应用 5. 大数据技术 6. 游戏应用 7. 商业应用 8. 嵌入式系统 9. 云应用 10. 科学应用 前言: Java因其强大的特性而成为最健壮的编程语言.它的一些特性是平台独立性.高性能.面向对象.支持自动垃圾管理等等.Java 最近庆祝了它的 25 周年纪念日,并且不断更新以适应最新的技术进步.目前约有 30 亿台设备使用 Java 进行开发.Java 有一个独特的设计,它结合了在任何机器上运行的灵活性.它一直是大量应

  • 认识Java底层操作系统与并发基础

    目录 一.现代计算机硬件结构 1.CPU内部结构 1.1.CPU缓存结构 1.2.CPU运行安全等级 2.操作系统内存管理 3.进程与线程 一.现代计算机硬件结构 核心部分: CPU.内存 1.CPU内部结构 控制单元: 整个 CPU 的指挥控制中心 运算单元: 运算器核心,执行算术运算与逻辑运算.运算器接收控制单元的指令而执行动作 存储单元: CPU 中暂时存储数据的地方,包括 CPU 片内缓存 Cache 和 寄存器组 1.1.CPU缓存结构 现代 CPU 为了提升执行效率,减少 CPU 与

  • Java实现计算图中两个顶点的所有路径

    目录 前言 抽象数据模型 代码实现数据模型 计算两个顶点之间路径算法 总结 前言 最近公司的项目上有个需求,还挺有分享价值的,这边做个记录.需求大致如下,下面的一个流程图,点击条件线上选择的内容,必须是前面配置过的节点,如果不是,需要在保存的时候做强校验提示. 需求其实很明确,抽象出来就是获取图中两个顶点之间所有可达路径的顶点集合,大家可以思考下,该如何实现?这里面涉及到了数据结构中图相关知识,而数据结构算法也是本事最大的弱项,还是废了我一番工夫. 抽象数据模型 实际上,看到这个需求就很容易想到

  • 浅析Java和Scala中的Future

    随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue,带你走入异步编程的大门. Future 很多同学可能会有疑问,Futrue跟异步编程有什么关系?从Future的表面意思是未来,一个Future对象可以看出一个将来得到的结果,这就和异步执行的概念很像,你只管自己去执行,只要将最终的结果传达给我就行,线程不必一直暂停等待结果,可以在具体异步任务执行的时候去执行其他操作

随机推荐