【问题标题】:How to write a simple malloc function in c如何在c中编写一个简单的malloc函数
【发布时间】:2012-02-07 12:45:41
【问题描述】:

作为操作系统的一项任务,我们必须用 C 编程语言为 malloc 和 free 编写自己的代码,我知道如果我要求它的代码,我没有研究的意义。我面临的问题是不知道在哪里包括初始化 50000 字节的 char 数组并使两个列表可用和使用。在我的函数中,我无法触发 malloc 或 free 自动发生。并且将使用第 3 方主程序来测试我的功能..... 如果我的文件是 mymalloc.c 或其他什么

    void* myalloc(size_t size)
    {
        //code for allocating memory
    }
    void myfree(void *ptr)
    {
        //code for free the memory
    }

初始化内存空间和列表的代码会去哪里..

【问题讨论】:

标签: c linux malloc


【解决方案1】:

我将为您提供基本概念,您可以使用它来使用 C 编写自己的 malloc() 和 free() 函数代码。

  1. 假设我们有一个特定大小的连续内存块。它将是我们对内存的抽象意义,它将承载所有请求的内存分配以及用于保存有关这些已分配块的数据的数据结构。

  2. 我们使用一个简单的链表来携带与已分配和空闲内存块相关的数据。

其结构如下。

struct block{
         size_t size;  /*Specifies the size of the block to which it refers*/
         int free;  /*This is the flag used to identify whether a block is free 
                     or not*/                           
         struct block *next;   /*This points to the next metadata block*/
   }; 
  1. 为此,您需要 2 个源文件。一个是 mymalloc.h,它是包含初始化部分和我们将要实现的其余函数的函数原型的头文件。另一个是 mymalloc.c 源文件,其中包含所有必要的功能实现。

  2. 需要一个函数来初始化第一个空闲内存块。 还有另一个函数来分割一块内存,它有足够的空间来提供所请求的大小。另一种方法是扫描链表并合并任何连续的空闲块,以防止外部碎片。

注意:我们使用 First-fit-algorithm 来寻找一个空闲块来分配内存。

我认为这将帮助任何正在寻找一种使用 C 编写自己的 malloc 和 free 函数的简单方法的人。请点击以下链接获取详细说明。

http://tharikasblogs.blogspot.com/p/how-to-write-your-own-malloc-and-free.html

【讨论】:

    【解决方案2】:

    我认为你只需要实现一个内存管理器。所以你不必使用brk, sbrk, ... 只需将使用过的内存放在一个简单的数组中,然后以某种方式对其进行分段。由于这是家庭作业,因此您希望使其尽可能简单,否则由于作业的复杂性/时间限制,您会遇到问题。

    您只需决定要使用哪种策略。我建议使用buddy system。虽然它比最简单的要复杂一些..也许固定大小的碎片更简单..

    也许this 也是一本好书。

    不要像其他答案中建议的那样做一些低级的事情..

    【讨论】:

    • 我同意,即使我提出了艰难的建议:)
    • 谢谢兄弟。最后我找到了一种编码方法。我的代码工作正常。没有出现分段或任何故障。但是当我需要的大小超过 3306 字节时,它会给我一个分段错误。
    【解决方案3】:

    实现很大程度上取决于操作系统和架构,无论如何你可以看看这个:http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html

    (并研究它是如何工作的!)。

    【讨论】:

      【解决方案4】:

      如果您使用的是 unix 系统,您可以查看 brksbrk 的手册。这些系统调用“推送/设置”堆的限制。

      使用那些你可以管理你的内存页面,根据需要分配它们。

      我建议使用链表来管理您分配的不同空间并构建功能以拆分它们或在它们空闲时合并它们。

      如果您需要在高级应用程序中尝试您的代码,您可以将您的函数命名为 malloc/free,将它们编译为共享对象 (.so),然后使用 LD_PRELOADLD_LIBRARY_PATH 环境变量来加载您的 .so 并替换系统的 malloc。
      然后,您调用的每个命令都将使用您的共享对象,从而使用您的 malloc,告诉您您的 malloc 是否稳定或者它是否不符合现实。

      如果您需要一个明确的例子,我很乐意在这里放一些代码,但我不想让我的答案太难读。

      【讨论】:

        【解决方案5】:

        首先,你可以制作一个总是失败的假 malloc

         /* fake malloc */
         void* myalloc(size_t sz)
         { return NULL; }
        

        但那是“作弊”。你想做一个有用的malloc

        你可能想要进行一个系统调用来向内核请求内存。当然,您需要对称系统调用来释放内存。在 Linux 和许多 Posix 系统上,您会经常使用 mmapmunmap 系统调用。

        (您也可以使用sbrk,但将mmapmunmap 一起使用更简单、更通用)

        这个想法是您获得大块内存(使用mmap),然后您在内部管理较小的内存区域。有趣的细节是如何管理这些较小的区域。您可能希望以不同于“小”分配的方式处理大 malloc

        你真的很想看wikipedia page on memory allocation

        【讨论】:

          【解决方案6】:

          您可以有一个初始化为零的全局静态变量。然后在 mallocfree 函数的开头检查该变量。在您的 malloc 函数中,如果变量为零,则初始化您需要的任何内容,然后将变量设置为非零。在您的 free 函数中,如果变量为零,则返回。

          【讨论】:

            【解决方案7】:

            更像是一个简单的 malloc :

            void* my_malloc(size_t size)
            {
             return (sbrk(size));
            }
            

            man sbrk 会帮助你的。

            现在的问题是创建一个免费的并创建一个高效的malloc :-)

            如果你想测试你的 malloc,你可以这样做:

            $> LD_PRELOAD=/mypath/my_malloc.so /bin/ls

            但你需要先创建一个动态库,因为 malloc 是一个 .so

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-12-28
              • 1970-01-01
              • 2023-03-31
              • 2018-12-10
              • 1970-01-01
              • 1970-01-01
              • 2017-02-21
              • 1970-01-01
              相关资源
              最近更新 更多