操作系统第四次实验-基本分页存储管理(python代码实现)

news2024/9/29 5:34:03

一、实验目的:

目的:熟悉并掌握基本分页存储管理的思想及其实现方法,熟悉并掌握基本分页存储管理的分配和回收方式。
任务:模拟实现基本分页存储管理方式下内存空间的分配和回收。

二、实验内容:

1、实验内容
内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换 为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)
基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间。
作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收)。
分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

三、实验代码

import random


class Work:
    blockStorage = []

    def __init__(self, workName='', pageSize=0):
        self.workName = workName
        self.pageSize = pageSize
def initMemory(mylist):
    count = 0
    for i in range(10):
        k = []
        mylist.append(k)
        for j in range(10):
            k.append(0)
            count = count + 1
    print("随机向内存的10个物理块分配空间...")
    k = 0
    while k < 10:
        i = random.randint(0, 9)
        j = random.randint(0, 9)
        mylist[i][j] = 1
        k = k + 1
    return mylist


def showMemory(memory):
    for i in range(10):
        print(memory[i])
    print()


def Partition(Mylist, Work):
    pageTemp = Work.pageSize
    for i in range(10):
        for j in range(10):
            if Mylist[i][j] != 1:
                Mylist[i][j] = 1
                # 记录分配的每个物理块的行和列
                Work.blockStorage.append([i, j])
                pageTemp = pageTemp - 1
                # 判断该作业是否已经分配至内存空间
                if (pageTemp == 0):
                    return


def getMemorySize(Mylist):
    count = 0
    for i in range(10):
        for j in range(10):
            if Mylist[i][j] != 1:
                count = count + 1
    return count


def freeMemory(Mylist, Work):
    pageTemp = Work.pageSize
    while pageTemp >= 0:
        i = Work.blockStorage[pageTemp - 1][0]
        j = Work.blockStorage[pageTemp - 1][1]
        Mylist[i][j] = 0
        pageTemp = pageTemp - 1


if __name__ == '__main__':

    print("内存空间初始化:")
    mylist = []
    mylist = initMemory(mylist=mylist)
    showMemory(mylist)
    works = []  # 作业列表
    while True:
        print('1:分配\t\n2:回收\t\n3:显示\t\n4:退出')
        select = input('请输入想要执行的功能:')
        if select == '4':
            break
        elif select == '1':
            repeatFlag = 'y'
            while (repeatFlag == 'y'):
                try:
                    workName, pageSize = input("请输入作业名称和大小:").split()
                    for work in works:
                        if workName == work.workName:
                            print('作业已存在')
                            break
                    count=getMemorySize(mylist)
                    if int(pageSize)<=count:
                        work = Work(workName, int(pageSize))
                        Partition(mylist, work)
                        works.append(work)
                    else:
                        print("内存空间不足...")
                except Exception as e:
                    print(e)#"输入有误,请重新输入"
                else:
                    repeatFlag = input('是否继续(y/n):')
        elif select == '2':
            workName = input('请输入所要删除作业的名称:')
            findResult = 0
            workTemp = Work()
            for work in works:
                if workName == work.workName:
                    workTemp = work
                    findResult = 1
                    break
            if findResult == 0:
                print("作业不存在...\n")
            freeMemory(mylist, workTemp)
        elif select == '3':
            showMemory(mylist)
        else:
            print("输入错误,请重新输入")

四、实验结果

首先进行内存的初始化:
在这里插入图片描述
进行三个作业的内存分配:
在这里插入图片描述
内存空间状态:
在这里插入图片描述
输入同名作业a,提示作业已经存在:
在这里插入图片描述
输入作业大小超过内存空间的作业f,提示内存空间不足:
在这里插入图片描述
回收作业a和作业b,内存空间状态:
在这里插入图片描述
在这里插入图片描述
回收作业c,内存空间状态:
在这里插入图片描述
回收一个不存在的作业g,提示作业不存在:
在这里插入图片描述

五、实验总结

通过本次基本分页存储管理实验,我进一步掌握了基本分页存储管理的思想和相应的实现方法,其次掌握了基本分页存储管理的分配和回收方式。

