from So_nb_xuhu20183898 import MBT,LRUclass main():def __init__(self):self.printf_all()def menu(self):print("\t\tMENU\t\t")print("0 ByeBye!My baby!")print("1 运用可变式分区分配思想建立存储分块表MBT,使用首次匹配为新作业寻找可用空间")print("2 采用最近最少使用页面先淘汰(LRU)的算法")def printf_all(self):while 1:self.menu()opt=int(input("请输入你的选择:"))if opt==0:breakelif opt==1:MBT.main()elif opt==2:LRU.main()if __name__=="__main__":main()
class page:def __init__(self,num,time):# 记录页面号self.num = num# 记录调入内存时间self.time = timeclass main:# 初始化内存单元,缓冲区def __init__(self):self.M=3self.N=0# self.M = 4# self.N = len("70120304230321201701*".replace('*', ''))# 初始化内存单元self.b = [page(-1,self.M-i-1) for i in range(0,self.M)]# 初始化内存当前状态,缓冲区self.c = [[-1 for i in range(0,self.N)] for j in range(0,self.M)]# 记录调入队列self.queue = []self.k = -1self.flag =-1# self.process()self.tmp=[] #testself.queue_=[]# self.a=[int(s) for s in "70120304230321201701*".replace('*', '')]# print(self.a)self.a=Noneself.printf_all()def print_string(self):print("|---"*self.N)# 取得在内存中停留最久的页面,默认状态下为最早点入的页面def get_max(self,b):max = -1flag = 0for i in range(0,self.M):if b[i].time >max:max = b[i].timeflag = ireturn flag# 判断页面是否已在内存中def equation(self,fold,b):for i in range(0,self.M):if fold == b[i].num:return ireturn -1# LRU 算法def lru(self, fold, b):val = self.equation(fold, b)if val >= 0:b[val].time = 0for i in range(0, self.M):if i != val:b[i].time += 1self.queue.append("*")self.queue_.append('*')else:self.queue.append(fold)self.k += 1val = self.get_max(b)self.queue_.append(b[val].num)b[val].num = foldb[val].time = 0for i in range(0, self.M):if (i != val):b[i].time += 1# 主程序def load_data(self,s):self.a = [int(ch) for ch in s.replace('*', '')]self.N=len(self.a)self.b = [page(-1, self.M - i - 1) for i in range(0, self.M)]# 初始化内存当前状态,缓冲区self.c = [[-1 for i in range(0, len(self.a))] for j in range(0, self.M)]return self.adef process(self):if self.M==0:print("Not the page_frame the process!")returnelse:self.queue = []self.queue_ = []self.k = -1print("\t|_____|\t" * self.M, "\t加入的元素\t  \t被替换的元素\t")for i in range(0, self.N):self.lru(self.a[i], self.b)self.c[0][i] = self.a[i]for k in range(len(self.b)):print(f'\t{self.b[k].num}<{self.b[k].time + 1}>\t', end=" ")print(f'\t     {self.queue[i]}\t\t         {self.queue_[i]}\t')  # test# 记录当前的内存单元中的页面for j in range(0, self.M):self.c[j][i] = self.b[j].num# 结果输出print("lru算法内存状态为:")print("调入队列为")print(self.queue)print("\t缺页次数为:%d\t\n\t缺页率:%f\t" % (self.k + 1, (float)(self.k + 1) / self.N))def menu(self):print("\tMENU\t")print("0 FINISH")print("1 LOAD DATA")print("2 INPUT PAGE_FRAME")print("3 LRU")def printf_all(self):s="123"   #默认字符串 testwhile (1):self.menu()opt = int(input("please input your choice:"))if opt == 0:breakelif opt == 1:s=input("please input a visit-string(*=end):")self.load_data(s)         #    70120304230321201701* 输入要求的字符串elif opt == 2:self.M=(int(input("please input how many page_frames the process cooupied:")))elif opt==3:self.load_data(s)self.process()print("*-*" * self.M)print("================" * self.M)if __name__ == "__main__":pass# main()
# import numpy as np
import copy
import sys
x=[]
class Memory():def __init__(self,seq,base,size,state=-1):self.seq=seqself.base=baseself.size=sizeself.state=statedef res(self):return self.seq,self.base,self.size,self.state
class main():def __init__(self):self.length_of_MBT_table=0self.memorys=Noneself.printf_all()self.main_memory=Nonedef init(self):for i in range(self.length_of_MBT_table):self.memorys.append(Memory(i, 0, 0, -1))self.memorys[0] = Memory(0, self.main_memory, self.main_memory, 0)return self.memorysdef printf(self,memorys):print(" \t***MBT-table***\t")print("\tseq base size state\t")for memory in self.memorys:print(f'\t{memory.seq}\t{memory.base}\t{memory.size}\t{memory.state}\t')def allocate(self,allocate_size):# global self.main_memorymemorys_ = copy.deepcopy(self.memorys)for i in range(0, len(self.memorys) - 1):if memorys_[i].state == 0 and memorys_[i].size >= allocate_size:if memorys_[i + 1].state == -1:del self.memorys[i]p = Memory(i, memorys_[i].base, allocate_size, 1)self.memorys.insert(i, p)self.memorys[i + 1].state = 0self.memorys[i + 1].base = memorys_[i].base + allocate_sizeself.memorys[i + 1].size = self.main_memory - self.memorys[i].sizeself.main_memory -= allocate_sizebreakelif memorys_[i + 1].state == 1:# memorys[i+1]=memorys_[i+1]self.memorys.pop(i)self.memorys.insert(i, Memory(i, memorys_[i].base, allocate_size, 1))# del memorys[i + 1]self.memorys.insert(i + 1,Memory(i + 1, self.memorys[i].base + self.memorys[i].size, memorys_[i].size - allocate_size,0))self.main_memory -= allocate_sizeself.memorys.pop()breakfor i in range(len(self.memorys)):self.memorys[i].seq = ireturn self.memorys[:self.length_of_MBT_table]def release(self,r):# global main_memorytmp = 0memorys_ = copy.deepcopy(self.memorys)for i in range(r, len(self.memorys) - 1):if self.memorys[i + 1].state == 1:self.memorys[i].state = 0self.main_memory += memorys_[i].sizebreakelse:self.main_memory += self.memorys[i].sizetmp += self.memorys[i].sizedel self.memorys[i]self.memorys.insert(i, Memory(i, 0, 0, -1))self.memorys[r - 1].size += tmpreturn self.memorysdef menu(self):print("\tMENU\t")print("\t0 finish\t")print("\t1 allocate space\t")print("\t2 release space\t")print('\tPlease input your choice:\t')def printf_all(self):global xxprint("Please input your main_memory's space:")self.main_memory = int(input())print("Now input length of your MBT-table:")self.length_of_MBT_table = int(input())self.memorys = []self.init()self.printf(self.memorys)while (1):self.menu()opt = int(input())if opt == 0:breakelif opt == 1:print("Input size of the space you want to allocate:")allocate_size = int(input())self.allocate(allocate_size)self.printf(self.memorys)elif opt == 2:print("Input size is that you want to release:")r = int(input())self.release(r)self.printf(self.memorys)
if __name__ == '__main__':# passmain()

