1

この興味深いコードは、物理 RAM が 3 GB 未満であっても、常に 3 GB のメモリを Linux システムに割り当てます。

どのように?(私のシステムには 2.7 GB の RAM があり、このコードは 3.054 MB のメモリを割り当てました!)

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
        void *ptr;
        int n = 0;
        while (1) {
            // Allocate in 1 MB chunks
            ptr = malloc(0x100000);
            // Stop when we can't allocate any more
            if (ptr == NULL)
                break;
            n++;
        }
        // How much did we get?
        printf("malloced %d MB\n", n);
        pause();
    }
4

2 に答える 2

2

マシンがアドレス指定する物理 RAM を使い果たした場合、ハード ドライブ領域を使用して「RAM として機能」することができます。これは大幅に遅くなりますが、それでも実行できます。

一般に、マシンが情報にアクセスするために使用できるいくつかのレベルがあります。

  1. キャッシュ (最速)
  2. ハードディスク (最も遅い)

利用可能な場合は最速で使用しますが、指摘したように、他のリソースを使用する必要がある場合があります。

于 2013-07-06T19:24:59.593 に答える
1

Linux のデフォルトでは、実際に RAM を変更しようとするまで、実際には RAM を取得しません。次のようにプログラムを変更してみて、すぐに終了するかどうかを確認してください。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char *ptr;
    int n = 0;
    while (1) {
        // Allocate in 4kb chunks
        ptr = malloc(0x1000);
        // Stop when we can't allocate any more
        if (ptr == NULL)
            break;
        *ptr = 1;  // modify one byte on the page
        n++;
    }
    // How much did we get?
    printf("malloced %d MB\n", n / 256);
    pause();
}

十分なスワップがあるが十分な RAM がない場合、このコードはスワップファイルを激しくスラッシングし始めます。スワップが不十分な場合、最後に到達する前に実際にクラッシュする可能性があります。

他の誰かが指摘したように、Linux は仮想メモリ オペレーティング システムであり、アプリケーションが要求するよりもマシンの RAM が少ない場合、ディスクをバッキング ストアとして使用します。使用できる合計スペースは、次の 3 つの条件によって制限されます。

  • スワップに割り当てられた RAM とディスクの合計量
  • 仮想アドレス空間のサイズ
  • によって課されるリソース制限ulimit

32 ビット Linux では、OS が各タスクに 3GB の仮想アドレス空間を割り当てます。64 ビット Linux では、その数は数百テラバイトだと思います。ただし、デフォルトulimitが何であるかはわかりません。したがって、64 ビット システムを見つけて、その上で変更されたプログラムを試してください。あなたは長い夜を過ごすことになると思います。;-)

編集: ulimit64 ビット Ubuntu 11.04 システムのデフォルト値は次のとおりです。

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

そのため、タスクのデフォルトのメモリ サイズ制限はないようです。

于 2013-07-06T19:36:26.707 に答える