Linux malloc大内存的方法

 

本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9963199

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


在项目中遇到一个问题,需要malloc一段很大的虚存空间,远大于物理内存的大小。


初始情况下,使用malloc声明一块很大的虚拟内存空间通常会成功,但是在使用时会产生问题:

 

#include <stdio.h>

int main()
{
    size_t size1 = 40000000000;
    int *mem = (int *)malloc(size1);

    memset(mem, 0, size1);

    free(mem);
    return 0;
}


例子中声明了40g的虚存空间,机器的物理内存是6*4g=24g,不进行memset时是可以成功的,但是memset的过程中会产生段错误。如图所示:

 


查看系统内存情况:


malloc函数实际调用sbrk,mmap系统调用,完成虚存空间的分配,大于128k均使用mmap。在物理内存不再扩展的前提下,解决这个问题有两个办法:

1. 扩展swap区,利用大的硬盘空间,绕过这个问题

2.增大overcommit内存的限制



扩展swap区

对于第一种情况,步骤如下:

1.创建一个用于交换的磁盘文件:

 

dd if=/dev/zero of=/pps/guohongwei/my_swap bs=1M count=20000

 

2.设置swap区文件:

 

mkswap /pps/guohongwei/my_swap

 

3.启用该分区:

 

swapon /pps/guohongwei/my_swap

 

4.若想开机启用该swap,可以设置/etc/fstab:

 

/home/swapfile swap swap defaults 0 0


 

整体流程如图:


观察可见,swap空间比之前多了20g



增大overcommit限制

有关linux overcommit的说明看这里

查看当前系统overcommit:


0.首先将swap区恢复为系统默认情况,解除swap文件

 

swapoff /pps/guohongwei/my_swap

 

1.通过修改overcommit_memory的值,声明内存分配的方式:

 

sysctl vm.overcommit_memory=1

 

2.修改overcommit_ratio大小,确定可以分配的虚拟空间的大小:

 

sysctl vm.overcommit_ratio=500

 

搞定,查看系统当前的overcommit:



通过以上两种方式,均可以用malloc声明比本机物理内存大很多的虚存空间,以满足笔者需求。

 

posted on 2013-08-14 19:37  you Richer  阅读(2090)  评论(0编辑  收藏  举报