データサイズ制限の解除方法



関数の中で大きな配列を確保したりするとスタック領域が足りなくなって プログラムが停止していまうことがある. また,FortranのCOMMONブロックのようなグローバルデータ領域に 大きな配列を確保した場合もプログラムのデータ領域が 足りなくなりプログラムを実行できない.

しかし,cshrの内部コマンドであるlimitコマンドを使えば,プログラムのデータサイズや スタックサイズの制限を変更できる. コンソールから単にlimitコマンドを実行すると,現在の各データサイズの制限が表示される. 以下はfukunm12上でlimitコマンドを実行した結果である.

$ limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       8192 kbytes
coredumpsize    unlimited
memoryuse       unlimited
descriptors     1024
memorylocked    unlimited
maxproc         2048
openfiles       1024
この結果から,現在のスタックサイズの上限は8192KBであることがわかる.
試しに次のようなプログラムを書いてみた.

/* largestack.c */

#include <stdio.h>
#define number_of_elements 1024*1024

double large_stack();

int main(){

    double result;

    result = large_stack();
    printf( "result = %15.3f\n", result );
    return 0;

}

double large_stack(){

    double a[ number_of_elements ], sum;
    int i;

    for ( i = 0; i < number_of_elements; i++ )
        a[ i ] = ( double )i;

    sum = 0;
    for ( i = 0; i < number_of_elements; i++ )
        sum += a[ i ];

    return sum;

}

このプログラムでは関数large_stackの中で要素数が1024*1024の倍精度実数配列を 確保しているが, そのためにはスタックに最低1024*1024*8byte=8192KBの領域が必要になるから スタックサイズの制限に引っかかることになる. 実際にこのコードを実行するとsegmentation faultが発生して実行できなかった.

$ gcc largestack.c
$ ls -l
合計 16
-rwxrwxr-x    1 akasaka  akasaka     11980 May 10 18:18 a.out
-rw-r--r--    1 akasaka  akasaka       460 May 10 18:18 largestack.c
$ ./a.out
Segmentation fault (core dumped)
$
そこで,以下のようにしてスタックサイズの上限を8192KBの倍の16384KBに変更してみた.
$ limit stacksize 16384
上限値はKB単位で指定する. もう一度limitコマンドだけを実行すればスタックサイズの上限値が変更されているのがわかる.
$ limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       16384 kbytes
coredumpsize    unlimited
memoryuse       unlimited
descriptors     1024
memorylocked    unlimited
maxproc         2048
openfiles       1024
ここで,先のプログラムをもう一度実行してみると,
$ ./a.out
result = 549755289600.000
となり正常にプログラムが終了した. さらに,
$ unlimit stacksize
とすれば上限値をなくすことができる.
$ limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       unlimited
coredumpsize    unlimited
memoryuse       unlimited
descriptors     1024
memorylocked    unlimited
maxproc         2048
openfiles       1024
なお,変更した上限値は起動しているシェルに対してのみ有効である. 常にデフォルトデータサイズを変更したい場合は,limitコマンドを.cshrcに記述するか, カーネルの再構築を行わなければならない.


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送