【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPTP)

2023-11-12

写在前面

操作系统内存管理的页面置换算法,因为懒得看老师给的代码(太长了而且据说好像还有错误)就自己写了一个python版本的,因为比较菜,所以写的一般般,仅供大伙参考一下Orz

python版本的

代码如下:


import random
#生成n个页面请求
def Page_Request(n):
    pagerequest_list = []
    for i in range(n):
        tmp = random.randint(0,20)
        pagerequest_list.append(tmp)
    return pagerequest_list

def OPT(pagerequest_list,m):# m为分得的空闲页框数
    missnum = 0 #缺页次数
    page_memory = []   #存放当前内存页面分布情况
    print(pagerequest_list)
    for i in range(0,len(pagerequest_list)):
        if len(page_memory)< m:#内存页面有空闲时直接放入
            page_memory.append(pagerequest_list[i])
            missnum = missnum+1
            print("第%d次内存页面分布情况"%int(i+1),page_memory)
        else:#内存页面满的情况下
            if pagerequest_list[i] in page_memory:#如果下一个请求页面已经在内存页面中了
                print("第%d次内存页面分布情况"%int(i+1),page_memory)
            else:
                stack_list = {} # 存放后面找到的页面
                for j in range(i,len(pagerequest_list)):
                    if pagerequest_list[j] in page_memory :#确保记录的是第一次出现的位置
                        if pagerequest_list[j] not in stack_list.keys():
                            stack_list[pagerequest_list[j]] = j
                #print(stack_list)
                taotai_num = 0 #记录要内存页面淘汰的页号,随便给一个值,后面会覆盖掉的
                for num in page_memory:
                    if num not in stack_list.keys():
                        taotai_num = num
                        break
                    else:
                        taotai_num = max(stack_list, key=stack_list.get)
                page_memory.remove(taotai_num)
                page_memory.append(pagerequest_list[i])
                missnum = missnum+1
                print("第%d次内存页面分布情况"%int(i+1),page_memory)

    missrate = missnum/len(pagerequest_list)#计算下缺页率

    return missnum,missrate

def FIFO(pagerequest_list, m):
    missnum = 0 #缺页次数
    page_memory = []   #存放当前内存页面分布情况
    print(pagerequest_list)
    for i in range(0, len(pagerequest_list)):
        if len(page_memory)< m:#内存页面有空闲时直接放入
            page_memory.append(pagerequest_list[i])
            missnum = missnum+1
            print("第%d次内存页面分布情况"%int(i+1),page_memory)
        else:
            if pagerequest_list[i] in page_memory:#如果下一个请求页面已经在内存页面中了
                print("第%d次内存页面分布情况"%int(i+1),page_memory)
            else:
                page_memory.remove(page_memory[0])
                page_memory.append(pagerequest_list[i])
                missnum = missnum+1
                print("第%d次内存页面分布情况"%int(i+1),page_memory)

    missrate  =  missnum/len(pagerequest_list)#计算下缺页率

    return missnum,missrate

def LRU(pagerequest_list, m):
    missnum = 0 #缺页次数
    page_memory = []   #存放当前内存页面分布情况
    print(pagerequest_list)
    for i in range(0, len(pagerequest_list)):
        if len(page_memory)< m:#内存页面有空闲时直接放入
            page_memory.append(pagerequest_list[i])
            missnum = missnum+1
            print("第%d次内存页面分布情况"%int(i+1),page_memory)
        else:
            if pagerequest_list[i] in page_memory:#如果下一个请求页面已经在内存页面中了
                print("第%d次内存页面分布情况"%int(i+1),page_memory)
            else:
                stack_list={}#和OPT算法类似,不过是往前找罢了
                for j in range(0,i):
                    if pagerequest_list[j] in page_memory:  # 确保记录的是最后一次出现的位置
                        stack_list[pagerequest_list[j]] = j
                for num in page_memory:
                    taotai_num = min(stack_list, key=stack_list.get)
                page_memory.remove(taotai_num)
                page_memory.append(pagerequest_list[i])
                missnum = missnum+1
                print("第%d次内存页面分布情况"%int(i+1),page_memory)


    missrate = missnum/len(pagerequest_list)#计算下缺页率

    return missnum,missrate

def main():
    pagerequest_num = int(input("请输入页面请求的数量:"))
    pagerequest_list = Page_Request(pagerequest_num)
    #pagerequest_list = [1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6] #测试正确性用的
    pageframe_num = int(input("请输入分配的页框数:"))
    print("OPT算法的情况如下:")
    opt_missnum,opt_missrate = OPT(pagerequest_list,pageframe_num)
    print("OPT缺页次数为:",opt_missnum)
    print("OPT缺页率为:",opt_missrate)

    print("FIFO算法的情况如下:")
    fifo_missnum, fifo_missrate = FIFO(pagerequest_list, pageframe_num)
    print("FIFO缺页次数为:", fifo_missnum)
    print("FIFO缺页率为:", fifo_missrate)

    print("LRU算法的情况如下:")
    lru_missnum, lru_missrate = LRU(pagerequest_list, pageframe_num)
    print("缺页次数为:", lru_missnum)
    print("缺页率为:", lru_missrate)


if __name__ == '__main__':
    #a = [1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6]
    main()

结果如下图(不是那种表格形式的,所以不是很美观┭┮﹏┭┮):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

java版本的

室友好像在写java版本的,等他写完也放上来(●’◡’●)
舍友的java版,可以去看一看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPTP) 的相关文章

