배열의 크기 선언에 대해서...
글쓴이: HiHi / 작성시간: 월, 2003/10/06 - 4:24오후
안녕하세요~
항상, 도움을 많이 받고갑니다~
흐, 이번에도 궁금한점이 생겨서..
C에서 보통 배열 선언을 하면,
char a[10];
이렇게 하잖아요?
이 말은, char 사이즈의 10개의 공간을 사용한다는 뜻이 되겠구요.
그래서 제가..
int main() { char a[1024*1024*500]; getchar(); }
위 처럼 하고 실행을 해봤더니, 실행전과 메모리 사용량이 거의 달라진게 없네요.
제 생각엔 메모리 500메가를 먹어야 하는거 같은데..~
그래서, 이번엔,
int main() { char a[1024*1024*500]; memset( a, '$', sizeof(a) ); getchar(); }
이렇게 했더니, 그제서야 500메가를 먹는군요.
음~ 왜 처음 코드에서 500메가를 먹는게 아닌지요?
조언 부탁드립니다.
아~ 실험 OS는 Linux 2.4.18 입니당~
덧붙임. 제가 여기서 말하는 메모리는 물리적인 메모리의 사용량을
얘기합니다.
Forums:
답은 아니고요. 메모리를 차지해야 될것 같은데 신기하네요. ^^;무옵
답은 아니고요. 메모리를 차지해야 될것 같은데 신기하네요. ^^;
무옵션으로 컴파일했습니다.... 음 스택을 확보하는군요.
기본옵션에서는 삭제를 하지 않는군요.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
그게...
-S 로 컴파일해서 assembly 언어로 보면 확실하겠지만
첨 소스에서 변수 a 를 쓰질 않으니까
컴파일러가 최적화하면서 날려버린거 아닐까요?
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
최적화도 최적화지만...
운영체제에서 가상메모리 잡는것과도 상관이 있습니다.
일딴 주소공간을 할당은 하고 실제 사용될때
실제 물리메모리가 할당 되니까요..
http://bbs.kldp.org/viewtopic.php?t=3599&highlight=malloc+memset
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
[code:1]//#define PAGE_SIZE 4096#def
실행해 보시면 VmRSS의 크기가 4KB(4096)단위로 증가 하는 것이 보일것입니다.
이는 초기화 시에 모든 물리 메모리를 할당하는것이 아니고, 가상 메모리를 할당 후, page fault가 일어날 경우(메모리 엑세스), 실제적인 물리 메모리가 할당되는 것입니다.
PAGE_SIZE가 4096으로 되어 있으므로 1페이지 단위로 증가가 되면서 실제 물리메모리를 가져가는 것이라고 보시면 될것입니다.
/***********************
* while(1) sleep(INFINITE);
***********************/
메모리 할당...
답변 감사드립니다~
아~ 주소공간만 할당하고, 실제로 쓰기 전까지는
메모리에 손을 안 대는군요.
음.. 그래서, 제가 테스트를 해봤는데...
stack이랑 heap 주소공간 할당이 다른것 같습니다.
stack 같은 경우는 정확히 남은 메모리 까지만 주소 공간 할당이 되는데,
heap 같은 경우는 거의 무한대로 주소 공간 할당이 되는군요.
실험 전에, 'swapoff -a' 디스크 스왑도 끄고, 프로세스당 스택사이즈 제한도
풀었습니다.
현재 제 컴터는 384 이구요. 남은 물리메모리는
318 메가 정도 됩니다.
stack 주소공간 할당
아주 정확히는 아니지만, 남은 메모리 공간까지만 할당이 됩니다.
다음은 heap의 경우...
이렇게 되는군요.
음... heap 에서는 남은 메모리 만큼만 메모리(주소공간)할당하는게 아니라,
남은 메모리에 관계없이 그냥 주소공간을 할당하는군요.
생각해보면, stack이야 바로 당장 써야 하니까, 메모리의 남은 만큼만
된다고 치는데...
heap은 남은 메모리에 관계없이, 특정 영역까지 할당이 되는거 같습니다.
왜 이런거죠?
조언 부탁드립니다.
^^
댓글 달기