[완료]c언어에서 heap과 data영역에 관한 질문입니다.
글쓴이: chsuk / 작성시간: 월, 2008/09/22 - 12:25오전
좀 찾아봤는데... 잘 나오지가 않아서..kldp에 질문을 드립니다.
메모리 구조가..
code, data, heap, stack으로 나뉘어진다면..
큰 사이즈의 메모리를 사용할때 data영역과 heap영역에서 사용에 있어서의 차이점에 관한 질문입니다.
예를 들어
전역변수에 100MB 배열을 잡고..사용하는 것과..
malloc으로 100MB를 잡고 사용하는 것과의 차이점이 궁금합니다.
heap영역을 프로그램 초기에 잡고 프로그램이 끝날때까지 사용한다면 전역변수를 잡는 것과의 차이가 있나요? 또한 어느것이 더 좋다고 말할 수 있나요?
큰 사이즈의 메모리를 사용한다면 보통 어느부분에서 사용하시나요?
행복하세요..~~
//답변다신분들에게 다들 감사드립니다.~~~~
Forums:
힙에다가 100MB 를
힙에다가 100MB 를 malloc 으로 할당하는데엔 시간이걸리지요.
전역변수에 100MB 를 할당하는건 이미 컴파일 시간에 영역을 할당하기 때문에 별도의 할당 시간이 필요하지 않습니다. 대신 사용가능한 힙 영역이 그만큼 줄겠죠.
만약에 그만큼의 메모리를 항상 사용한다면 전역변수에 넣어 사용하겠습니다. 만약에 임시로 사용한다면 malloc 을 쓰는것도 가능할것 같네요. 하지만 저렇게 큰 메모리의 경우는 malloc 이 좀 힘겨워할지도 몰라요..
먼저, 정말 그만큼
먼저, 정말 그만큼 크기의 연속된 메모리가 필요한 것인지 다시 한 번 생각해보기 바랍니다.
그리고, 만약 그 만큼의 크기가 필요하다면, 저라면 malloc(3)을 쓰겠습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
감사합니다. 다시 질문을 드립니다.
답변 감사드립니다.
그런데..
100MB의 정도의 크기에서 연속된 메모리의 경우와 아닌경우가 차이가 있나요?
저같은 경우 예를 들어 30,20,30,20MB 정도의 메모리를 따로 따로 사용한다면 달리 봐야 하는 것인가요? 블럭 크기 등의 문제를 말씀하시는 것인지??
감사합니다.
memory fragmentation이
memory fragmentation이 발생하면, (총합은 크더라도) 작은 사이즈의 여러 개는 malloc가능해도 , 큰 사이즈는 안될 수가 있다고 알고 있습니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
...
어차피 전역변수로 할당할 때나, malloc으로 할당할 때나 결국 그 메모리를 쓰려고 할 때 커널이 해줘야 할 일은 (= 물리적 메모리 공간에서 빈 메모리를 찾아서 돌려준다) 별 차이가 없기 때문에 속도는 비슷할 걸로 보입니다.
그리고 요즘 OS라면 어차피 100M 요청한다고 해서 요청하는 그 순간에 100M 잘라서 주지 않습니다. 그냥 페이지 테이블에 "100M 예약"이라고 표시만 해두고 나중에 실제로 해당 영역을 사용하는 순간에 page fault가 일어나서 커널이 빈 공간을 할당해 주는 것이죠. (물론 커널의 메모리 정책에 따라서 다양한 변종이 있을 수 있겠습니다만...)
그게 참 애매합니다.
실제로 사용하기 전까진 유효한 할당인지 확인할 수가 없네요.
char *buf = (char*)malloc(MAX_INT);
실제로 buf를 사용하기 전까지는 아주 깔끔이 동작하네요.
사전에 알 수 있는 방법은 없을까요?
-------------
포탈이는 불사신
-------------
포탈이는 불사신
$ man mincore -- C FAQ:
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
위에 분 처럼 사용 빈도가 중요할꺼 같네요.
메모리를 활용적으로 나눠서 쓰는게 제일 좋겠지만
전 높은 사용빈도와 메모리가 필요시 전역변수에 한표!!
프로세스 관련해서 처음에 필요한 메모리를 로딩하면 실행하는 동안
좀 부하가 덜 걸리지 않을까 하는게 제 생각입니다.
댓글 달기