[완료]c언어에서 heap과 data영역에 관한 질문입니다.

chsuk의 이미지

좀 찾아봤는데... 잘 나오지가 않아서..kldp에 질문을 드립니다.

메모리 구조가..
code, data, heap, stack으로 나뉘어진다면..

큰 사이즈의 메모리를 사용할때 data영역과 heap영역에서 사용에 있어서의 차이점에 관한 질문입니다.

예를 들어
전역변수에 100MB 배열을 잡고..사용하는 것과..
malloc으로 100MB를 잡고 사용하는 것과의 차이점이 궁금합니다.

heap영역을 프로그램 초기에 잡고 프로그램이 끝날때까지 사용한다면 전역변수를 잡는 것과의 차이가 있나요? 또한 어느것이 더 좋다고 말할 수 있나요?
큰 사이즈의 메모리를 사용한다면 보통 어느부분에서 사용하시나요?

행복하세요..~~

//답변다신분들에게 다들 감사드립니다.~~~~

serialx의 이미지

힙에다가 100MB 를 malloc 으로 할당하는데엔 시간이걸리지요.

전역변수에 100MB 를 할당하는건 이미 컴파일 시간에 영역을 할당하기 때문에 별도의 할당 시간이 필요하지 않습니다. 대신 사용가능한 힙 영역이 그만큼 줄겠죠.

만약에 그만큼의 메모리를 항상 사용한다면 전역변수에 넣어 사용하겠습니다. 만약에 임시로 사용한다면 malloc 을 쓰는것도 가능할것 같네요. 하지만 저렇게 큰 메모리의 경우는 malloc 이 좀 힘겨워할지도 몰라요..

cinsk의 이미지

먼저, 정말 그만큼 크기의 연속된 메모리가 필요한 것인지 다시 한 번 생각해보기 바랍니다.
그리고, 만약 그 만큼의 크기가 필요하다면, 저라면 malloc(3)을 쓰겠습니다.

  • 동적 할당이 아닌 정적 할당을 쓴 경우, 메모리를 할당할 수 없을 경우, 프로그램이 바로 죽어버리기 때문에, 무엇이 문제인지 알 방법이 좀 애매해집니다. malloc(3)을 쓰면, 메모리가 부족한 경우, 적절한 메시지를 출력하고 종료할 수 있기 때문에 좋습니다.

  • 초기화된 경우라면, (.data section에 위치), 실행 파일 크기가 무척 커 집니다. (물론 초기화되지 않은 경우라면 (.bss) 실행 파일 크기는 커 지지 않습니다.)

  • 속도 측면에서 그리 큰 차이가 있을 것으로 생각되지 않습니다. glibc에 포함된 malloc()의 경우, 큰 메모리 블럭 요청이 들어오면 내부적으로 mmap(2)을 써서 메모리를 할당합니다. 따라서 속도 측면에서 느릴 것이라고 생각하지 않습니다. 물론, malloc(3) 대신 mmap(2)을 직접 쓸 수도 있습니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

chsuk의 이미지

답변 감사드립니다.

그런데..

100MB의 정도의 크기에서 연속된 메모리의 경우와 아닌경우가 차이가 있나요?

저같은 경우 예를 들어 30,20,30,20MB 정도의 메모리를 따로 따로 사용한다면 달리 봐야 하는 것인가요? 블럭 크기 등의 문제를 말씀하시는 것인지??

감사합니다.

M.W.Park의 이미지

memory fragmentation이 발생하면, (총합은 크더라도) 작은 사이즈의 여러 개는 malloc가능해도 , 큰 사이즈는 안될 수가 있다고 알고 있습니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

jick의 이미지

어차피 전역변수로 할당할 때나, malloc으로 할당할 때나 결국 그 메모리를 쓰려고 할 때 커널이 해줘야 할 일은 (= 물리적 메모리 공간에서 빈 메모리를 찾아서 돌려준다) 별 차이가 없기 때문에 속도는 비슷할 걸로 보입니다.

그리고 요즘 OS라면 어차피 100M 요청한다고 해서 요청하는 그 순간에 100M 잘라서 주지 않습니다. 그냥 페이지 테이블에 "100M 예약"이라고 표시만 해두고 나중에 실제로 해당 영역을 사용하는 순간에 page fault가 일어나서 커널이 빈 공간을 할당해 주는 것이죠. (물론 커널의 메모리 정책에 따라서 다양한 변종이 있을 수 있겠습니다만...)

pizza1977의 이미지

실제로 사용하기 전까진 유효한 할당인지 확인할 수가 없네요.
char *buf = (char*)malloc(MAX_INT);
실제로 buf를 사용하기 전까지는 아주 깔끔이 동작하네요.

사전에 알 수 있는 방법은 없을까요?
-------------
포탈이는 불사신

-------------
포탈이는 불사신

cinsk의 이미지

hyoungguyo의 이미지

메모리를 활용적으로 나눠서 쓰는게 제일 좋겠지만

전 높은 사용빈도와 메모리가 필요시 전역변수에 한표!!

프로세스 관련해서 처음에 필요한 메모리를 로딩하면 실행하는 동안

좀 부하가 덜 걸리지 않을까 하는게 제 생각입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.