采用可变式分区管理,使用空闲区链实现主存的分配与回收(C++实现)

算法思想:

采用可变式分区管理,使用空闲区链实现主存的分配与回收

要求采用首次适应法管理空闲区链来进行。

  1. 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要。而且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量,查看是否有足够的空闲空间。若有,则按需求量分割一部分给作业,若无则作业等待,随着作业的装入、完成,主存空间被分割成许多大大小小的分区,有些分区被作业占用,有的分区空闲。
  2. 空闲区链,记录主存空间使用情况的一种较好方法是将表格信息,附加在每个已分配区和未分配区空闲区表中。
  3. 当有进程要求分配主存时,首先根据首次适应算法从链头开始,沿链查找一个足够容纳该进程的空闲区,若这个空闲分区比较大,则一分为二,一部分分配给进程,另一部分作为空闲区链仍在链中当前位置,但修改它的上一个空闲区的前向指针加上分配作业的大小,下一个空闲区的后向指针加上分配作业的大小,使链保持完整。若这个分区的大小正好等于作业大小,则该空闲分区全部分配给作业,并将该空闲分区从链中摘除。

 代码:

#include<iostream>
#include<string>
#include<list>
using namespace std;
typedef struct freeArea {
	int startingAddress;
	int length;
}freeArea;
typedef struct alreadyAssignedArea {
	int startingAddress;
	int length;
	stri
  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 Python 代码,用于实现采用可变分区管理和首次适应算法的内存分配回收: ```python # 定义一个空闲分区列表,用于存储空闲的内存分区 free_list = [] # 定义一个占用分区列表,用于存储已经被占用的内存分区 used_list = [] # 初始化空闲分区列表 def init_free_list(size): free_list.append([0, size]) # 在空闲分区列表中查找第一个适合大小的分区 def find_first_fit(size): for i, (start, end) in enumerate(free_list): if end - start >= size: return i return -1 # 将一个新的分区插入到空闲分区列表中 def insert_free_block(start, end): for i, (s, e) in enumerate(free_list): if s > start: free_list.insert(i, [start, end]) return free_list.append([start, end]) # 从空闲分区列表中删除一个分区 def remove_free_block(block): free_list.remove(block) # 主存分配函数 def allocate(size): index = find_first_fit(size) if index >= 0: start, end = free_list[index] if end - start == size: remove_free_block(free_list[index]) else: free_list[index][0] += size used_list.append([start, start + size]) return start else: return -1 # 主存回收函数 def deallocate(start): for i, (s, e) in enumerate(used_list): if s == start: del used_list[i] insert_free_block(s, e) return ``` 在这个实现中,我们使用两个列表来分别存储空闲和占用的内存分区。`init_free_list` 函数用于初始化空闲分区列表,`find_first_fit` 函数用于在空闲分区列表中查找第一个适合大小的分区,`insert_free_block` 函数用于将一个新的分区插入到空闲分区列表中,`remove_free_block` 函数用于从空闲分区列表中删除一个分区。 `allocate` 函数用于分配主存,它首先调用 `find_first_fit` 函数查找适合大小的空闲分区,如果找到了,就将这个分区空闲分区列表中删除,并将它添加到占用分区列表中。如果这个分区的大小与需要分配的大小相同,就直接返回这个分区的起始地址;否则,就将这个分区的起始地址向前移动一定的大小,然后返回新的起始地址。 `deallocate` 函数用于回收主存,它查找占用分区列表中起始地址为 `start` 的分区,并将它从占用分区列表中删除,然后将这个分区插入到空闲分区列表中。 这个实现只是一个简单的实现,还可以进行优化,例如使用更高效的查找算法,或者将空闲分区列表按照大小排序等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AHU_YZQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值