C-设计自己的免费()函数[英] C - Design your own free( ) function

本文是小编为大家收集整理的关于C-设计自己的免费()函数的处理方法,想解了C-设计自己的免费()函数的问题怎么解决?C-设计自己的免费()函数问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

今天,我出现了面试,面试官问我这个,

  1. 告诉我步骤您将如何设计自己的free( )功能 处理分配的内存.
  2. 如何比C的默认free()函数更有效?你能得出什么结论?

我很困惑,无法想到设计方法.

您认为伙计们什么?


编辑:,由于我们需要了解malloc()的工作原理,您能告诉我写我们自己的malloc()函数的步骤

推荐答案

这实际上是一个非常模糊的问题,这可能就是为什么您感到困惑的原因.他的意思是,鉴于现有的Malloc实施,您将如何尝试开发一种更有效的方法来释放基础内存?还是他希望您开始讨论各种Malloc实施及其好处和问题?他是否希望您知道虚拟内存在X86体系结构上的功能?

,从更有效的情况下,他是否意味着更有效的空间效率或更高的时间效率? Free()必须确定性吗?它是否必须将记忆力尽可能多的内存返回到操作系统,因为它处于低内存,多任务处理环境中?我们的标准是什么?

除了开始提出自己的问题以获取澄清之外,很难从哪里开始.毕竟,为了设计自己的免费功能,您首先必须知道如何实现malloc.因此,问题实际上是关于您是否了解如何实施Malloc.

如果您不熟悉内存管理的内部,则最简单的方法开始了解Malloc的实现方式是首先编写自己的.

查看此IBM DeveloperWorks文章称为"内存内存管理" for启动器.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

但是,在您写自己的malloc/free之前,您首先需要内存才能分配/免费.不幸的是,在受保护的模式OS中,您无法直接解决机器上的内存.那你怎么得到它?

您要求操作系统.借助X86的虚拟内存功能,可以通过OS映射任何RAM或交换内存.您的程序将其视为内存的内容可能会在整个系统中物理上分散,但是由于内核的虚拟内存管理器,它们看起来都一样.

内核通常提供系统调用,使您可以在进程中绘制其他内存.在较旧的Unix OS上,这通常是BRK/SBRK,可以将堆内存在过程的边缘或缩小它,但是许多系统还提供MMAP/MUNMAP,以简单地映射一大堆堆内存.可以访问您需要Malloc/免费管理的大型连续的内存块.

一旦您的流程具有一些可用的内存,所有这些都将其分成块,每个块包含其自己的元素信息和位置以及分配是否分配,然后管理这些块.一个简单的结构列表,每个结构都包含一些用于元信息的字段和大量字节,可以正常工作,在这种情况下,Malloc必须在列表中运行,直到找到足够大的未分配的块(或可以组合的块),并且如果找不到足够大的块,则在更多内存中映射.一旦找到块,您只需将指针返回数据即可.然后,Free()可以使用该指针将几个字节倒回到结构中存在的成员字段,然后可以修改该字段(即标记块.Altocated = false;).如果列表末尾有足够的未分配的块,您甚至可以将它们从列表中删除,并取消或从过程的堆中删除该内存.

这是实现malloc的真正简单方法.您可以想象,有很多可能的方法可以将记忆分为块,然后管理这些块.有数据结构和算法的方式很多.它们也用于不同的目的,例如由于小的,分配的小块与小的,未分配的块混合,或确保杂乱无章的碎片,或确保悬停和自由运行快速(或有时更慢,但可以预见的是慢慢).有 dlmalloc ptmalloc jemalloc

其他推荐答案

您不能盲目设计free()而又不知道malloc()在引擎盖下的工作原理>已实现.

因此,一个无法交付的问题可以是您如何设计malloc()和free()而不是一个琐碎的问题,但是您可以通过提出一些非常简单的实现来部分回答它当然不等于malloc()的内存池,但会表明您的知识.

其他推荐答案

仅当您只能访问用户空间(通常称为内存池)时,一种常见的方法是从应用程序启动时从操作系统中获取大量内存.您的malloc需要检查该池的哪个区域仍然是免费的(通过某些数据结构),并将指针分发给该内存.您的free需要在数据结构中再次将内存标记为免费的内存,并且可能需要检查池的碎片.

好处是您可以在几乎恒定的时间内进行分配,缺点是您的应用程序消耗的内存比实际需要更多.

本文地址:https://www.itbaoku.cn/post/358952.html