Articles of malloc

不同的程序是从一个共同的堆还是从一个单独的堆中获取内存?

我有点困惑如何在Linux上glibc分配其内存的各种program.These是几个问题: 它是从一个共同的堆(即在Linux中的所有进程中是否有共同的堆)分配的,还是为系统中的每个进程分配一个堆? 还假设如果我正在编译一个静态库,它最终得到静态链接到主进程,它将如何得到它的内存? 它是否已经与其他堆相关联(如我们已经编译过的那样),还是会从主进程的堆中获取内存。

堆内存和板分配

我对heap和free list感到困惑。 我有几个问题,我有我自己的理解,如何在C中malloc工作。请纠正我,如果我错了。 堆内存是否组织为一个链表(空闲列表)的数据块? 堆内存和自由列表之间有区别吗? 我对存储分配的理解(打开以便改进): – 当我们调用malloc时,它在堆中分配内存,通过从free list中select合适大小的数据块来实现。 当malloc返回某个内存块时,它将从空闲列表中删除,并且在该页表中更新该块内存的物理地址。 当使用free()释放内存时,将数据块插回到空闲列表中,并且可能会减less碎片,并与相邻的块相结合,并且清除页表项中的present位。 所以整个堆是一个自由列表(空闲块的链表)+分配的数据块。 这是一个存储分配的全面情况? 编辑:从Linux内核开发(罗伯特·洛夫)章内存pipe理, 板分配 “空闲列表包含一个可用的,已分配的数据结构块,当代码需要一个新的数据结构实例时,它可以从空闲列表中获取一个结构,而不是分配足够的内存并设置它之后,当数据结构不再需要的时候,它将被返回到空闲列表而不是释放,这样,空闲列表作为一个对象caching,caching一个经常使用的对象types。 自由列表被称为“可用的,分配的数据结构块”。 它是如何分配 ,当它在一个自由列表? 而如何返回一块内存空闲列表_ 不是像释放该块一样? 板块分配如何与存储分配不同?

如何在c中正确使用scandir()?

