함수안에서 malloc 사용 시 heap 영역을 사용하므로 계속 증가해야 하지만, 실제는 그렇지가 않네요.. 혹시 아시는분...

hernian의 이미지

안녕하세요..

제가 개발중에 문득 궁굼한게 있어서 이렇게 글을 쓰게 되었습니다.

일단 제가 임시로 짠 코드는 아래와 같습니다.
========================================================================================

#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에 계속해서 쌓여가야 한다고 알고있는데

왜 메모리가 증가하지 않는걸까요?

고수님들의 답변 기다립니다.

pchero의 이미지

두 가지 이유가 있습니다.

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 가 대표적이죠. 주로 메모리 누수 탐지에 사용되지만 메모리 사용량을 확인할 수도 있습니다.

---------------------------------
제일 왼쪽이 저입니다 :)

hernian의 이미지

답변 감사드립니다.

많은 도움이 됐습니다.

bushi의 이미지

어플이 malloc(10) 을 한다고해서 libc 가 OS 에 10bytes alloc 을 요청할 거라는 보장은 없습니다.
glibc 사용하신다면 mallopt(M_MMAP_THRESHOLD, ...) 나 MALLOC_MMAP_THRESHOLD_ 환경변수를 이용해서 조정하실 수 있습니다.

hernian의 이미지

도움 많이 되었습니다.

bushi 님께서 말씀하시는 부분이 OS에서 프로그램이 시작할때, OS는 프로그램에게 좀더 많은 메모리를 할당 해 준다는 사실을 잊었었습니다.

heep 영영에서 얼마나 사용할지 모르니 OS는 좀더 많은 양의 메모리를 할당 해줄테고 그래서 메모리가 증가를 안한 것 같네요

답변 감사드립니다.~

익명 사용자의 이미지

원래 힙이라는 게 메모리 영역을 처음에 많이 잡아 놓고 그 영역 내에서 메모리를 쪼개서 사용하는 메모리 관리 기법을 말하는 것입니다. :p

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.