c-内存分配和进程内存使用



我想了解为什么动态分配多次调用的数据比直接在代码上指定或通过malloc的一次调用分配的数据使用如此多的内存。

示例

例如,我在C:中制作了以下两个代码

test1.c:int x与malloc一起分配

int main (void)
{
    int *x;
    int i, n=1048576; //n=1024*1024;
    printf("size = %lun", n* sizeof(int));
    for(i=0; i<n; i++)
    {
        x = malloc(sizeof(int));
        *x=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

我没有在这里使用免费来保持简单。当程序等待交互时,我查看另一个终端中的顶部功能,它向我显示:

PID  USER   PR  NI  VIRT   RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1384 root   20  0   41300  34076  1300 S  0.0  3.3   0:00.47 test1

test2.c:int x不是动态分配的

int main (void)
{
    int x[1048576]; //x[1024*1024]
    int i, n=1048576;
    printf("size = %lun", n* sizeof(int));
    for(i=0; i<n; i++)
    {
        x[i]=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

顶部显示:

PID  USER   PR  NI  VIRT    RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1352 root   20  0   12404   5500   1304 S  0.0  0.5   0:00.05 test2 

我还编写了第三个代码,其结果与我使用的test2相同:

x = malloc(n*sizeof(int));
for(i=0; i<n; i++)
    {
        x[i]=i;
    }

为什么在内存使用过程上有这么大的差异?这是因为malloc请求新的内存页面,内存是否被浪费了?还是malloc分配更多内存?

test1使用3.3%的总内存,test2使用0.5%

环境:

我正在docker内部的Centos 5 64位上执行这些测试。

虚拟环境中的内存:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            995          98         845           3          51         808
Swap:          1162         194         967

必须跟踪每个内存分配,以便free()可以释放空间进行重用。在实践中,这意味着有一个最小的内存大小被分配;对于32位程序,它可以是8或16字节,对于64位程序,可以是16-32字节(这取决于所使用的C库的系统和版本)。

当您分别分配一百万个整数时,每个整数都使用8-32个字节,因此您实际上使用了8-32MIB的内存。当您在堆栈上的单个数组中分配一百万个整数时,您将使用4MIB的内存。

因此,您可以看到流程大小的显著差异。

当然,第一个程序几乎泄露了所有的内存,但这与你要问的问题无关。

每次用户请求内存时,系统都需要进行一些内务处理。当只使用指针调用free就足以让系统取消分配内存时,应该记住这一点。

因此,在第一个示例中,您请求内存n次,而在第二个示例中仅请求一次。您打算使用的内存是相同的,但系统必须"记住"的信息不是。

相关内容

  • 没有找到相关文章

最新更新