如何释放 MIPS 中的堆内存
How to free the heap memory in MIPS
出于学习目的,我正在尝试在堆内存中实现一个堆栈。
当我推送一些东西时,我只需要执行系统调用 sbrk
,这很好。
当我继续 pop 时,我可以检索我的值,但我无法释放分配的 space。有什么办法吗?
sbrk
系统调用不接受负数。我已经试过了。
与 UNIX 中真正的 sbrk
不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回给系统。
但是,您可以自己实现 sbrk
功能,因为它相当简单。 (malloc
/free
会更复杂,涉及空闲列表等,但这要简单得多。)
当然,你需要一个像真正的 sbrk
一样接受调整数的子程序,并保持少量 persistent/global 状态——也许两个词:UNIX 风格 sbrk
地址和 MARS 风格的系统调用 #9 地址,或者,其中之一和一个免费计数。
释放内存(负 sbrk
参数)仅仅意味着将 UNIX 风格的 sbrk
地址移回 and/or 增加空闲计数,否则什么都不做。
以后的分配(正 sbrk
参数)在分配新堆 space 时考虑标记之间的间隙或空闲计数,并且只有在空闲计数变为 0 时才增加底层 MARS 堆,并且有分配请求中还有更多字节。
出于学习目的,我正在尝试在堆内存中实现一个堆栈。
当我推送一些东西时,我只需要执行系统调用 sbrk
,这很好。
当我继续 pop 时,我可以检索我的值,但我无法释放分配的 space。有什么办法吗?
sbrk
系统调用不接受负数。我已经试过了。
与 UNIX 中真正的 sbrk
不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回给系统。
但是,您可以自己实现 sbrk
功能,因为它相当简单。 (malloc
/free
会更复杂,涉及空闲列表等,但这要简单得多。)
当然,你需要一个像真正的 sbrk
一样接受调整数的子程序,并保持少量 persistent/global 状态——也许两个词:UNIX 风格 sbrk
地址和 MARS 风格的系统调用 #9 地址,或者,其中之一和一个免费计数。
释放内存(负 sbrk
参数)仅仅意味着将 UNIX 风格的 sbrk
地址移回 and/or 增加空闲计数,否则什么都不做。
以后的分配(正 sbrk
参数)在分配新堆 space 时考虑标记之间的间隙或空闲计数,并且只有在空闲计数变为 0 时才增加底层 MARS 堆,并且有分配请求中还有更多字节。