프로그램을 실행하면 RAM에서 얼마정도의 메모리를 할당할까요?

lo0p의 이미지

1.프로그램이 처음에 어느정도의 메모리를 할당 받잖아요?
그러면 이게 어떤기준으로 얼마만큼 할당을 받나요?

2.stack영역에 최대로 얼마만큼의 변수가 선언될 수 있나요? 예를 들어서 c코딩을 할때 변수로 val[15][25000]을
선언하니까 오류가 뜨더군요.

chanik의 이미지

1.은 [번역] Anatomy of a Program in Memory ( http://woodz.tistory.com/53 ),
또는 좀 오래된 글이지만 https://kldp.org/node/199 가 도움이 될지도..

2.의 스택크기는 ulimit 명령으로 확인 및 설정할 수 있습니다.

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31593
max locked memory       (kbytes, -l) 32
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31593
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

스택크기가 10240 == 10MB 라고 나오네요.
이는 물리적인 한계는 아니므로 늘리거나 줄일 수 있습니다.

아래 샘플에서 12MB짜리 어레이를 스택에 정의하고 있는데, 스택크기가 10MB인 기본상태로 실행하면 오류가 발생하고, 20MB로 늘려서 실행하면 오류가 사라집니다. 대충 감이 올 것이라 생각합니다.

$ cat stack_size.c
int main()
{
        int arr[3][1024][1024] = {0};  // 4 * 3 * 1024 * 1204 = 12MB
        return 0;
}
$ gcc -o stack_size stack_size.c
$ ulimit -s
10240
$ ./stack_size
세그멘테이션 오류
$ ulimit -s 20480
$ ulimit -s
20480
$ ./stack_size
$
shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com