操作系统内存管理_MBT_LRU相关推荐

  1. 操作系统内存管理-Linux版

    引言 操作系统内存管理:总的来说,操作系统内存管理包括物理内存管理和虚拟内存管理. 物理内存管理: 包括程序装入等概念.交换技术.连续分配管理方式和非连续分配管理方式(分页.分段.段页式). 虚拟内存 ...

  2. 操作系统内存管理——分区、页式、段式管理

    操作系统内存管理--分区.页式.段式管理 标签: 内存管理操作系统数据结构算法 2010-07-05 11:26 20805人阅读 评论(5) 收藏 举报 分类: 操作系统(4) 版权声明:本文为博主 ...

  3. 操作系统内存管理-原理

    任何新技术都是在一点一点的积累中成熟并呈现在世人的面前,就像猿人进程成人也不是一簇而就的,而是在漫长的岁月中一点一点的进化与完善.还比如现代的吸尘器,当前发明吸尘器的那个人只是用了一台风扇的电机和叶片 ...

  4. 计算机操作系统 - 内存管理

    计算机操作系统 - 内存管理 目录 计算机操作系统 - 内存管理 虚拟内存 分页系统地址映射 页面置换算法 1. 最佳 2. 最近最久未使用 3. 最近未使用 4. 先进先出 5. 第二次机会算法 6 ...

  5. 操作系统内存管理及虚拟内存技术

    一.内存管理 操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情. ...

  6. 4、操作系统内存管理——页面的换入换出

    注:参考哈工大李治军老师公开课. 对于用户而言,用户看到的是一个整体的内存入4G,而且用户可以随便访问4G内存空间的任意位置:但是对于真实的物理内存可能只有1G大小,当用户访问内存时,如果内存里面有需 ...

  7. 内存与操作系统内存管理

    内存与操作系统内存管理 文章目录 内存与操作系统内存管理 一.内存的基础知识 二.内存管理 2.1 内存空间扩充 2.2 内存空间的分配与回收** Java.大数据开发学习要点(持续更新中-) 一.内 ...

  8. 操作系统 内存管理单元MMU TLB

    前言 在了解操作系统 内存管理 分页/分段/段页式管理.操作系统 虚拟内存技术两篇文章后,接下来继续看看现代操作系统基本内存管理方式,本文详细介绍Linux操作系统下的内存管理单元MMU和TLB. d ...

  9. 操作系统 内存管理总结

    目录 内存管理介绍 什么是虚拟内存(Virtual Memory)? 逻辑(虚拟)地址和物理地址 CPU 寻址了解吗?为什么需要虚拟地址空间? 局部性原理 操作系统是如何管理虚拟地址与物理地址之间的关 ...

