是否有可能另一个程序在分配后重新使用空闲内存,之后由已运行的其他程序释放?

时间:2013-05-07 11:19:08

标签: linux memory memory-management malloc free

假设我在拥有8Gb RAM的计算机上运行Linux(64位,内核2.6,glibc 2.4)操作系统。所有引用的程序都是C实现。

程序A启动,让我们说它分配(并在里面写入信息)5 Gb的内存(做malloc)。在此之后,它没有所有预分配的内存。这意味着我们有一个曾经在内存中加载5Gb内存的进程,现在运行的内存使用率非常低。

当程序A仍在运行且没有使用内存时,我启动了同一程序的另一个实例(我称之为程序B),试图分配5Gb的内存。

我观察到的是程序B无法保留所有内存并且OS开始交换,尽管理论上它应该有足够的空闲RAM。结论是,程序A保留了5 Gb的RAM,供其未来使用,不能用于任何其他程序。

从操作系统或需要分配大量内存的任何其他程序的角度来看,程序释放的内存会发生什么变化?有没有办法强制从操作系统释放这个内存而不停止程序A?

对于过度简化感到抱歉。

提前致谢!

PS:使用的代码类似于:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb,x = 0;
    char* buffer[1000];

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer[mb]=malloc(50*1024*1024)) != NULL && mb != max) {
        memset(buffer[mb], 0, 50*1024*1024);
        mb++;
        printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
        sleep(1);
        if((mb%15)==0)
    {
        for(x=0;x<5;x++)
        {   
        mb--;
                free(buffer[mb]);
            printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
            sleep(2);
        }
    }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

有关说明,请参阅Will malloc implementations return free-ed memory back to the system?。如果您实际上使用了二进制文件,您将看到内存是使用mmap()分配的,但是即使您调用free()也不会释放。

必需的是free()将内存返回给进程,而不是操作系统。使用glibc,你可以调用malloc_trim(),但这只适用于sbrk()分配的内存,而不是使用mmap()

来满足分配

答案 1 :(得分:0)

在linux中,我们使用此命令释放内存和脏缓存..

同步; echo 3&gt;的/ proc / SYS / VM / drop_caches

希望这有助于释放未使用的内存。