これは、32ビットバイナリを使用し(...まだ使用する必要があります)、4G制限を考慮するシステムに便利な機能です。
これは、本質的に、32ビットユーザースペースコード、32ビットユーザースペースデータ、および(PAEの場合は32ビットまたは64ビット)カーネルが次の場所にあることを意味します。その他アドレス空間は、本質的に、プロセスがデータを記憶するために可能な最大4Gアドレス空間をほぼ全て使用できるようにする。
一部を除く古代発表、残念ながらもう見つかりません。
2.5.74 Linuxカーネル用の「4GB/4GB VM分割」パッチの最初の公開リリースを発表したことを嬉しく思います。
http://redhat.com/~mingo/4g-patches/4g-2.5.74-F8
4G / 4Gスプリット機能は、主により多くのコア/ユーザーVMを望むか、または確保する必要がある大容量RAM x86システム用ですが、システムコールごとにTLBフラッシュオーバーヘッドが発生します。
私たち全員が知っているように、x86では合計仮想メモリ量が4 GBに制限されています。合計4GBのVMのうち、3GBはユーザースペース(0x00000000-0xbffffffff)に使用され、1GBはカーネル(0xc0000000-0xffffffff)に使用されます。このVMスキームを3/1分割と呼びます。この分割は、RAMが1GBに達するまでうまく機能します。 "highmem"はさまざまな大規模なキャッシュ(およびオブジェクト)を高いメモリ領域に移動するため、1 GB RAMの前にも機能します。
テストでは、一部のプロセスが2〜3GB程度で競合が発生し始めました。
どうすればいいですか?私は比較的新しいカーネル(4.10)を使用しています。 32ビットユーザースペースで64ビットカーネルを使用するか、32ビットPAEカーネルを使用できます。
一部のプロセスだけが4G/4Gを使ったら十分でしょうが、必ず必要なようです。
ベストアンサー1
64ビットカーネルには、すでに32ビットユーザースペースプログラムにアクセスできるフル4Gスペースがあります。端末に次のように入力して直接確認してください(警告:このコマンドを実行すると、システムに使用可能な4GiB RAMがないとシステムが応答しなくなる可能性があります)。
cd /tmp
cat > test.c <<"EOF"
#include <stdlib.h>
#include <stdio.h>
int main()
{
size_t allocated=0;
while(1)
{
const size_t chunkSize=4096;
char* p=malloc(chunkSize);
if(!p) return 0;
*p=1;
allocated+=chunkSize;
printf("%zu\n",allocated);
}
return 0;
}
EOF
gcc test.c -o test -m32 && ./test | tail -n1
私のx86_64カーネル3.12.18では約4GiB〜12.3MiBを得た4282097664
ので、4G / xG分割の実装を検討するのが合理的です。