Linux malloc大メモリの方法


このブログはオリジナルです.CC 3.0契約に従い、転載は出所を明記してください.http://blog.csdn.net/lux_veritas/articale/detail/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;
}
例では40 gの虚存空間を宣言していますが、マシンの物理メモリは6*4 g=24 gで、memsetを行わない場合は成功しますが、memsetの過程では段エラーが発生します.図のように:
Linux malloc大内存的方法_第1张图片
システムメモリの状況を表示:
Linux malloc大内存的方法_第2张图片
malloc関数は実際にsbrakを呼び出して、mmapシステムは呼び出して、虚存空間の割り当てを完成して、128 kより大きいです.皆mmapを使います.物理メモリが拡張されないという前提で、この問題を解決する方法は2つあります.
1.swapエリアを拡張し、大きなハードディスク空間を利用して、この問題を避けます.
2.overcomitメモリの制限を大きくする
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
全体の流れは図の通りです.
Linux malloc大内存的方法_第3张图片
観測によると、swap空間は前より20 g多くなりました.
overcomit制限を増やす
linux overcomitについての説明はここを見てください.
現在のシステムのovercomitを見る:

0.まずswapエリアをシステムのデフォルトに戻し、swapファイルを解除する.
swapoff /pps/guohongwei/my_swap
1.overcomitを修正することでメモリの割り当てを宣言する方法:
sysctl vm.overcommit_memory=1
2.overcomitを修正するratioサイズは、割り当て可能な仮想空間のサイズを決定します.
sysctl vm.overcommit_ratio=500
解決しました.システムの現在のovercomitを確認します.

以上の2つの方法により、本機の物理メモリよりも大きな空き容量をmallocで宣言して、筆者の需要を満たすことができます.