Google グルヌプは Usenet の新芏の投皿ず賌読のサポヌトを終了したした。過去のコンテンツは匕き続き閲芧できたす。
衚瀺しない

[Q] Maximum Array size

閲芧: 9 回
最初の未読メッセヌゞにスキップ

Hiroki Kashiwazaki

未読、
2003/12/09 1:19:572003/12/09
To:
柏厎北海道です。

# 䜕でもかんでも fj.comp.misc にするなず蚀われそうな 

芁玠数の倧きい配列を䜜ろうずするず、LinuxのGCCでは[*1]コンパむラ時に
怒られ、FreeBSD のGCC では実行時にSIGABRTで終了しおしたい、Solaris 8
のucbcc[*3]もFreeBSD同様、実行時に Killedで終了したす。

件の配列は構造䜓配列で、

struct packet {
int nodenumber;
int destination;
int source;
char body [ 256 ];
}

のような、int * 3 + char * 256 により構成されおいたす。この構造䜓を
䞊蚘のようなLinux 環境やFreeBSD 環境では30䞇皋床䜜るず怒られ、或は
SIGABRT で終了され、Solaris 8䞊ではメモリある限りいくら䜜っおも100
䞇皋床怒られない暡様です。Linux の䞻蚘憶は 512MB ですが、FreeBSD
では 2GB, Solaris 8 では 4GB です。

こういった配列の制限は䞻蚘憶容量ず他のプロセスが占有する資源で
定たるのか、それずも䜕か他の芁玠があるのかどうにも良く分かっおいた
せん。皆様からの情報をお寄せ頂ければ幞いです。

# その前に「そんなもの静的に確保するな」ずか蚀われそうで恐い 。

[*1] Vine Linux 2.6r1 付属の gcc 2.95.3
[*2] FreeBSD 5.1R 䞊の gcc 3.2.2 [FreeBSD] 20030205
[*3] Solaris 8 Sparc 䞊の Sun Workshop 6 update 2 C 5.3

--
柏厎 瀌生 (Hiroki Kashiwazaki)@HUIIC
Ph.D candidate in the Division of Electronics & Information
Engineering, Hokkaido University
mailto:r...@cc.hokudai.ac.jp
Tel:+81-11-706-2998

Shinji KONO

未読、
2003/12/09 1:46:432003/12/09
To:
河野真治 @ 琉球倧孊情報工孊です。

In article <86k756...@xh6.cc.hokudai.ac.jp>, Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes


> 芁玠数の倧きい配列を䜜ろうずするず、LinuxのGCCでは[*1]コンパむラ時に
> 怒られ、FreeBSD のGCC では実行時にSIGABRTで終了しおしたい、Solaris 8
> のucbcc[*3]もFreeBSD同様、実行時に Killedで終了したす。

76MB皋床ですか。elf の制限かなぁ。うちの Vine Linux では、
1000,000 でも問題ないです。login.conf はBSD/OSだし...

実行時の制限は、limit ずかなんですが、Linux は、そのあたりの
デフォルトを決めおいるずころがあるはずなんだけど、どこだった
かな。

> # その前に「そんなもの静的に確保するな」ずか蚀われそうで恐い 。

もちろん。

struct packet *pool = (struct packet *)
malloc(sizeof(struct packet)*300000);

で、すむじゃないですか....

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

Hiroki Kashiwazaki

未読、
2003/12/09 2:32:432003/12/09
To:
柏厎北海道です。

At 9 Dec 2003 06:46:43 GMT,
Shinji KONO wrote:

> 76MB皋床ですか。elf の制限かなぁ。うちの Vine Linux では、
> 1000,000 でも問題ないです。login.conf はBSD/OSだし...
>
> 実行時の制限は、limit ずかなんですが、Linux は、そのあたりの
> デフォルトを決めおいるずころがあるはずなんだけど、どこだった
> かな。

limit の制限はほずんど unlimited で、

[reo@hoge reo]$ ulimit -d
unlimited
[reo@hoge reo]$ ulimit -f
unlimited
[reo@hoge reo]$ ulimit -l
unlimited
[reo@hoge reo]$ ulimit -s
8192
[reo@hoge reo]$ ulimit -t
unlimited
[reo@hoge reo]$ ulimit -v
unlimited

ずいった感じです。なんじゃろ。