我正在试图将文件列表存储在char **variables中。 scandir()完成正确,但是在尝试打印char **时出现分段错误。 代码如下: int main() { char** fileList; int noOfFiles; char* path = "."; makeList(&fileList, &noOfFiles, path); return 0; } void makeList(char ***fileList, int* noOfFiles, char* path){ struct dirent **fileListTemp; *noOfFiles = scandir(path, &fileListTemp, NULL, alphasort); int i; fileList = (char***)malloc(sizeof(char***)); *fileList = (char**)malloc(*noOfFiles * sizeof(char*)); printf("total: %d files\n",*noOfFiles); for(i = 0; i […]

mmap或malloc分配RAM吗?

我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,找不到一个明确的答案。 如果我使用mmap或malloc (在C中,在Linux机器上)是否在RAM中分配空间? 例如,如果我有2GB的内存,并想使用所有可用的RAM,我可以只使用一个malloc/memset组合, mmap ,或者有另一个选项,我不知道? 我想编写一系列可以同时运行的简单程序,并保持进程中使用的所有RAM强制使用交换,并且页面频繁交换。 我已经在下面的程序中试过了,但这不是我想要的。 它确实分配内存(RAM?),强制交换被使用(如果有足够的实例正在运行),但是当我调用sleep ,并不是只是locking了内存的使用(所以实际上没有任何交换进出其他进程?),还是我误解了一些东西。 例如,如果我运行这3次,我会从前两个实例中使用2GB(全部)的RAM,然后第三个实例将之前的两个实例(RAM)和当前实例之一交换到RAM中? 或者实例#3只是使用磁盘或虚拟内存运行? 这提出了另一个问题,我是否需要分配足够的内存来使用所有可用的虚拟内存以及交换分区? 最后,将mmap (或任何其他C函数。地狱,甚至另一种语言,如果适用)更好地做到这一点? #include <stdio.h> #include <stdlib.h> #include <string.h> #define MB(size) ( (size) * 1024 * 1024) #define GB(size) ( (size) * 1024 * 1024 * 1024) int main(){ char *p; p = (char *)malloc(MB(512)); memset(p, 'T', MB(512)); printf(".5 GB allocated…\n"); char *q; […]

每当调用malloc / free时输出到stderr

在Linux / GCC / C ++中,每当调用malloc / free / new / delete时,我都想logging一些stderr。 我想了解一个库的内存分配,所以我想在运行unit testing的时候生成这个输出。 我使用valgrind进行mem泄漏检测,但是我找不到一个让它只logging分配的选项。 有任何想法吗? 我正在寻找最简单的解决scheme。 重新编译库不是一个选项。

ARM malloc()在ARM和x86上有不同的performance吗?

在这个网站上有很多关于内存分配的问题,但是我找不到一个专门解决我的问题的问题。 这个问题似乎是最接近的,它引导我阅读本文 ,所以…我比较了它包含在(虚拟)桌面x86 Linux系统和基于ARM的系统上的三个演示程序的行为。 我的发现在这里有详细的介绍,但是总结如下:在我的桌面系统上,文章中的demo3程序似乎表明malloc() 总是在分配的内存量上 – 即使禁用了swap也是如此。 例如,它高兴地“分配”3 GB的RAM,然后在程序开始实际写入所有内存时调用OOM杀手。 在禁用交换的情况下,OOM杀手在写入之后被调用,只有610MB的3 GB malloc()被认为是可用的。 演示程序的目的是为了演示这个有据可查的“Linux特性”,所以这些都不足为奇。 但是,在我们基于i.MX6的embedded式目标工作中,这种行为是不同的, malloc()似乎在说明它分配了多lessRAM的真相(?)下面的程序(从文章逐字转载)总是得到OOM-在第二个循环中死亡时, i == n : #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 10000 int main (void) { int i, n = 0; char *pp[N]; for (n = 0; n < N; n++) { pp[n] = malloc(1<<20); if (pp[n] == […]

C ++内存分配机制性能比较(tcmalloc vs. jemalloc)

我有一个应用程序分配大量的内存,我正在考虑使用比malloc更好的内存分配机制。 我的主要选项是:jemalloc和tcmalloc。 使用其中的任何一个有什么好处? 在http://locklessinc.com/benchmarks.shtml中有一些机制(包括作者的专有机制 – lockless)之间有很好的比较,并且提到了每个机制的优点和缺点。 鉴于这两种机制都是积极的,并不断改进。 有没有人有任何关于这两个相对performance的洞察力或经验?

为什么malloc依赖于从某个阈值开始的mmap?

我正在读一些关于malloc的信息,并在malloc的手册页中find了以下内容: 通常,malloc()从堆中分配内存,并根据需要使用sbrk(2)调整堆的大小。 当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap(2)将内存分配为专用匿名映射。 MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)进行调整。 使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(请参阅getrlimit(2))。 所以基本上从阈值MMAP_THRESHOLD malloc开始使用mmap开始。 有没有任何理由切换到大块的mmap? 这可能会影响stream程执行的性能吗? mmap系统调用是否强制上下文切换?

重载免费(),所以我的程序使用我的而不是系统的

为了教育目的,我需要重新编码free()函数,它也必须被命名为free() 。 当我重命名我的函数myfree()它完美的工作,但是当我命名它free()程序不知道他是否需要使用我的系统的程序只是Segmentation fault(core dumped)即使我不打电话给我的自由(只是另一个free()function的声明似乎崩溃了) 所以我怎么能告诉编译器使用我的而不是系统的? 谢谢你提前。 编辑:Linux操作系统

是malloc确定性的?

是malloc确定性的? 说如果我有一个分叉进程,也就是另一个进程的副本,并且在某个时候他们都调用了malloc函数。 分配的地址在两个过程中是否相同? 假设执行的其他部分也是确定性的。 注意:在这里,我只是谈论&#x865A;拟内存,而不是物理内存。