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

标签 linux memory memory-management malloc free

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

程序 A 已启动,假设它分配(并在其中写入信息)5 Gb 内存(执行 malloc)。在此之后,它确实释放了所有预分配的内存。这意味着我们有一个进程曾经使用 5Gb 的内存加载到内存中,现在正在以非常低的内存使用率运行。

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

我观察到程序 B 无法保留所有内存并且操作系统开始交换,尽管理论上它应该有足够的空闲 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;
}

最佳答案

参见 Will malloc implementations return free-ed memory back to the system?寻求解释。如果您实际跟踪您的二进制文件,您会看到内存是使用 mmap() 分配的,但没有被释放,即使您调用 free() 也是如此。

要求 free() 将内存返回给进程,而不是操作系统。使用 glibc,您可以调用 malloc_trim(),但这仅适用于 sbrk() 分配的内存,如果使用 mmap() 满足分配则不行

关于linux - 另一个程序是否有可能在分配后重新使用空闲内存,然后由其他已经运行的程序释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16417702/

相关文章:

c++ - 您可以删除在堆上创建并由函数返回的数组吗?

c - 为什么我的程序只能在调试器中运行?

javascript - Uint8Array 和 Uint8ClampedArray 之间的区别

linux - 从一行中提取多个字符串

c++ - 在 recvfrom 调用中使用时, vector 指向未初始化的字节

mysql - 使用 sudo 命令时出错

c++ - 分配器如何在 MSVC 中工作?

node.js - Geddy CLI 在 SSH 丢弃时关闭

c - c中的局部变量和内存

iphone - 如何维护对象的全局缓存? (或不保留内容的 NSMutableSet)