【问题标题】:Different ways for implementing Memory Management实现内存管理的不同方法
【发布时间】:2018-03-26 11:54:59
【问题描述】:

故事如下,我正在从头开始构建基于 Z80 的计算机,我的意思是,将 Z80、外围设备、RAM 和 ROM 焊接在一起。但是一旦完成,我最终将拥有超过 64K 的 RAM(我正在使用内存库来获得比 Z80 能够寻址的更多的内存),我不知道如何管理。我的想法是在计算机上编写一个简单的 lisp 解释器,但我也想要动态数组或字符串,我显然需要 malloc 之类的东西。

那么问题来了,一旦你有了一块连续的内存,你如何对它进行分片和管理呢?

你能告诉我一些方法/算法吗?我想保持简单,但不要偷懒,做对了。

【问题讨论】:

    标签: memory-management z80


    【解决方案1】:

    您至少需要一些经典 Z80 术语中所谓的“公共”空间。您不能一次切换所有内存,否则会丢失指令和堆栈。

    例如,如果您有 32K 固定、32K 存储(这是迄今为止最容易电汇的),那么您将为您的数据分配一堆存储库。然后,您需要为每个银行提供一个标准分配器(第一个/最后一个),并简单地遍历银行以找到一个有空间的分配器。换句话说,这个问题不是“banked malloc”问题,而是普通 malloc 问题的 for 循环,并且有大量用于小型机器的琐碎 malloc 实现。

    对于 free/realloc,您还需要记住银行号码。 Realloc 稍微复杂一些,因为数据可能会移动。

    如果您想尝试将一些东西放在一起(例如,这样您就可以比较两个字符串而无需复制或不断的银行切换)

    如果我正在构建 lisp 机器,我想我会从 68000 开始,但是 8)

    类似于 tiny68K https://retrobrewcomputers.org/doku.php?id=boards:sbc:tiny68k

    【讨论】:

      【解决方案2】:

      (这是Alan Cox answer的补充)

      如果有不同的数据类型(Lisp 确实有它们:)),使用这种类型作为主要标准并总是将整个银行分配给一个类型(或者可能是一组类似的类型)可能会很有用,然后在分配给其类型的银行内分配项目。合理的是,一种类型的数据通常与同类数据进行交互,而不是与其他孩子一起玩。将它们彼此靠近将有助于减少银行转换。对于字符串尤其如此。

      虽然这可能会浪费空间,但确实会减少搜索(取决于 c 的银行结构)。根据可用块的数量(和铲出的数据),它很快就会相等。

      类似地,在分配它时可能将所有新数据分配到此类型的最后一个分配块中,而不是在任何先前的块中搜索孔。再次出于速度考虑,在存储新数据时,也为了减少垃圾收集时间。

      只有当最新添加的块被填满时,才可以重新组织块 - 或者如果这不适合该数据类型的整个组。这带来了两个好处:第一,只需要重组用于这种数据类型(组)的存储体,而不是整个数据存储器,从而节省垃圾收集时间。其次,也许更重要的是,随着时间的推移,最少使用的日期将移至该类型的“早期”块,而经常更改的日期将移至最后。这将再次减少银行业务需求,因为现在已经证明会发生很大变化(因此被大量访问)的数据彼此靠近,甚至可能在一个块内。

      底线是尝试将面向块(banked)内存的劣势转变为优势。

      【讨论】:

        猜你喜欢
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        相关资源
        最近更新 更多