Question on large arrays in C
chris at mimsy.UUCP
chris at mimsy.UUCP
Thu Feb 12 14:49:50 AEST 1987
In article <1051 at uwmacc.UUCP> jwp at uwmacc.UUCP (Jeffrey W Percival) writes:
>I am running 4.3BSD on a MicroVax II. ...
with array declarations that require 20480*5*8 = 819200 bytes.
>When I run it, I get "Segmentation violation".
>If I move the 5 array declarations up above main(),
>under the define statement, the program works OK.
>What is wrong with the program as listed above?
Nothing. This is a `feature' of a large virtual address space with
demand paging. The system cannot tell whether many stack pointer
alterations are proper, so it uses a heuristic. If the stack
pointer has been moved less than 512 kilobytes, the stack allocation
is a controlled one and is allowed. If it has moved by more than
512K, it is assumed to be accidental, and the program is sent a
SIGSEGV.
This heuristic has an obvious flaw. To fix it, Berkeley made the
limit not really 512K, but rather the `stacksize' resource limit
for the process. This is set to 512K by init, and inherited by
all children. It can be changed with the setrlimit() system call,
or with the C shell's built-in `limit' command:
limit stacksize 1m
will raise it to one megabyte;
unlimit stacksize
will raise it to the kernel's configured maximum, probably 16M.
Incidentally, on all machines with which I have worked, large arrays
are more efficiently accessed when static than when on the stack.
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7690)
UUCP: seismo!mimsy!chris ARPA/CSNet: chris at mimsy.umd.edu
More information about the Comp.unix.questions
mailing list