Memory management 实现内存管理的不同方法

Memory management 实现内存管理的不同方法,memory-management,z80,Memory Management,Z80,故事如下,我正在从头开始构建一台基于Z80的计算机,我的意思是,将Z80、外围设备、RAM和ROM焊接在一起。但一旦完成,我将得到超过64K的RAM(我使用内存库获得的内存超过了Z80的寻址能力),我不知道如何管理。我的想法是在计算机上编写一个简单的lisp解释器,但我也希望动态数组或字符串,我显然需要类似malloc的东西 所以问题是,一旦你有了一块连续的内存,你如何分割它并管理它 及 你能告诉我一些方法/算法吗?我想保持它的简单,但也不要偷懒和做得对。你至少需要一些经典Z80术语中所谓的“公

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

所以问题是,一旦你有了一块连续的内存,你如何分割它并管理它


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

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

例如,如果您有32K固定、32K银行(这是目前最容易连接的),那么您将为您的数据分配一组银行。然后,您需要为每个银行提供一个标准的分配器(first/last fit),只需在银行间迭代,就可以找到一个有空间的分配器。换句话说,这个问题不是一个“银行化的malloc”问题,而是一个普通malloc问题的for循环,对于小型机器,存在大量繁琐的malloc实现

对于免费/realloc,您还需要记住银行号码。由于数据可能会移动到银行,Realloc稍微有点棘手

对于数据来说,最困难的情况是,如果您想尝试将某些内容保存在一起(例如,您可以在不复制或连续切换银行的情况下比较两个字符串)

我想如果我在构建一台lisp机器,我会从68000开始

类似tiny68K的东西 (这是附加的)

如果存在不同的数据类型(Lisp中确实有:),则可以使用此类型作为主要标准,并始终将整个银行分配给一个类型(或一组类似的类型),然后在分配给其类型的银行内分配项目。合理的做法是,一种类型的数据通常与同类数据的交互比与其他孩子的交互更频繁。让它们彼此靠近将有助于减少银行转换。对于字符串尤其如此

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

类似地,在分配时,将所有新数据分配到该类型的最后一个指定块中,而不是在任何以前的块中搜索孔,可能会很有用。再次考虑到速度问题,在存储新数据时,还要减少垃圾收集时间

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

底线是尝试将面向块(存储)内存的缺点转化为优点