page contents

如何设计内存分配器?

想象一下,你在写一个小型的操作系统模拟器,或者说是在做内存管理的实验,系统给你一条线性内存,长度是 n,全是空的。你的任务是实现一个“内存分配器”,能做分配和释放操作。其实就是把现实里的 malloc/free 简化了一下,让我们能用代码玩一玩。初始化一开始我们需要一块大小为 n 的数组,每个位置表示一个内存单元。用 0 表示空闲,用其他数字表示被某个 mID 占用。这样看起来就很直观,就像一维的硬盘占用表。
attachments-2025-09-uR9H0epW68bf8039c0c00.png
想象一下,你在写一个小型的操作系统模拟器,或者说是在做内存管理的实验,系统给你一条线性内存,长度是 n,全是空的。你的任务是实现一个“内存分配器”,能做分配和释放操作。其实就是把现实里的 malloc/free 简化了一下,让我们能用代码玩一玩。
初始化
一开始我们需要一块大小为 n 的数组,每个位置表示一个内存单元。用 0 表示空闲,用其他数字表示被某个 mID 占用。这样看起来就很直观,就像一维的硬盘占用表。
class Allocator:
    def __init__(self, n: int):
        self.memory = [0] * n
分配
所谓分配,就是你要找一段连续的 size 个空位,把它们标记成 mID。关键点在于“最左侧优先”,所以我们只能从头往后扫,碰到连续的空闲区间长度够,就把它们占掉。    def allocate(self, size: int, mID: int) -> int:
        n = len(self.memory)
        count = 0
        start = -1

        for i in range(n):
            if self.memory[i] == 0:  # 空闲
                if count == 0:
                    start = i
                count += 1
                if count == size:
                    for j in range(start, start + size):
                        self.memory[j] = mID
                    return start
            else:
                count = 0
                start = -1

        return -1
释放
释放的时候就更直接了,把所有等于 mID 的位置还原成 0。题目要求的是“一个 mID 可以对应多个块”,所以我们要遍历整个数组。   
def freeMemory(self, mID: int) -> int:
        freed = 0
        for i in range(len(self.memory)):
            if self.memory[i] == mID:
                self.memory[i] = 0
                freed += 1
        return freed
使用示例
来跑一下,看看效果:
alloc = Allocator(10)
print(alloc.allocate(3, 1))  # 输出 0
print(alloc.allocate(2, 2))  # 输出 3
print(alloc.freeMemory(1))   # 输出 3
print(alloc.allocate(4, 1))  # 输出 0,因为释放了可以复用
思路小结
整个过程其实就是用数组模拟一条“内存带”,分配就是找到一段空格涂上 mID,释放就是把对应的涂掉。时间复杂度差不多就是 O(n),因为分配和释放都可能要扫描一遍数组。虽然和真实操作系统里的伙伴算法、堆管理啥的比起来太简单,但用来理解内存分配的基本逻辑挺合适的。你要不要我顺手再写个更高效的版本,用区间管理的方式(比如平衡树或者堆),这样 allocate 就不用每次都扫一遍了?

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1351 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2188 文章
  3. Pack 1351 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章