这次的实验相较于上次的动态分区存储管理实验相比相对来说要容易一些,而且本次实验中对于多种情况的处理包括内存空间不足、作业不能同名等都有着类似的实现思想,因此这次的实验总体而言进行地较为顺利,遇到的一些问题也都得到了很好的解决。

在具体的实现过程中,也有几个亮点。比如在对初始时部分已分配物理块的选择上,我没有直接将固定某些行列对应的物理块实现分配,而是调用了Python中的random函数,随机向内存的若干个物理块分配空间。这在一定程度上增加了该模拟实验的随机性和真实性。其次因为作业分配和回收之间需要靠物理块号来确定每个作业所有物理块在内存中的位置,这其中需要进行行号、列号与物理块号的转换,稍微有一些麻烦,我采用的是通过在作业数据结构定义一个存储每一个物理块行号和列号的列表,每分配一个页面到物理块就记录该物理块的行号与列号,两者作为一个元素,保存至该列表中,在进行作业回收时直接根据该列表中的记录在内存中回收物理块即可,相对来说实现容易一些。

总的来说,这次实验加深了我对基本分页存储管理思想的理解,其次也进一步锻炼了自身的coding能力,是一次收获不小的实验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一道有意思的图论题

今天写这道题的过程就一直在摆&#xff0c;主要是写不太出来&#xff0c;之前想到动态规划去了&#xff0c;然后又开始深搜&#xff0c;在出口那块放动态规划 题&#xff1a; D. Ela and the Wiring Wizard 点我 但是cf让我明白了一个道理&#xff0c;任何一道我写不出来的题代…

点菜方案数

题目描述 不过uim的口袋里只剩 M元(M < 10000)&#xff0c;来到了一家低端餐馆前。 餐馆虽低端&#xff0c;但是菜品种类不少&#xff0c;有 N 种(N < 100)&#xff0c;第i种卖元(ai < 1000)。由于是很低端的餐馆所以每种菜只有一份。 uim奉行“不把钱吃光不罢休”&a…

作用域与作用域链

javascript拥有一套设计良好的规则来存储变量&#xff0c;并且之后可以方便的找到这些变量&#xff0c;这套规则叫做作用域。 内部原理 内部原理分成编译、执行、查询、嵌套和异常五部分。今天来简单说一下查询。 var a2;这行代码中&#xff0c;在引擎执行的第一步操作中&am…

【C++ Primer】阅读笔记(3):decltype

目录 简介decltype基础decltype需要注意的地方1.decltype处理顶层const、引用与auto不同2.如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。3.如果表达式的内容是解引用操作,则decltype会得到引用类型。4.对于decltype所用的表达式来说,如果变量…

Spring AOP统一功能处理

⭐️前言⭐️ 这篇文章主要介绍AOP&#xff08;Aspect Oriented Programming&#xff09;——面向切面编程的思想&#xff0c;它是对某一类事情的集中处理&#xff0c;也是对OOP&#xff08;Object Oriented Programming&#xff09;面向对象编程的补充和完善。 &#x1f349;…

【编程语言选择】我们学C++将来能做什么?

首先贴上C嘎嘎祖师爷的镇楼帅照&#x1f606; 凝视目录 什么是C C的使用广泛度 C的具体工作领域有什么 什么是C 简单说 C是基于C语言而产生的&#xff0c;它既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可…

【区块链 | 前端】前端开发人员入门区块链的最佳实践

前端开发人员入门区块链的最佳实践 一. 建立信仰 从技术入门一个行业通常是漫无目的&#xff0c;个人认为正确的入行区块链的方式是去了解他的背景&#xff0c;是去建立自己信仰的&#xff0c;尤其身处一个刚起步就被扼杀的行业&#xff0c;我们每个人都是领头人&#xff0c;我…

06栈和队列

开始系统学习算法啦&#xff01;为后面力扣和蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括概念&#xff0c;算法运行过程&#xff0c;以及代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私信博…

[NOIP 2003] 栈(三种方法:DP、数论、搜索)

