操作系统实验三、四:动态分区存储管理(python)

目录

一、实验目的:

二、实验内容: 

三、实验代码(BF算法)

BF算法完整实验代码:

四、实验代码(FF算法)

FF算法完整实验代码:


一、实验目的

编写程序,实现动态分区存储管理算法,模拟动态分区存储分配、回收和合并的过程,加深对动态分区存储管理的理解。

二、实验内容: 

模拟实现至少两种动态分区存储管理算法(首次适应算法、最佳适应算法或最坏适应算法等)。每种算法包括动态分区存储分配、回收和合并的过程,熟悉并掌握各种算法的空闲区组织方式。实验内容如下:

1、分区的初始化——可以由用户输入初始分区的大小(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)。

2、分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。

3、分区的回收:用户输入作业号,实现分区回收,同时,分区的合并也要体现出来(注意:不存在的作业号要给出错误提示!)。

4、分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区是空闲或者占用的,能够显示出来)。

实验要求如下:

(1)内存空间不足的情况,要有相应的显示;

(2)作业不能同名,但是删除后可以再用这个名字;

(3)作业空间回收时输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

三、实验代码(BF算法)

本次实验采用BF算法(最佳适应算法)具体步骤如下:

分区的初始化:

elif select == '1':

   print("请输入内存大小:")

   size = int(input())

   a = Memory(0, size - 1, size, state=1, ID=0)

   b = []

   b.append(a)

分区的动态分配过程:

BF分配算法

def BF(work_id, work_length, li):

    for i in li:

        if i.Id == work_id:

            print('作业已存在!')

            return

    q = copy.copy(li)

    q = bubble_sort(q)      

    s = -1

    ss12 = -1

    for i in range(0, len(q)):

        p = q[i]

        if p.state == 1 and p.length > work_length:

            s = p.start                              

        elif p.state == 1 and p.length == work_length:

            ss12 = p.start

    if s == -1 and ss12 == -1:

        print("内存空间不足!")

        return

    for i in range(0, len(li)):

        p = li[i]

        if p.start == s:

            node2 = Memory(p.start + work_length, p.end, p.length - work_length, 1, 0)  

            a = Memory(p.start, p.start + work_length - 1, work_length, state=0, ID=work_id)

            del li[i]

            li.insert(i, node2)

            li.insert(i, a)

            show_memory(li)

            return

        elif p.start == ss12:

            p.state = 0

            show_memory(li

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是采用可变式分区管理,使用首次适应算法实现主存的分配与回收的 Python 代码: ```python # 定义空闲分区表 free_list = [(0, 100), (200, 300), (400, 500)] # 定义已分配分区表 alloc_list = [] # 首次适应算法实现分配 def allocate_first_fit(size): for i, (start, end) in enumerate(free_list): if end - start >= size: alloc_list.append((start, start + size)) free_list[i] = (start + size, end) return start return -1 # 回收分区实现 def deallocate(start): for i, (free_start, free_end) in enumerate(free_list): if start < free_start: if i == 0 or start > free_list[i - 1][1]: if i < len(free_list) and free_end == free_list[i + 1][0]: free_list[i] = (start, free_list[i + 1][1]) del free_list[i + 1] else: free_list.insert(i, (start, start)) break elif start == free_start: if i < len(free_list) and start + 1 == free_list[i + 1][0]: free_list[i] = (start, free_list[i + 1][1]) del free_list[i + 1] if i > 0 and free_list[i - 1][1] == start: free_list[i - 1] = (free_list[i - 1][0], free_end) del free_list[i] if i == 0 and len(free_list) > 1 and free_end == free_list[1][0]: free_list[0] = (start, free_list[1][1]) del free_list[1] break # 测试代码 print(f"初始的空闲分区表:{free_list}") print(f"初始的已分配分区表:{alloc_list}") print("分配 50:") start = allocate_first_fit(50) print(f"分配得到的起始地址:{start}") print(f"分配后的空闲分区表:{free_list}") print(f"分配后的已分配分区表:{alloc_list}") print("回收起始地址为 0 的分区:") deallocate(0) print(f"回收后的空闲分区表:{free_list}") print(f"回收后的已分配分区表:{alloc_list}") ``` 代码解释: 首先定义了一个空闲分区表 `free_list`,其中每个元素表示一个空闲分区的起始地址和结束地址。然后定义一个已分配分区表 `alloc_list`,其中每个元素表示一个已分配分区的起始地址和结束地址。 `allocate_first_fit` 函数使用首次适应算法实现分配。它遍历空闲分区表,找到第一个可用的分区,将其分配给请求的进程,并更新空闲分区表和已分配分区表。如果找不到可用的分区,则返回 -1。 `deallocate` 函数实现回收分区。它遍历空闲分区表,找到要回收的分区应该插入的位置,并更新空闲分区表。如果回收的分区与相邻的空闲分区可以合并,则合并它们。 最后,测试代码演示了如何使用这两个函数分配和回收分区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本科小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值