草庐IT

MALLOC_MMAP_THRESHOLD

全部标签

c - 使用 mmap 重叠页面 (MAP_FIXED)

由于一些与这个问题无关的模糊原因,我需要求助于使用MAP_FIXED以获得接近libc的文本部分在内存中的位置的页面。在阅读mmap(2)(我一开始就应该这样做)之前,如果我使用MAP_FIXED调用mmap并且基地址与已映射区域重叠,我预计会出现错误。然而事实并非如此。例如,这是某些进程的/proc/maps的一部分7ffff7299000-7ffff744c000r-xp0000000008:05654098/lib/x86_64-linux-gnu/libc-2.15.so在进行以下mmap调用之后...mmap(0x7ffff731b000,getpagesize(),PROT

c - 为什么 malloc 不是 "using up"我电脑上的内存?

所以我有这个分配256MB内存的程序,在用户按下ENTER后它释放内存并终止。#include#includeintmain(void){char*p,s[2];p=malloc(256*1024*1024);if(p==NULL)exit(1);printf("Allocated");fgets(s,2,stdin);free(p);return0;}我多次运行这个程序并在后台运行它们,直到没有足够的内存可以分配为止。然而,这永远不会发生。我运行了一个linuxtop命令,即使在多次运行这个程序之后,可用内存也从未减少近256MB。但是,另一方面,如果我使用calloc而不是mall

malloc 和 free 的代码

我在哪里可以找到我的gcc编译器目前正在使用的malloc代码?我实际上想编写自己的malloc函数,它与原来的有点不同。我知道我可以使用hooks等,但我想看看真正的代码。 最佳答案 malloc的POSIX接口(interface)是definedhere.如果您想了解GNU/Linux中的C库(glibc)是如何实现malloc的,请前往http://ftp.gnu.org/gnu/glibc/获取源代码。或浏览thegitrepository看看themalloc/malloc.cfile.还有MemoryAllocator

c - 如何防止 MMAP 缓存值?

我编写了一个linux驱动程序,它ioremaps将特定设备的PCIBAR0导出到sysfs二进制属性,允许用户空间直接控制它。当我尝试在属性之上进行MMAP以直接访问该内存位(从用户态程序)时,问题就出现了。读取成功并返回预期值,但当我写入该内存时,它似乎缓存在内核和内存之间的某个位置,并且没有传送到GMCH根复合体(因此也传送到设备)。我想做的是在每次访问后有一个隐式的写内存屏障。有什么方法可以防止内核将写入缓存到mmap-ed内存位?跟进:正在调用msync()每次访问后以“接受”的方式执行此操作? 最佳答案 继续前进并用我的

c - malloc/free 是 libc 提供的系统调用还是库例程?

如果malloc/free在libc中作为库例程实现,那么它是在sbrk系统调用或mmap系统调用之上实现的,还是其他?一般来说,sys/syscall.h中声明的函数是否包含目标机器中的所有系统调用? 最佳答案 经常,malloc和free使用较低级别的虚拟内存分配服务并一次分配多个页面(甚至兆字节),使用systemcalls喜欢mmap和munmap(也许还有sbrk)。经常malloc更喜欢重用以前freed相关的内存空间。大多数malloc实现对“大”和“小”分配等使用各种不同的策略......注意virtualaddre

linux - mmap'ed内存何时以及如何换入和换出?

以我的理解,mmap一个适合RAM的文件就像将文件放在内存中一样。假设我们有16G的RAM,我们首先mmap一个我们使用了一段时间的10G文件。这在访问方面应该是相当有效的。如果我们然后映射第二个10G文件,是否会导致第一个文件被换出?还是其中的一部分?如果是这样,这将在什么时候发生?在mmap调用时,还是在访问新加载文件的内存区域时?如果我们想再次访问第一个文件指针的内存,是否会再次加载交换文件?那么,假设我们在对应于第一个文件和第二个文件的内存之间交替读取,这会导致灾难性的性能吗?最后,如果以上任何一条为真,mmap几个较小的文件会更好吗? 最佳答案

c - 读写 mmap 的参数无效?

出于某种原因,我收到了-EINVAL,我不清楚原因。这是我打开并尝试mmap文件的位置:if((fd=open(argv[1],O_RDWR))编辑:我应该补充一点,错误发生在mmap中。 最佳答案 结果是将MAP_SHARED更改为MAP_PRIVATE可以成功。失败的原因很微妙:我的代码在VirtualBoxVM中运行,而我尝试mmap的文件位于主机上的共享目录中。VirtualBox虚拟文件系统显然没有在管理程序边界上使用MAP_SHARED选项实现mmap。如果您阅读jxh对我的问题和他的回答的有用评论,就会发现这段代码对他

Linux MMAP 内部结构

我有几个关于Linux系统中的mmap实现的问题,这些问题似乎没有太多记录:当使用mmap将文件映射到内存时,您将如何处理预取此类文件中的数据?即当您从mmaped区域读取数据时会发生什么?该数据是否已移至L1/L2缓存?它是直接从磁盘缓存中读取的吗?prefetchnta和类似的ASM指令是否适用于mmaped区域?实际mmap调用的开销是多少?它是相对于映射数据量还是常数?希望有人对此有所了解。提前致谢。 最佳答案 mmap基本上是对虚拟内存子系统的编程访问。当你有,比方说,1G文件,你mmap它,你会得到一个指向“整个”文件的

linux - 如何可移植地扩展使用 mmap() 访问的文件

我们正在试验改变SQLite,一个嵌入式数据库系统,使用mmap()而不是通常的read()和write()调用来访问磁盘上的数据库文件。对整个使用单个大映射文件。假设文件足够小,我们没有问题在虚拟内存中为此寻找空间。到目前为止一切顺利。在许多情况下,使用mmap()似乎更快一些比读()和写()。在某些情况下速度更快。调整映射大小以提交写事务扩展数据库文件似乎是一个问题。为了延长数据库文件,代码可以做这样的事情:ftruncate();//extendthedatabasefileondiskmunmap();//unmapthecurrentmapping(it'snowtoosma

c++ - 自定义 malloc 实现

最近有人问我一个问题,要实现一个非常简单的malloc,具有以下限制和初始条件。#defineHEAP_SIZE2048intmain(){privateHeap=malloc(HEAP_SIZE+256);//extra256bytesforheapmetadatavoid*ptr=mymalloc(size_t(750));myfree(ptr);return0;}我需要使用提供的确切空间在此处实现mymalloc和myfree。256字节很好地映射到2048位,如果一个字节被分配或者它是空闲的,我可以有一个位数组存储。但是,当我使用ptr进行myfree调用时,我无法确定一开始分