heap 과 stack 크기...?
글쓴이: kkojiband / 작성시간: 화, 2003/06/24 - 1:17오후
제가 얼마전에 256 * 256 byte 크기의 데이터를 다룰 일이 있었는데...
지역변수로 잡아도 에러가 나고, 메모리 할당해서 힙 영역에 잡아도 에러가 나더군요...
64메가 정도 되니까 크긴 크죠...^^;
그 때 컴파일 한 곳은 윈도우 터보씨++ 3.0 에서였습니다...
힙과 스택의 크기를 늘려주려면 어떻게 해야하나요??
예전에 언뜻 비슷한 걸 봤던 기억이 있는데 다시 찾으려니 없네요...--;
리눅스에선 해보니까 되는걸로 봐서는 자동으로 크기를 조절해주는 것 같은데...
고수님들~ 도와주세요~
Forums:
하도 오래되서 기억이 가물가물 한데..예전 DOS 용 Turbo-
하도 오래되서 기억이 가물가물 한데..
예전 DOS 용 Turbo-C 2.0 에서 컴파일 옵션인가 링크 옵션인가에
메모리 모델을 small 에러 large 로 바꾸니 별 문제가 발생하지 않았던 것 같은데..
혹시 이것과 관련이 있지 않을까......
from saibi
참고
16비트 운영체제와 32비트운영체제의 차이라고 보심이 옳습니다.
도스: 16비트 운영체제(운영체제라고 부르기도 민망합니다만)
win32(win95/98/nt/2000/xp) : 32비트운영체제
유닉스/리눅스 : 32비트운영체제
Digital Unix : 64비트운영체제 <=== 유닉스라고 부르면 안되고 반드시 디지털유닉스라고 불러야합니다. 그냥 유닉스가 아니라서리.
각 운영체제수준에서 메모리관리 메커니즘이 있고, 그 메모리 관리 메커니즘을 기반으로 컴파일러가 만들어지는데, 컴파일러의 구동환경이 32비트이거나, 그 이상의 메모리(virtual memory;VM)를 지원한다면, 아주 큰 메모리를 할당할 수 있지만, 그렇지 않다면 불가능하지요.
님이 고민하시는 문제는 운영체제수준의 문제로 보심이 옳습니다. 과거 한때, 도스상에서도 거대메모리를 할당하는 메커니즘이 인기를 끈적이 있었습니다. 이를 테면 도스익스텐더들이 그러한 사례들인데요. 이제는 더이상 관심을 두지 않는것이 옳습니다. 사례를 들어드리면, Dos4GW라는 것도 그중 하나인데, 둠(DOOM)등의 게임에서 널리 사용이 되었었습니다.
글구, TurboC2.0에서 Large모델 또는 Huge모델로 컴파일해도 1MB의 메모리영역 이외의 구간을 액세스할 수는 없습니다. 불가능하지요 왜냐면 16비트 컴파일러라서리.
16비트운영체제라도, 32비트컴파일러를 사용하면 가능합니다. 특히, 도스같은 것에서는요. 도스외의 다른 16비트운영체제에서는? 이건 저도 모르겠습니다만, WatcomC같은 경우에는 가능하리라고 보입니다. 왜냐면 이 컴파일러는 자체적으로 메모리관리 메카니즘을 가지고 있기때문입니다. 컴파일러수준에서요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
이유를 말하자면
C언어에서 전역변수나 지역변수의 경우 스택에서 잡게 되죠..
x86 어셈블리 해보신분은 알겠지만, 8086호환모드(리얼모드)의 경우
스택포인터가 16bit이고, 따라서 한 스텍 세그먼트당 64K가 최대 값입니다.
하지만 스택 세그먼트레지스터는 웬간해서는 바뀌지 않죠. 바뀌도록 한다면 엄청
복잡해지니까요.
32비트 모드일경우 32bit이고, 따라서 4G가 최대가 되겠죠.
(실제론 4G 다 안줍니다만, 웬간한 작업에서는 충분합니다)
이때 힙과 스택은 OS가 알아서 조절해 줍니다. 힙의 경우는 OS에게
할당을 요구하면 OS가 알아서 주고, 스택의 경우는 Stack Fault라는
exception을 이용하죠.. (스택 다 쓴경우 Stack Falult가 발생하게 되고,
이걸 OS가 받아서 해당 프로세스에 스택용 메모리를 더 퍼다 주죠.
실행되는 프로그램은 이 과정을 모릅니다. 자기도 모르는 사이에 이런 일이
다 벌어집니다.)
하나 OS와 컴파일러가 작업하는 방식에 따라서 제가 말한것과 맞지 않는 일이
벌어지지고 합니다. 대표적인게 DOS용 GCC인 DJGPP인데, 이넘은 스택
크기를 256Kb로 딱 고정시켜 놨습니다. DJGPP 쓰시는 분들은 한번
시도해보시기 바랍니다. 1M짜리 전역변수 배열(초기값없는거) 만들고,
함수 몇번 call해보시면 괴상한 일들이 벌어지죠.
Written By the Black Knight of Destruction
댓글 달기