当前位置: 首页 > 知识库问答 >
问题:

malloc()使用brk()还是mmap()?

隗高旻
2023-03-14
// program break mechanism
// TLPI exercise 7-1

#include <stdio.h>
#include <stdlib.h>

void program_break_test() {
    printf("%10p\n", sbrk(0));

    char *bl = malloc(1024 * 1024);
    printf("%x\n", sbrk(0));

    free(bl);
    printf("%x\n", sbrk(0));

}

int main(int argc, char **argv) {
    program_break_test();
    return 0;
}

编译以下代码时:

 printf("%10p\n", sbrk(0));

我得到警告提示:

格式“%p”需要类型为“void*”的参数,但参数2的类型为“int”

在Imalloc(1024*1024)之后,程序中断似乎没有改变。

以下是输出:

9b12000
9b12000
9b12000

问题2:进程在启动时是否在堆上分配内存以供将来使用?还是编译器更改了分配的时间点?否则,为什么?

mallopt()可以设置参数来控制malloc()的行为,并且有一个名为m_mmap_threshold的参数,一般情况下:

  • 如果请求的内存小于它,则将使用brk()
  • 如果请求的内存大于或等于它,则将使用mmap()

该参数的默认值是128KB(在我的系统上),但在我的测试程序中我使用了1MB,所以选择了mmap(),当我将请求的内存更改为32KB时,我看到将使用brk()

这本书在TLPI第147页和第1035页提到了这一点,但我没有仔细阅读这部分。

该参数的详细信息可以在mallopt()的手册页中找到。

共有1个答案

慕容典
2023-03-14

如果我们更改程序以查看malloc的内存在哪里:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void program_break_test() {
  printf("%10p\n", sbrk(0));

  char *bl = malloc(1024 * 1024);
  printf("%10p\n", sbrk(0));
  printf("malloc'd at: %10p\n", bl);

  free(bl);
  printf("%10p\n", sbrk(0));

}

int main(int argc, char **argv) {
  program_break_test();
  return 0;
}

sbrk不会改变,这可能更清楚一些。malloc给我们的内存被映射到一个完全不同的位置。

您还可以在Linux上使用strace查看进行了哪些系统调用,并发现malloc正在使用mmap执行分配。

 类似资料:
  • 问题内容: 如果malloc / free是作为libc中的库例程实现的,那么它是在 sbrk syscall还是 mmap syscall或其他东西之上实现的呢? 通常, sys / syscall.h 中声明的函数是否包含目标计算机中的所有系统调用? 问题答案: 和是标准C库函数,其是由每个C实现来实现。 C标准仅定义了这些函数的行为方式以及预期的行为。在每种实现方式中如何实现它们。 简而言之

  • 本文向大家介绍请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?相关面试题,主要包含被问及请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?时的应答技巧和注意事项,需要的朋友参考一下 Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内

  • 我有一个重要的问题。 我以前使用过JSF1.2。我会使用一些基本的标签,比如 还有像这样的脸 为了使用ajax功能,我与 例如我使用了q jetty Web服务器来使用JSF标记。今天,我在JSF2.0、PrimeFaces和glassfish应用服务器上工作了一周。 所以我有以下问题:我是与JSF合作过,还是与Mojarra合作过?抱歉,但我并不清楚这两种技术之间的确切区别。 多谢了,麦克

  • 问题内容: 内置函数在我看来更像Pythonic,但我发现使用起来更频繁。 Python文档指出它们是等效的。 一位博客作者声称这比。 我应该使用哪个? 问题答案: 我会用。 来自:https : //wiki.python.org/moin/DubiousPython#Premature_Optimization 尽管正确应用优化确实可以加快代码的速度,但很少使用[..]的优化代码会使代码更难阅

  • 问题内容: 对于我开发的某些应用程序(后来逐渐忘记了),我一直在编写纯SQL,主要是针对MySQL。尽管我在SQLAlchemy之类的python中使用过ORM,但是我并没有坚持很长时间。通常,这是文档或复杂性(从我的角度来看)使我退缩。 我这样看:如果要使用一种类型的数据库,则使用ORM进行可移植性,使用普通SQL。我真的在寻求有关在开发需要数据库支持的应用程序时何时使用ORM或SQL的建议。

  • 问题内容: 我知道这可能是一个愚蠢的问题,但是我已经寻找了一段时间,找不到确切的答案。如果我使用或(在Linux机器上的C语言中),是否有人在RAM中分配空间?例如,如果我有2GB的RAM并想使用所有可用的RAM,我可以只使用组合键,还是还有我不知道的另一种选择? 我想编写一系列简单的程序,这些程序可以同时运行,并保留进程中使用的所有RAM来强制使用交换,并且频繁交换页面。我已经在下面的程序中尝试