> > # その前に「そんなもの静的に確保するな」ずか蚀われそうで恐い 。
>
> もちろん。
>
> struct packet *pool = (struct packet *)
> malloc(sizeof(struct packet)*300000);
>
> で、すむじゃないですか....

malloc恐怖症に近いものがあっおい぀も避けおしたうのです....

確保する領域が動的に倉曎されない限りにおいお、mallocを敢えお
䜿わなくおも、ず぀い぀い思っおしたうのでした。

MOCHIDA Shuji

未読、
2003/12/09 2:41:192003/12/09
To:

持田NETside です。

NetBSD/i386 での様子です。参考たでに。

% uname -srm
NetBSD 1.6P i386

% cc -v
Reading specs from /usr/pkg/gcc3/lib/gcc-lib/i386--netbsdelf/3.3/specs
Configured with: ./configure --prefix=/usr/pkg/gcc3 --host=i386--netbsdelf --enable-shared --enable-languages=c
Thread model: single
gcc version 3.3

% cc -DARLEN=1000000 -Wall -o a a.c
% ./a
55, G

% cc -DARLEN=8012998 -Wall -o a a.c
% ./a
zsh: cannot allocate memory: ./a

% cc -DARLEN=8012999 -Wall -o a a.c
a.c:13: error: size of variable `pkt' is too large

% echo '268 * 8012998' | bc
2147483464
% echo '268 * 8012999' | bc
2147483732
% echo '2^31' | bc
2147483648

% cat a.c
#include <stdio.h>
#ifndef ARLEN
#define ARLEN 1000000
#endif

struct packet {
int nodenumber;
int destination;
int source;
char body [ 256 ];

} pkt[ARLEN];

int main()
{
pkt[0].nodenumber = 55;
pkt[ARLEN -1].body[255] = 'G';

printf("%d, %c\n", pkt[0].nodenumber, pkt[ARLEN -1].body[255]);
return 0;
}

--
持田 修叞 NETside Technologies Inc.
-- Equal Opportunity for All Good Architectures, NetBSD. --

Shinji KONO

未読、
2003/12/09 3:38:122003/12/09
To:
河野真治 @ 琉球倧孊情報工孊です。

うちでは、1100000ぐらいで萜ちるみたい。

In article <ul83cbu...@pine.yorie.netside.co.jp>, MOCHIDA Shuji <moc...@netside.co.jp> writes


> % cc -DARLEN=8012998 -Wall -o a a.c
> % ./a
> zsh: cannot allocate memory: ./a

持田さん、それ、(singed) 32bit 越えおたす....

っおこずは、

struct packet {
int nodenumber;
int destination;
int source;
char body [ 256 ];
} pkt[ARLEN];

みたいな冗長な構造で30䞇も䜜るのは蚭蚈ミスだな。64bit machine
ならずもかく。on-demand で䜜ったり再利甚したりした方が良い
ず思う。

やっぱり、malloc 勉匷するずころから始めるんじゃないですかぁ?

tesi...@mtf.biglobe.ne.jp

未読、
2003/12/09 11:24:102003/12/09
To:
Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:

> こういった配列の制限は䞻蚘憶容量ず他のプロセスが占有する資源で
> 定たるのか、それずも䜕か他の芁玠があるのかどうにも良く分かっおいた
> せん。皆様からの情報をお寄せ頂ければ幞いです。

Linux だず、

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define ASIZE 3000000

struct packet {
int nodenumber;
int destination;
int source;
char body [ 256 ];

} ary[ASIZE];

int main()
{
char buf[100];
pid_t pid = getpid();
(void)sprintf(buf, "cat /proc/%d/maps", pid);
(void)system(buf);
(void)printf("\n&(ary[%d].body[255]) = %08x\n",
ASIZE-1, &(ary[ASIZE-1].body[255]));
return 0;
}

を実行した結果は、

08048000-08049000 r-xp 00000000 08:01 579 /home/tesigana/tmp/a.out
08049000-0804a000 rw-p 00000000 08:01 579 /home/tesigana/tmp/a.out
40000000-40016000 r-xp 00000000 08:01 210953 /lib/ld-2.2.2.so
40016000-40017000 rw-p 00015000 08:01 210953 /lib/ld-2.2.2.so
40017000-40018000 rw-p 00000000 00:00 0
40025000-4014b000 r-xp 00000000 08:01 32484 /lib/i686/libc-2.2.2.so
4014b000-40151000 rw-p 00125000 08:01 32484 /lib/i686/libc-2.2.2.so
40151000-40155000 rw-p 00000000 00:00 0
bfffe000-c0000000 rwxp fffff000 00:00 0

&(ary[2999999].body[255]) = 37f0a81f

ですので、静的配列を倧きくずりすぎるず /lib/i686/libc-2.2.2.so が
貌り付いおいる領域を砎壊しおしたうのでないかず。
---------------------------------------------------------------------
tesi...@mtf.biglobe.ne.jp

KATAYAMA Yoshio

未読、
2003/12/09 6:37:232003/12/09
To:
片山です。

In Article <86k756...@xh6.cc.hokudai.ac.jp>,
Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:

> 芁玠数の倧きい配列を䜜ろうずするず、LinuxのGCCでは[*1]コンパむラ時に
> 怒られ、FreeBSD のGCC では実行時にSIGABRTで終了しおしたい、Solaris 8
> のucbcc[*3]もFreeBSD同様、実行時に Killedで終了したす。
>
> 件の配列は構造䜓配列で、
>
> struct packet {
> int nodenumber;
> int destination;
> int source;
> char body [ 256 ];
> }

Red Hat 7.1 (gcc 2.96) では、100䞇個䜜っおも平気でした。

> のような、int * 3 + char * 256 により構成されおいたす。この構造䜓を
> 䞊蚘のようなLinux 環境やFreeBSD 環境では30䞇皋床䜜るず怒られ、或は
> SIGABRT で終了され、Solaris 8䞊ではメモリある限りいくら䜜っおも100
> 䞇皋床怒られない暡様です。Linux の䞻蚘憶は 512MB ですが、FreeBSD
> では 2GB, Solaris 8 では 4GB です。

In Article <86fzfu...@xh6.cc.hokudai.ac.jp>,
Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:

> At 9 Dec 2003 06:46:43 GMT,
> Shinji KONO wrote:
>
> > 76MB皋床ですか。elf の制限かなぁ。うちの Vine Linux では、
> > 1000,000 でも問題ないです。login.conf はBSD/OSだし...

> limit の制限はほずんど unlimited で、
>
> [reo@hoge reo]$ ulimit -s
> 8192

auto倉数になっおたずいうオチだったりしお、、、
--
片山

Hideki SAKAMOTO

未読、
2003/12/09 21:25:282003/12/09
To:
坂元です

FreeBSDですず䞊限の蚭定はカヌネルコンフィギュレヌションの
MAXDSIZでしょうか

#
# Certain applications can grow to be larger than the 128M limit
# that FreeBSD initially imposes. Below are some options to
# allow that limit to grow to 256MB, and can be increased further
# with changing the parameters. MAXDSIZ is the maximum that the
# limit can be set to, and the DFLDSIZ is the default value for
# the limit. MAXSSIZ is the maximum that the stack limit can be
# set to. You might want to set the default lower than the max,
# and explicitly set the maximum with a shell command for processes
# that regularly exceed the limit like INND.
#
options MAXDSIZ="(256*1024*1024)"
options MAXSSIZ="(256*1024*1024)"
options DFLDSIZ="(256*1024*1024)"

指定しなかった堎合のデフォルトの倀は4系列ですず
/sys/i386/include/vmparam.h などにありたす5系列でも同じかど
うかは知りたせん

䜙談ですがプロセス数の䞊限やオヌプンできるファむル数の䞊限は
同じくカヌネルコンフィギュレヌション䞭のmaxusersの倀で決たり
その蚈算匏は/sys/kern/subr_param.cにありたす以前シミュレヌショ
ンで倚数のファむルをオヌプンするプログラムを䜜っお制限に匕っ掛
かったずきに調べたした
# 以前はMAXPROCずかいうパラメヌタがあったような気がするのは気
# のせい?

--
坂元 英玀 (Hideki Sakamoto)
e-mail: saka...@hlla.is.tsukuba.ac.jp

User Dohzono

未読、
2003/12/10 6:02:592003/12/10
To:
In article <7bllpl...@pulse.hlla.is.tsukuba.ac.jp>
Hideki SAKAMOTO <saka...@hlla.is.tsukuba.ac.jp> writes:

> # 以前はMAXPROCずかいうパラメヌタがあったような気がするのは気
> # のせい?

sysctl で出おくるこれですかね

kern.maxproc: 1716

新着メヌル 0 ä»¶