通过代码实例了解页面置换算法原理

页面置换算法:本质是为了让有限内存能满足无线进程。

先说明一下处理缺页错误的过程:

分页硬件在通过页表转换地址时会注意到无效位被设置,从而陷入操作系统,这种陷阱是因为操作系统未能将所需要的页面调入内存引起的。

处理缺页错误:

1、检查这个进程的内部表,确定该引用是否为有效的内存访问(可以理解为这个内存能被当前进程使用),如果无效那么直接终止进程;如果有效但是尚未调入页面,就将该页面调入内存。

2、然后从空闲帧链表上找到一个空闲帧。

3、调度磁盘将进程所需要的内存读入页帧中,

4、磁盘读取完成,修改页表,使空闲帧对应到该页号上。并且修改页表有效-无效位 为有效。

注意页表中的一些标志位:

修改位:如果有效为位1,表明被修改,那么替换页面时需要将内存写入磁盘中;如果为0,表明未被修改,那么使用页面替换算法直接释放

保护位:可以标记为只读,写。

有效-无效位:i:表示逻辑页号不对应物理页帧,为V表示有对应的物理页帧

页面替换算法:

FIFO:算法

操作系统总时替换出在内存中停留时间最久的页面,可以用一个指针来指向这个位置(开销很小,可以使用一个队列来实现,每次缺页时移出末尾的页面,再队列头添加新的页面,未发生缺页错误就不需要对队列进行操作)

LRU算法:操作系统总时替换在内存中最久没有使用的页面:我么可以使用链表来实现这个算法,表头表示的是最近被使用的页面,表尾表示最久没被使用的页面,每一次不管是否发生缺页,都需要对这个链表进行从新增删改查,来保证每一次的链表都是我们需要的(开销太大)

近似LRU算法:我们在页表中添加一个引用位clock,当clock为1时,不能移出,当clock为0时,表明可以移除

procedure t: {
  指针p:指向当前的页面
  p = 0;//指向初始位置
  boolean :标志位clock
  进程包含的所有页面组成的循环链表:linklist//当进程在运行时,链表存在,进程结束时,链表也消失
  while(进程运行){

    if(p.clock == 1){
      p.clock = 0;
      p++;//指针指向下一个
    }
    if(p.clock == 0){
      删除p指向的页面并且在p处添加新的页面;
      p.clock = 1;
      p++;
    }
  }
}

近似LRU增强算法:将修改位和引用位合起来作为是否替换条件:当(修改位,引用位) = (0,0)时表明可以替换

procedure t: {
  指针p:指向当前的页面
  p = 0;//指向初始位置
  boolean :标志位clock
  boolean : 修改位m
  进程包含的所有页面组成的循环链表:linklist//当进程在运行时,链表存在,进程结束时,链表也消失
  while(进程运行){

    if(p.(clock,m) == (0,0)){

      删除p指向的页面并且在p处添加新的页面;
      p.(clock,m) = (1,0);
      p++;
    }
    if(p.(clock,m) == (0,1)){

      p.(clock,m) = (0,0);
      p++;
    }
    if(p.(clock,m) == (1,0)){

      p.(clock,m) = (0,0);
      p++;
    }
    if(p.(clock,m) == (1,1)){

      p.(clock,m) = (0,1);
      p++;
    }
    if(修改页面){
      p.(clock,m) = (1,1);
      p++
    }
    if(读页面){
      p.(clock,m) = (1,0);
      p++;
    }
  }
}

页面缓冲算法:操作做系统保留一个空闲帧池。

当发生缺页错误时,所需要的页面就读取空闲帧,并且将替换的牺牲帧放入缓冲池,在调页空闲时期将缓冲池中的牺牲帧中的内容写入(如果页表上的修改位为1)磁盘中(减少了操作系统的调页时直接访问磁盘的过程,提高了调页效率).

第二种方法:将牺牲帧中的内容写入磁盘,但是不释放帧中的内容,因为进程有可能调用之前的页,这样就将缓冲池中的帧直接写入内存,减少了(从磁盘读取数据的操作)。

