通过代码实例了解页面置换算法原理
作者:七月在野,八月在宇 发布时间:2024-01-24 21:26:23
页面置换算法:本质是为了让有限内存能满足无线进程。
先说明一下处理缺页错误的过程:
分页硬件在通过页表转换地址时会注意到无效位被设置,从而陷入操作系统,这种陷阱是因为操作系统未能将所需要的页面调入内存引起的。
处理缺页错误:
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,我们使用两次缺页中断的差值(表明两次中断之间有多少次没有中断)和阈值比较,如果比阈值大,那么将不再当前工作集的页面换出,并且重置工作集的大小,如果比阈值小,那么将缺的页换入工作集并且重置工作集的大小。
来源:https://www.cnblogs.com/guosai1500581464/p/13112045.html


猜你喜欢
- 本文主要是利用scapy包编写了一个简易扫描工具,支持ARP、ICMP、TCP、UDP发现扫描,支持TCP SYN、UDP端口扫描,如下:u
- 字体反爬,也是一种常见的反爬技术,这些网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成其他字
- 现在很多CMS系统因为安全原因会把后台编辑器里的上传功能给去除,但这样一来对实际使用过程造成了很多麻烦,今天我们以ASPCMS系统的FCKe
- python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,
- python 获取蓝牙设备类型扫描蓝牙设备获取到的信息中,无法判断扫描到的蓝牙设备属于什么类型的设备。扫描蓝牙信息使用的是python 里面
- 网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方。 1、使用meta标签,这也是普
- 随着公司开发人员的增加,以及多需求的并行开发,功能上线就会碍手碍脚;害怕自己没写完的代码被别人部署到线上,害怕别人代码没写完被自己部署到线上
- 本文实例讲述了Python使用add_subplot与subplot画子图操作。分享给大家供大家参考,具体如下:子图:就是在一张figure
- 前言 pycharm默认是没有为我们设置模板信息的,但为了更加方便的实现代码管理,以及能够一目
- 爱如风过 问:js如何能知道浏览者计算机或者浏览器使用的语言是繁体还是简体?如题,我想用jS检测到浏览者使用的是繁体还是简体中文,以便设置页
- mysql的存储过程、游标 、事务实例详解下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。其中,涉及到了存
- 图像的阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。
- 如下所示:#!/usr/bin/env python#-*- coding: utf-8 -*-"""[0,
- pymysql 模块的使用一、pymysql的下载和使用(1)pymysql模块的下载pip3 install pymysql(2)pymy
- 在settings.py中将默认内容覆盖成DATABASES = {'default': {
- 由以下函数代替该功能:def cv_imread(file_path): cv_img=cv2.imdecode(np.fromfile(f
- 为了获取ROC曲线的最佳阈值,需要使用一个指标--约登指数,也称正确指数。借助于matlab的roc函数可以得出计算。% 1-specifi
- 本文实例讲述了PHP面向对象程序设计类的定义与用法。分享给大家供大家参考,具体如下:<?phpclass Person {  
- 经过总结,Python创建多线程主要有如下两种方法:函数类接下来,我们就来揭开多线程的神秘面纱。1. 用函数创建多线程在Python3中,P
- 传染源: 野生动物,可能为中华菊头蝠病毒: 新型冠状病毒 2019-nCoV传播途径: 经呼吸道飞沫传播,亦可