这个问题在这里已有答案:
我正在编写独立于操作系统的无锁队列,到目前为止它工作得很好,但内存管理存在小问题。我不确定它的gcc问题还是我的问题。问题:当元素添加到列表时,内存增加,但是当从列表中删除元素时(free(elementPointer);)内存使用不会改变。
但是当我使用pthreads时,N个生产者和M个消费者(1<N<20, 1<M<20)
的内存使用量总是大约10mb(当试图添加和删除~10kk元素时),所以看起来像免费工作。
而有趣的是,在VS 2010(相同的代码,没有线程)免费工作正常,内存被释放(观看任务管理器)。
我做了测试,添加1kk元素,添加全部后,逐个删除所有元素(无线程)。
Linux - 0.08秒
Windows~57秒
Linux(不含免费) - 0.07秒
Windows(不含免费) - 0.9秒
所以,问题是,为什么在没有使用线程的情况下,Linux C中没有释放内存?如有必要,我可以发布代码。
GCC版本:4.4.3
在许多操作系统上,free()
不再为操作系统提供内存,而是“仅”用于malloc()
的新调用。这就是为什么你没有看到内存使用量在外部下降的原因,但是当你通过线程增加新的分配数量时,内存会被重新使用,所以总使用量不会通过。
Malloc不必将内存返回给操作系统。类Unix系统上的大多数malloc实现都没有这样做。特别是对于较小的物体尺寸
这是出于性能原因而完成的。
我只是注意到这可能不清楚。 “malloc”我指的是与malloc函数相关的整个子系统 - malloc,free,realloc,calloc以及libc可能实现的任何特殊函数。
为了简化过程,在动态内存分配中有两个内存管理器:OS内存管理器和进程内存管理器(可以有多个内存管理器)。 OS内存管理器为各个进程内存管理器分配“大块”内存。每个进程内存管理器都会跟踪分配的段以及“自由段”。进程内存管理器不会将自由段返回到操作系统内存管理器,因为如果需要稍后分配更多内存,则保持它更有效。