最新文章

  1. echarts 横纵分割线颜色透明度
  2. linux中sqlplus不能用_装修中不能用海沙,但是海沙已经偷偷走进了你的家
  3. 学习之路三十一:Varchar和NVarchar的理解
  4. 大型对冲基金正训练AI交易 5年后AI在量化中将成主流
  5. hdu 2072 单词数
  6. 图解Go语言内存分配
  7. tensorflow官方posenet模型解析
  8. add结果 bigdecimal_java.math.BigDecimal.add(BigDecimal augend)方法
  9. 传统到敏捷的转型中,谁更适合做Scrum Master?
  10. Rokon 关于精灵的点击事件
  11. AndroidStudio安卓原生开发_Activity的启动方法_3种activity的启动方法_显示启动Activity---Android原生开发工作笔记82
  12. 【推荐实践】推荐系统中模型训练及使用流程的标准化
  13. 图像处理之matlab中fspecial函数用法详解
  14. signature=4d7e0a8216b57730ec16fe4e5ae2b93f,dragonfly对接harbor拉取镜像没有走dragonfly问题
  15. 阿里云直播服务拉流地址播放不出来
  16. 第3章 远程连接管理Linux实践
  17. 如何设置Office Word2003的一级与二级标题
  18. 2014秋冬季校招时间表,持续更新
  19. 【 javascript】JS语法 ES6、ES7、ES8、ES9、ES10、ES11、ES12新特性
  20. 第五十一章 SQL函数 DECODE

热门文章

  1. CSU-ACM2019寒假训练1-E - 可能简单题
  2. Vic-软件测试-开始软件测试
  3. 服务器响应程序,封装高可复用的服务端响应SSC程序修复对象 --ServerResponse
  4. study mysql
  5. 计算机视觉——一种现代方法(第二版)学习笔记
  6. 提升STEAM教师能力素养提升路径
  7. 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
  8. vim配置即.vimrc文件的配置及vim操作技巧
  9. 最全最好用的vim配置(即.vimrc文件的配置),附加vim操作技巧
  10. python(2) qypt安装 qy designer安装