随机推荐

  • 一、robotframework 安装

    测试环境 windows 安装前提 已安装python robotframework基于python环境 python安装过程略过 安装的软件参考的这篇博文robot framework自动化测试参考手册 安装python库 安装robot
  • Linux下静态库生成和使用

    一 静态库概念 1 库是预编译的目标文件 object files 的集合 它们可以被链接进程序 静态库以后缀为 a 的特殊的存档 archive file 存储 2 标准系统库可在目录 usr lib与 lib中找到 比如 在类Unix系
  • layui原生框架下,展示、替换图片(修改页面)

    最终页面效果如下 由于图片没有资源路径 所以没有展示出来 图片展示可以忽略 代码如下 div class layui form item div
  • JDK的安装及配置详细图文教程(win10)

    JDK的下载 进入官网 选择Products下的Software下的java 官网 下拉 找到java SE页面并选择Oracle JDK 进入后选择JDK Download 然后就会进入到jdk最新版本的下载界面 选择系统对应的下载安装包
  • Linux创建用户并修改shell类型

    base root 57beff3260ef sudo su test exit base root 57beff3260ef apt get install zsh base root 57beff3260ef echo SHELL bi
  • react html 显示,react如何控制元素的显示与隐藏功能?

    react如何控制元素显示与隐藏 在vue中常用v if和v show指令 react中用什么方法呢 下面本篇文章给大家介绍一下 有一定的参考价值 有需要的朋友可以参考一下 希望对大家有所帮助 下面说我知道的三种方法 1 通过 state
  • Python3内置模块

    1 os all functions from posix nt or ce e g unlink stat etc os name is either posix nt or ce os curdir is a string repres
  • jvm不同版本(jdk6、jdk7、jdk8)之间的class常量池、运行时常量池、字符串常量池与堆、方法区的种种关系

    这几天研究了一下JVM底层原理 其中的内存分配前前后后看了三天 感觉还是没太看透 先研究到这 做个阶段性的笔记 感兴趣的小伙伴们欢迎大家评论区共同讨论 查阅了各种博客 长篇大论 例证太多 不清晰 本文主要目的精简浓缩一下 感兴趣的去文中参考
  • 数据库报错1264错误

    数据库报错1264 php程序报错1264 这个原因有可能是字段长度不够 改变一下字段长度
  • Install Ubuntu 12.04 on Macbook pro Retina

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 Install rEFIt Download and mount the rEFIt 0 14 dmg disk image Double click on the r
  • log4j 2读取配置文件的三种方法

    log4j 2读取配置文件的三种方法 log4j 2读取的配置文件可以分为三类 src下的配置文件 绝对路径的配置文件 相对路径的配置文件 我们一一给例子 直接看代码 package com herman test import java
  • 【Linux之Shell脚本实战】查询邮政编码与对应地区

    Linux之Shell脚本实战 查询邮政编码与对应地区 一 脚本要求 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三 配置脚本注释模板 1 编辑 vimrc 文件 2 检查模板生效情况 四 编辑shell脚本 1 创建脚本
  • 「数据结构」三步搞定表达式中缀转后缀 手算法 通俗易懂 C语言

    表达式中缀转后缀 举个例子 一个式子 5 20 1 3 14 如何把该式子转换成后缀表达式呢 其实就是分三步 按运算符优先级对所有运算符和它的运算数加括号 原本有括号的不用加 把运算符移到对应的括号后 去掉括号 对应的具体实现为 5 20
  • 音视频开发系列-音视频核心知识精讲

    音视频开发系列 音视频核心知识精讲 1 视频为什么会花屏 2 音频为什么容易有杂音 3 音视频进阶需要掌握什么项目 音视频核心知识 为什么会花屏 容易有杂音 进阶需要掌握什么项目 https www bilibili com video B
  • day09:定时器

    目录 总结 1 三种解绑事件 2 事件冒泡 3 阻止事件冒泡 4 事件委托 事件代理 5 事件的三个阶段 一 最大的匿名函数 二 定时器setInterval 三 一起摇摆案例 四 亮起来案例 五 美女时钟效果 六 进一步优化时钟 七 渐变
  • 我们用4行代码节省了100万 相见恨晚的PCDN

    我们公司主要做视频在线点播 还有少量视频下载 比较关心网络加速 首先就是价格 其次是首播时间 流畅率这几个核心性能指标 目前使用阿里云PCDN也有几个月了 整体结果是超预期 值得安利的 写这篇文章 希望能通过选型对比 接入过程 效果实现几个
  • torchserve使用-注册模型设置参数(二)

    目录 1 自定义处理程序 2 托管多个模型 3 模型接口 3 1 添加注册新模型 3 2 查看是否注册成功 3 3 查看注册模型基本信息 3 4 设置注册模型参数 3 5 使用以下代码注销模型 3 6 模型版本控制 4 记录和指标 1 自定
  • xxl-job-admin多数据库支持

    记录一下改造过程 针对 xxl job 2 3版本 什么是xxl job 你的系统中有很多定时任务 如果你想统一管理 你需要一个调度系统 XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 githu
  • 机器学习初实践——恶意域名检测

    这次恶意域名检测实践是第一次自己做机器学习而非单纯复现 参考了第一次鸢尾花的代码和GitHub的UrlDetect中的特征提取参数的代码 一 数据处理 首先要实现自动化处理数据 在这里我没有使用urlparser而是直接写脚本提取域名 提取
  • 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPTP)

    写在前面 操作系统内存管理的页面置换算法 因为懒得看老师给的代码 太长了而且据说好像还有错误 就自己写了一个python版本的 因为比较菜 所以写的一般般 仅供大伙参考一下Orz python版本的 代码如下 import random 生