함수안에서 malloc 사용 시 heap 영역을 사용하므로 계속 증가해야 하지만, 실제는 그렇지가 않네요.. 혹시 아시는분...
글쓴이: hernian / 작성시간: 목, 2015/05/28 - 4:10오후
안녕하세요..
제가 개발중에 문득 궁굼한게 있어서 이렇게 글을 쓰게 되었습니다.
일단 제가 임시로 짠 코드는 아래와 같습니다.
========================================================================================
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> char* makeString(); int main(int argc, char* argv[]) { char* strings; int i; for(i=0 ; i<10 ; i++){ strings = makeString(); printf("%s\n", strings); sleep(3); } free(strings); return 0; } char* makeString(){ char* temp; temp = (char*)malloc(10); strcpy(temp, "wowow"); return temp; }
========================================================================================
main 함수에서 10번에 걸쳐서 makeString 함수를 호출하고 있습니다.
makeString 함수에서는 malloc 으로 10Byte의 메모리를 할당 받습니다.
그리고 할당받은 주소를 return 합니다.
여기서 궁굼한 점이 있습니다.
makeString 함수를 한번 호출할때마다 malloc 함수가 10byte를 할당 받을테고
할당받은 메모리 영역은 heap 영역이므로 제가 free 하지 않는 이상 계속 메모리에 존재할텐데요
그렇다면 main 함수의 for문에 의해 makeString을 10번 호출하므로
프로그램 종료시에는 총 10(횟수) * 10(10Byte) = 100 Byte 만큼 프로그램 메모리가 증가해야 하지만
그렇지가 않네요
ps -eo user,size,cmd 명령어로 보게되면
메모리는 계속해서 320 이라고 나오네요
함수에서 malloc을 호출하고 main함수에서 free하지 않으므로 heap에 계속해서 쌓여가야 한다고 알고있는데
왜 메모리가 증가하지 않는걸까요?
고수님들의 답변 기다립니다.
Forums:
두 가지 이유가 있습니다. 1. 확인하고자 하시는
두 가지 이유가 있습니다.
1. 확인하고자 하시는 메모리 증가량이 너무 작습니다.
man ps 에서 size 항목을 찾아봤는데 따로 단위는 안나오네요.
하지만 테스트 해보니 단위가 1K 였습니다.
프로그램을 수정해서 한번에 1M 씩 증가하도록 해봤는데, 증가량이 확인되네요.
할당하는 메모리 크기를 1M 단위로 하신다면 쉽게 증가 내역을 확인하실 수 있습니다.
2. ps 명령은 정확한 메모리 량을 확인하기에는 부족한 유틸리티 입니다.
출처 : http://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process
ps 명령은 사실 어플리케이션에서 사용하는 정확한 메모리 양을 나타내지 않습니다. 단지 예약된 메모리 양을 나타낼 뿐입니다.
달리 말하면 때에 따라(커널 레벨에서 사용되는 페이지가 공유 되거나 할 경우)변동될 소지가 있다는 것입니다. (예를 들면 여러개의 쓰레드나 동적 라이브러리를 사용하는 경우가 있습니다.)
그리고 만약 정확한 메모리 크기를 확인하고자 하신다면 다른 프로그램을 사용하셔야 합니다. valgrind 가 대표적이죠. 주로 메모리 누수 탐지에 사용되지만 메모리 사용량을 확인할 수도 있습니다.
---------------------------------
제일 왼쪽이 저입니다 :)
답변 감사드립니다.
답변 감사드립니다.
많은 도움이 됐습니다.
어플이 malloc(10) 을 한다고해서 libc 가
어플이 malloc(10) 을 한다고해서 libc 가 OS 에 10bytes alloc 을 요청할 거라는 보장은 없습니다.
glibc 사용하신다면 mallopt(M_MMAP_THRESHOLD, ...) 나 MALLOC_MMAP_THRESHOLD_ 환경변수를 이용해서 조정하실 수 있습니다.
답변 감사드립니다
도움 많이 되었습니다.
bushi 님께서 말씀하시는 부분이 OS에서 프로그램이 시작할때, OS는 프로그램에게 좀더 많은 메모리를 할당 해 준다는 사실을 잊었었습니다.
heep 영영에서 얼마나 사용할지 모르니 OS는 좀더 많은 양의 메모리를 할당 해줄테고 그래서 메모리가 증가를 안한 것 같네요
답변 감사드립니다.~
원래...
원래 힙이라는 게 메모리 영역을 처음에 많이 잡아 놓고 그 영역 내에서 메모리를 쪼개서 사용하는 메모리 관리 기법을 말하는 것입니다. :p
댓글 달기