改进 malloc() 算法的下一步是什么? [关闭]

2024-01-03

我自己写的简单malloc()函数,我想创建更快、更高效的变体。我编写的函数使用线性搜索并在内存中顺序连续分配。

改进该算法的下一步是什么?我当前版本的主要缺点是什么?我将非常感谢任何反馈和建议。

typedef struct heap_block
{  
    struct heap_block* next;
    size_t size;
    bool isfree;
}header;

#define Heap_Capacity 100000
static char heap[Heap_Capacity];
size_t heap_size;

void* malloc(size_t sz) 
{
    if(sz == 0 || sz > Heap_Capacity) { return NULL; }

    header* block = (header*)heap;
    if(heap_size == 0)
    {
        set_data_to_block(block, sz);
        return (void*)(block+1);
    }

    while(block->next != NULL) { block = block->next; }

    block->next = (header*)((char*)to_end_data(block) + 8);
    header* new_block = block->next;
    set_data_to_block(new_block, sz);

    return (void*)(new_block+1);
}

void set_data_to_block(header* block, size_t sz)
{
    block->size = sz;
    block->isfree = false;
    block->next = NULL;
    heap_size += sz;
}

header* to_end_data(header* block)
{
    return (header*)((size_t)(block+1) + block->size);
}

请注意malloc通常构建在较低级别的内存相关系统调用之上(例如mmap(2) http://man7.org/linux/man-pages/man2/mmap.2.html在 Linux 上)。看这个答案 https://stackoverflow.com/a/30005099/841108其中提到了 GNUglibc and musl-libc。也看看里面tcmalloc http://goog-perftools.sourceforge.net/doc/tcmalloc.html,所以研究一下源码several自由软件 malloc 实现。

为您提供的一些一般想法malloc:

  • 使用从操作系统检索内存mmap(并最终将其释放回操作系统内核munmap)。您当然不应该分配固定大小的堆(因为在具有 128GB RAM 的 64 位计算机上,您希望成功地malloc- 100 亿字节的区域)。
  • 将小分配与大分配分开,因此以不同方式处理malloc16 个字节来自malloc一兆字节。小分配和大分配之间的典型阈值通常是page http://en.wikipedia.org/wiki/Page_%28computer_memory%29大小(通常为 4Kbytes)。小的分配发生在页面内部。大的分配会四舍五入到页面。你甚至可能会非常特别地处理malloc两个单词(就像许多链表一样)。
  • 将请求的大小四舍五入为某个奇数(例如 2 的幂,或 2 的 3 次幂)。
  • 一起管理相似大小的内存区域,即具有相同的“奇特”大小。
  • 对于小内存区域,避免过早回收内存区域,因此保留之前的内存区域free-d 相同(小)大小的区域,以便在将来的调用中重用它们malloc.
  • 您可能会在地址上使用一些技巧(但您的系统可能有ASLR http://en.wikipedia.org/wiki/Address_space_layout_randomization),或者在每个内存区域附近保留一个描述其所属块的元数据字。
  • 一个重要的问题是,考虑到之前返回的一些地址malloc和论证free,找出该内存区域的分配大小。您可以操作地址位,您可以在之前的字中存储该大小,您可以使用一些哈希表等。详细信息are tricky.

请注意,细节很棘手,并且可能很难编写malloc实施比您的系统更好。在实践中,写出好的malloc is not一个简单的任务。您应该找到许多关于该主题的学术论文。

也看看垃圾收集 http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29技术。或许考虑一下Boehm 的保守 GC http://www.hboehm.info/gc/: 你将替换malloc by GC_MALLOC你不会担心free... 学习关于内存池 http://en.wikipedia.org/wiki/Memory_pool.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改进 malloc() 算法的下一步是什么? [关闭] 的相关文章

随机推荐

  • 如何在我的 iPhone 应用程序中使用 NSError?

    我正在努力捕获应用程序中的错误 并且正在考虑使用NSError 我对如何使用它以及如何填充它有点困惑 有人可以提供一个关于我如何填充然后使用的示例吗NSError 嗯 我通常做的是让我的方法在运行时可能会出错 并引用NSError指针 如果
  • 从 http://localhost/ 运行 file://

    我想知道如何使我的 html 项目不从 file 运行 而是作为本地主机运行 因为我实现的功能之一需要 getUserMedia 当从 file 加载时 浏览器会立即阻止该项目 我对此做了很多研究 但我仍然不明白应该如何做 所以如果可以的话
  • 如何加密cookie中的会话id?

    当我阅读有关会话劫持的文章时 我了解到对存储在 cookie 中的会话 ID 值进行加密会很好 据我所知 当我通过调用开始会话时session start PHP 不会加密 cookie 中的会话 id 值 如何加密会话 ID 值 然后用它
  • 添加和删​​除类不同的元素

    所以我目前正在学习 jquery 和一点动画的 tweenlite 我想保持基本 所以我目前正在构建一个投资组合网格 但我想添加一个元素的点击 另一个元素正在淡入 从右侧滑动并不重要 但是我找不到一种方法来使其工作 即 1 个元素有 1 个
  • 设置使用 anaconda 与 VS Code 和集成 Git 终端时卡住

    我想学习数据科学 所以使用了一些非常流行的 Python 模块 如 Pandas Matplotlib Numpy 等 所以我清理安装了 Anaconda 现在使用它作为我的默认 Python 解释器 还使用 Conda 来安装包和创建虚拟
  • Httpclient multipart/form-data 同时发布图像和 json

    我正在尝试使用 C 代码在一个请求中上传图像和 json 但服务器总是返回 400 错误请求 使用 fiddler 执行相同的请求返回状态代码 200 帮助 这是我的小提琴手代码 WebKitFormBoundary7MA4YWxkTrZu
  • OkHTTP Websocket:连接上的蒸汽意外终止

    我正在尝试连接到 Stack Exchange 聊天 Websocket websocket 用于接收聊天中的新事件 例如新消息 以下是用于创建 Websocket 的代码 String wsUrl getWsUrl Request wsR
  • 重用字符串流而不需要重新分配

    我试图弄清楚如何重用 stringstream 对象 而无需每次在流中放入某些内容时都需要重新分配底层字符串 我已经发现这个答案 https stackoverflow com questions 624260 how to reuse a
  • JNI-多线程

    我有一个从 C 调用的 Java 函数的 JNI 包装器 我试图从不同的线程调用一些方法 但在尝试获取 JNIEnv 指针的新副本时出现错误 代码我 m 使用如下并在每个方法中调用 JNIEnv GetJniEnvHandle Thread
  • 为什么 WAMP 中的 Apache 2.1.7 不将 PHP 错误记录到 PHP 错误日志中?

    我已经安装了WAMP 并决定在最新版本的WAMP中使用默认的Apache 2 1 7 原因是我的网站所在的主机服务器也使用 2 1 7 之前 我在 WAMP 中使用 Apache 2 2 11 因为我的上一个主机也使用该版本 我现在遇到的问
  • 使用 golang 打印可读变量

    如何以可读的方式打印地图 结构或其他内容 使用 PHP 您可以做到这一点 echo pre print r var echo pre or header content type text plain print r var 使用Gofmt
  • 如何从不同文件夹中的另一个.py调用def

    我有以下结构 utils dir 有generator py 文件 其中有3 个def 我在 inline dir 中有 test py 我正在尝试在 test py 中使用生成器 py 中的 defs inline dir 和 utils
  • 方法产量如何运作?

    在javadoc中有说yield方法 导致当前正在执行的线程对象暂时暂停并允许其他线程执行 凯瑟琳 塞拉 Katherine Sierra 和伯特 贝茨 Bert Bates SCJP 书中说 Yield 应该做的是 使当前正在运行的线程头
  • 标准形式 matplotlib -- 将 e 更改为 \times 10

    在 matplotlib 中 轴有时以标准形式显示 数字由刻度显示 类似 1e 7 的内容由轴显示 有没有办法将其更改为写出的 times 10 7 我不想更改每个刻度上的标签 我希望更改出现在轴底部的 1e 7 文本 最简单的答案 使用乳
  • 如何验证或验证 JWT 签名?

    我正在尝试在 Java 中验证 JWT 令牌 如何验证或验证 JWT 令牌的 JWT 签名 您可以使用 Spring Security 中的 JWT 库 网址为https github com spring projects spring
  • Android 短信发送状态

    我需要在我的 Android 应用程序中实现一个功能来发送短信 我找到了许多与此相关的教程 但无法获得交付状态 失败或正常 以下是我的短信方法 private void sendSmsMessageWithStatus String pho
  • SWT Shell 根据子项调整大小

    我正在研究这个Composite画布上还有其他Composite可以添加和删除 我对整个布局概念的理解仍然很模糊 当孩子被添加到容器中时 考虑到容器有一个GridData它填充了父级 父级不应该也知道子级调整了大小吗 由于外壳 顶部父级 的
  • Google 可视化 API 示例中的“无效 JSON 字符串”

    我大致如下这个例子 http code google com apis chart interactive docs dev gviz api lib html tojsonexample 但一定是在做一些愚蠢的事情 服务器端Django视
  • C# winform 应用程序未获取 Machine.Config 中的 maxTimeout 值

    我一直在开发一个带有 Oracle 10g 数据库的 winform 应用程序 该应用程序正在使用TransactionScope并想修改maxTimeOut指定的值机器配置文件 我的机器配置文件位于以下位置 我为此应用程序使用 net 4
  • 改进 malloc() 算法的下一步是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我自己写的简单malloc 函数 我想创建更快 更高效的变体 我编写的函数使用线性搜索并在内存中顺序连续分配 改进该算法的下一步是什么