[NOIP2003 普及组] 栈 题目背景 栈是计算机中经典的数据结构&#xff0c;简单的说&#xff0c;栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作&#xff0c;即 pop&#xff08;从栈顶弹出一个元素&#xff09;和 push&#xff08;将一个元素进栈&#xff…

5 个必须尝试的无代码应用

无代码软件让任何人无需了解编程语言即可构建产品、网站和应用程序。Editor XWix 发布了Editor X&#xff0c;这是一款无需编写任何 CSS &#xff08;层叠样式表&#xff09;或 HTML&#xff08;超文本标记语言&#xff09;代码的新型拖放式网站构建器&#xff0c;为设计师和机…

如何把可观测需求落地为业务大盘?

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云技术专家李加贝向参会企业代表分享了如何把可观测需求落地为业务大盘的议题。本文根据现场分享内容整理而成。 为什么需要 Grafana&#xff1f; 演…

智能合约Smart Contract技术详解

文章目录合约编写基本介绍构造方法ipfsmint提现白名单合约前端部署验证合约代码前端和合约交互准备工作获取已经mint了的数量mint合约编写 建议读者先了解下solidity&#xff0c;这里推荐CryptoZombies&#xff0c;还是比较详细的。 ok当你大概知道自己在做什么之后&#xff0…

【概率论】期末复习笔记:假设检验

假设检验目录一、假设检验的基本概念1. 假设检验的基本原理2. 两类错误3. 假设检验的一般步骤4. ppp值二、正态总体参数的假设检验σ2已知&#xff0c;检验μ与μ0的关系\color{dodgerblue}\sigma^2\text{已知&#xff0c;检验}\mu\text{与}\mu_0\text{的关系}σ2已知&#xff…

上海华清远见

解析设备树节点信息实例1获取属性数值实例2获取u32类型的值将获取到的u32类型的值存放在array数组中

什么是许可式邮件营销?

邮件是很多企业日常中用到的信息传播工具&#xff0c;并且它还具备了成本低、长期性等优点&#xff0c;所以很多企业选择使用邮件作为载体进行营销推广。而在进行邮件营销的时候&#xff0c;不同的方式和技巧也会影响到最终的营销效果。为了达到较好的营销效果&#xff0c;很多…

Seata应用

下载seata-server 下载地址&#xff1a;Tags seata/seata GitHub 配置Seata-server 第一步&#xff1a;配置seata-server数据源 E:\seata-server-1.4.2\seata\seata-server-1.4.2\conf\file.conf 第二步&#xff1a;创建seata数据库 create database seata 第三步&#xf…

单元测试-SpringBoot Test和Mock

单元测试-SpringBoot Test和Mock “单元测试” “junit&#xff0c;mock&#xff0c;桩” 1. 什么是单元测试 定义&#xff1a;是指对软件中的最小可测试单元进行检查和验证。 Java里单元指一个方法。单元测试是在软件开发过程中要进行的最低级别的测试活动&#xff0c;软件的…

玻纤效应对skew的影响(三)

玻纤效应对skew的影响&#xff08;一&#xff09;玻纤效应对skew的影响&#xff08;二&#xff09;对内skew对32Gbps NRZ和64Gbps PAM-4的影响这一篇中&#xff0c;玻纤效应造成的对内skew将会加入到32Gbps NRZ和64Gbps PAM-4 SerDes全链路分析中。PCIe 5.0代表32Gbps NRZ&…

C++GUI之wxWidgets(11)-编写应用涉及的类和方法(6)-事件处理(5)

目录自定义事件wxPostEvent()wxQueueEvent()PopEventHandler()Bind()GetEventUserData()Connect()Unbind()定义自己的事件类事件处理程序与虚拟方法自定义事件 wxPostEvent() void wxPostEvent ( wxEvtHandler * dest,const wxEvent & event ) 在GUI应用程序中&am…

云开发项目中如何管理用户和管理授权?

管理用户 在项目中添加用户后&#xff0c;才能为用户授予对应的资产管理权限。支持修改已创建用户的密码和删除用户。 本文中的 用户 是指在云项目下创建的 B 端子账号&#xff0c;可以和资产授权配合使用&#xff0c;管理 B 端设备和资产。这些 B 端用户账号可以在 智慧行业…