Ful*_*Int 8 c linux multithreading pthreads
我正在编写OS独立无锁队列,到目前为止它工作得很好,但内存管理存在小问题.我不确定它的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
unw*_*ind 10
在许多操作系统上,free()不会再次为操作系统提供内存,而是"仅"用于新调用malloc().这就是为什么你没有看到内存使用量在外部下降的原因,但是当你通过线程增加新的分配数量时,内存会被重新使用,所以总使用量不会通过.
Malloc不必将内存返回给操作系统.类Unix系统上的大多数malloc实现都没有这样做.特别是对于较小的物体尺寸
这是出于性能原因而完成的.
我只是注意到这可能不清楚."malloc"我指的是与malloc函数相关的整个子系统 - malloc,free,realloc,calloc以及libc可能实现的任何特殊函数.
为了简化起见,在动态内存分配中有两个工作的内存管理器:OS Memory Manager和Process Memory Manager(可以有多个内存管理器)。OS内存管理器将“大块”内存分配给各个进程内存管理器。每个进程内存管理器都会跟踪分配的段以及“已释放的段”。进程内存管理器不会将已释放的段返回给OS内存管理器,因为在以后需要分配更多内存的情况下,保留它的效率更高。