以上均为局部页面置换算法,都是在单个进程内部进行的页面替换操作,但是操作系统在运行过程中不同的进程可以并行并发执行,这样对页面的替换就不会仅仅局限于单个进程中

下面我们学习全局置换算法:我们规定一个工作集和一个常驻集。工作集表明当前程序需要访问的Δ个页面,常驻集表明操作系统正在使用的页面。

工作集:WS(Δ,t) = {}  工作集不断移动,操作系统替换出不在工作集中的页面

动态工作集页面替换算法:如下图,我们规定一个阈值windows size = 2,我们使用两次缺页中断的差值(表明两次中断之间有多少次没有中断)和阈值比较,如果比阈值大,那么将不再当前工作集的页面换出,并且重置工作集的大小,如果比阈值小,那么将缺的页换入工作集并且重置工作集的大小。

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

时间: 2020-07-30

Python实现ElGamal加密算法的示例代码

在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法.它在1985年由塔希尔·盖莫尔提出.GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法. ElGamal加密算法可以定义在任何循环群G上.它的安全性取决于G上的离散对数难题. 使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特). 代码如下: import random from math import pow a = random.randint(2

详解vue3.0 diff算法的使用(超详细)

前言:随之vue3.0beta版本的发布,vue3.0正式版本相信不久就会与我们相遇.尤玉溪在直播中也说了vue3.0的新特性typescript强烈支持,proxy响应式原理,重新虚拟dom,优化diff算法性能提升等等.小编在这里仔细研究了vue3.0beta版本diff算法的源码,并希望把其中的细节和奥妙和大家一起分享. 首先我们来思考一些大中厂面试中,很容易问到的问题: 1 什么时候用到diff算法,diff算法作用域在哪里? 2 diff算法是怎么运作的,到底有什么作用? 3 在v-f

python实现mean-shift聚类算法

本文实例为大家分享了python实现mean-shift聚类算法的具体代码,供大家参考,具体内容如下 1.新建MeanShift.py文件 import numpy as np # 定义 预先设定 的阈值 STOP_THRESHOLD = 1e-4 CLUSTER_THRESHOLD = 1e-1 # 定义度量函数 def distance(a, b): return np.linalg.norm(np.array(a) - np.array(b)) # 定义高斯核函数 def gaussian

redis 数据删除策略和逐出算法的问题小结

数据存储和有效期 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redis 的高效 数据的存储 在redis中数据的存储不仅仅需要保存数据本身还要保存数据的生命周期,也就是过期时间.在redis 中 数据的存储结构如下图: 获取有效期 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态 删除策略 在内存占用与CPU占用之间寻找一

经典实例讲解C#递归算法

一 .递归算法简介 在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法. 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身. (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低.所以一般不提倡用递归算法设计程序. (4) 在递归调用的过程当中

详细分析JAVA加解密算法

加解密算法分析 日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全:HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输:使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术. 很多时候我们对于什么时候要使用什么样的加解密方式是很懵的.因为可用的加解密方案实在是太多,大家对加解密技术的类型可能不是很清楚,今天这篇文章就来梳理一下目前主流的加解密技术,本篇文

SHA:安全散列算法简析 附实例

前言 体能状态先于精神状态,习惯先于决心,聚焦先于喜好. SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数.正式名称为 SHA 的家族第一个成员发布于 1993年.然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆.两年之后, SHA-1,第一个 SHA 的后继者发布了. 另外还有四种变体,曾经发布以提升输出的范围和变更一些细

如何基于js及java分析并封装排序算法

前言 本次来分享一下排序的api底层的逻辑,这次用js模拟,java的逻辑也是差不多. 先看封装好的api例子: js的sort排序 java的compareTo排序 自己模拟的代码(JS) function compareTo(a,b){ return a-b;//a-b为从下到大 b-a为从大到小 } Object.prototype.newSort = function(Func){ const flag = Func(1,0); const $this = this; // 注意:上面f

基于JS模仿windows文件按名称排序效果

作个记录,主要是对数字的处理,如果数字的前面字符是相同的,则数字以值比较,而不是单个字符之间的比较. function SortLikeWin(v1, v2) { var a = v1.name; var b = v2.name; var reg = /[0-9]+/g; var lista = a.match(reg); var listb = b.match(reg); if (!lista || !listb) { return a.localeCompare(b); } for (var

java实现的各种排序算法代码示例

折半插入排序 折半插入排序是对直接插入排序的简单改进.此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的 插入位置,这实际上是一种查找算法:折半查找.Java的Arrays类里的binarySearch()方法,就是折半查找的实现,用 于从指定数组中查找指定元素,前提是该数组已经处于有序状态.与直接插入排序的效果相同,只是更快了一些,因 为折半插入排序可以更快地确定第i个元素的插入位置 代码: package interview; /** * @author Administrat

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

图解程序员必须掌握的Java常用8大排序算法

这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看8种排序之间的关系: 1.直接插入排序 (1)基本思想

JS及PHP代码编写八大排序算法

从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以JS和PHP语法的方式编写代码. 1.冒泡排序 原理:临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 时间复杂度:平均情况:O(n2)  最好情况:O(n) 最坏情况:O(n2)

php排序算法实例分析

本文实例分析了php排序算法.分享给大家供大家参考,具体如下: 用PHP写排序,虽然PHP自动了很多排序方式,SQL语句也可以很快速的从数据库里有序的读出数据.但是不同的需求还有灵活 运用所学的PHP基础知识. 我想完成如下的效果 排序算法效果图 就是把一个数值中所以的数据按时间排序并且分行显示 <?php $array = $mysql->query_array($mysql->sql_select("user","userid,truename,year

基于JS对象创建常用方式及原理分析

前言 俗话说"在js语言中,一切都对象",而且创建对象的方式也有很多种,所以今天我们做一下梳理 最简单的方式 JavaScript创建对象最简单的方式是:对象字面量形式或使用Object构造函数 对象字面量形式 var person = new Object(); person.name = "jack"; person.sayName = function () { alert(this.name) } 使用Object构造函数 var person = { na

Android中极简的js与java的交互库(SimpleJavaJsBridge)

前言 最近接触android中js与java交互的东西很多,当然它们之间的交互方式有几种,但是我觉得这几种交互方式都存在一定的不足,这是我决定编写SimpleJavaJsBridge这个库的关键原因. 我会按以下顺序进行本文章: 现有js与java通信方案及不足 js与java完美通信方案设计 SimpleJavaJsBridge 现在进入正题 1. 现有js与java通信方案及不足 先来说明一点js与java通信,指的是js既可以给java发送消息,同时java也可以给js发送消息.那就来屡屡

基于ajax和jsonp的原生封装(实例)

最近在学ajax和跨域,于是就自己封装了一个,虽然有点粗糙但还是可以用的.其实jsonp的本质就是:动态创建script标签,然后通过src属性发送跨域请求,然后服务器端响应的数据格式为[函数调用(foo(实参))],所以在发送请求之前必须先声明一个函数,并且函数的名字与参数中传递的名字要一致.这里声明的函数是由服务器响应的内容(实际就是一段js代码-函数调用)来调用. 其他的就不多说了,直接上代码. 'use strict'; function ajax(obj){ var defaults

基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)

一.应用场景 鼠标hover弹出div,并且鼠标离开后不能马上隐藏,因为这个div上还有功能入口.比如: 鼠标经过好友列表中的好友头像时显示资料卡的效果如下所示: hover时显示二维码 二.实现 用如下这样一个简单的效果:鼠标hover到A上显示B来模拟 有2种实现方式,推荐第二种,第一种有弊端下面会说. 1.方法一 原理:把触发元素A和要显示元素B放于同一个父级元素内,鼠标经过父级元素时触发显示B.这样鼠标移动到B时仍然 处于该父级元素内,则div不会隐藏. 代码: <!DOCTYPE ht