首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mmap和valgrind,mmap不增加堆大小

Mmap和valgrind,mmap不增加堆大小
EN

Stack Overflow用户
提问于 2015-01-31 12:57:18
回答 1查看 2.3K关注 0票数 3

我正在上大学的操作系统课程,我们的任务之一是使用mmap实现简单的malloc。现在我已经开始工作了,我试着使用val差制来检测任何剩余的bug。不管有没有释放记忆,瓦伦奇没有看到任何记忆泄漏。作为一个例子,请考虑使用以下C代码:

代码语言:javascript
复制
int main()
{
    int psize = getpagesize(),i;
    int *ptr = mmap(NULL, psize, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    for(i = 0; i < psize/4; i++) ptr[i] = i;
    for(i = 0; i < psize/4; i++) printf("%d\n", ptr[i]);
    return 0;
}

让我们和gcc一起编译,然后用val研读。以下是瓦兰的回报:

代码语言:javascript
复制
==17841== Memcheck, a memory error detector
==17841== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==17841== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==17841== Command: ./test
==17841== 
------------ printing numbers from 0 to 1023
==17841== 
==17841== HEAP SUMMARY:
==17841==     in use at exit: 0 bytes in 0 blocks
==17841==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==17841== 
==17841== All heap blocks were freed -- no leaks are possible
==17841== 
==17841== For counts of detected and suppressed errors, rerun with: -v
==17841== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

这是一件意想不到的事情,我们通常希望页面在退出程序之前被取消映射,以看到这样的消息。

起初,我认为页面可能是懒散地映射的,这就是为什么我强制在页面上执行一些操作,比如更改值,并打印它们,但正如我们所看到的,这不是问题。

这可能是我对mmap和valgrind工作原理的理解出了问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-18 09:08:24

mmap不会增加堆大小

堆与从mmap获得的内存是分开的。Unix进程获得内存的基本方式有两种:

  • 通过brk(2)/sbrk(2)增加“中断”--这就是堆
  • 通过使用mmap在内存中进行映射--它们与堆无关

记忆程序的剖析有一个很好的图片:

这可能是我对mmap和valgrind工作原理的理解出了问题。

阅读模件检查手册可能会有所帮助,特别是关于自定义分配器的部分。它的要点是,为了进行泄漏检查,mmap-allocated块对于val研来说是不可见的。它只截获malloccallocfreenew等。

令人困惑的是,一些mmap-allocated areas 是由valgrind跟踪的!例如,当malloc选择mmap内存而不是使用堆时,就会发生这种情况。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28251833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档