c언어 중 system함수를 사용한 프로그램 질문입니다.

maestrosmj의 이미지

리눅스에서 c 언어로 코드를 짜고 있습니다.

내용은 malloc을 무한루프 돌려서 시스템 free 중 used 가 과부하 걸리면 종료 하는 코드 입니다.

# vi mem.c

#include <stdio.h>
#include <stdlib.h>
int main ()
{
     FILE *f;
     char *c;
     int total=0;
     int used=0;
 
     system("free | grep Mem: | awk '{print $2}' > totaltxt");
     f = fopen("totaltxt", "r");
     fscanf(f, "%d", &total);
     fclose(f);
     while(1) {
          system("free | grep Mem: | awk '{print $3}' > usedtxt");
          f = fopen("usedtxt", "r");
          fscanf(f, "%d", &used);
          fclose(f);
          if( mem_used > 1000000 )  // free 로 확인 결과 기존 total 이 1030000 정도. 기존 used 는 700000 정도.
          {
               free(c);
               break;
          }
          c = malloc(1);
          printf("%d\n", used);  // used 가 변하고 있는지 확인하는 코드
     }
     return 0;
}

돌려보면 malloc 때문에 used 가 계속 쌓여서 결국 과부하에 걸려야 하는데 malloc이 계속 할당되지 않는 것인지

중간에 할당이 해제되는 것인지 used 가 비슷한 수준을 맴돌고 있습니다.

free 명령어를 써서 직접 모니터링 해봐도 역시나 똑같이 과부하에 걸리지 않습니다. 초기값과 거의 변화가 없습니다.

malloc이 이상한가 싶어서 while 문 안에 다 지우고 c = malloc(1) 만 두고 돌리면서

free 로 부하량 확인해보니 역시나 과부하가 잘 걸립니다.

system 함수와 malloc 함수를 같이 써서 문제가 있는 걸까요?

몇 시간째 씨름하고 있습니다 ㅠ_ㅠ

아시는분의 도움을 부탁드립니다.

익명 사용자의 이미지

malloc 값을 좀 크게해서 한번 돌려보시죠

maestrosmj의 이미지

메모리 올려서 total 늘리고 malloc 값을 1000 줘봤지만 같은 결과네요.

잃어버린 malloc을 찾아서...

ymir의 이미지

while loop 에 malloc 만 있다면야 cpu 클럭의 몇 분의 1 수준으로 빠르게 메모리가 증가하겠지만..
system 은 fork + exec 으로 shell 을 실행해서 명령 세 개를 실행한 다음에 (여기서도 shell 이 fork + exec + pipe)..
file I/O 까지 챙긴 후에 리턴할 테니.. 시간이 많이 걸릴겁니다.
그 다음에 파일을 한 번 더 읽는거는.. 뭐 얼마 안 걸린다 쳐도..

부하를 주는 녀석과 모니터링을 하는 녀석을 서로 다른 thread 로 돌려보세요.
부하를 줄 때 delay 없이 while 돌리면 프로세스나 cpu 부하가 많이 늘어날 테니..
메모리를 충분히 더 크게(64k ~ 1024k) 잡고, usleep 적당히 걸어주면 좋을 것 같네요.

thread 가 익숙지 않으면 그냥 /proc/meminfo 를 읽어서 total - free + buffers + cached 하면 used 가 나올겁니다 (아마도).
어차피 free 명령이 이 파일을 읽으니.. 모니터링 하는거라면 직접 읽는게 빠르고 부하도 적게 걸리겠죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

peecky의 이미지

malloc의 리턴값이 NULL인지 확인해보세요.

익명 사용자의 이미지

memset() 같은 걸로요...

익명 사용자의 이미지

페이지 폴트, 가상메모리 등으로 검색해 보세요.

https://kldp.org/node/23607

pchero의 이미지

정상입니다. 메모리가 과부하안되는 것이 아닙니다. 메모리는 착실히(?) 누수되고 있습니다.

하지만, 왜 실제로는 정상작동하는 것처럼 보이는지는.. 다음의 이유 때문입니다.

1. system io, File io 의 속도가 너무 느립니다.
2. malloc 의 크기가 너무 작습니다.

free 명령어에서 나타나는 결과의 단위는 1k 입니다. 즉, 루프를 1000 천 돌아야 1씩 올라가는데.. system io, file io 의 속도가 너무 느린 관계로 표면적으로 나타나는게 없는 것 처럼 보이는 겁니다.

malloc 의 크기를 10M(10000000) 혹은 1M(1000000) 로 지정해서 해보세요. 바로 결과가 나타납니다. :)

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

shint의 이미지

system()을 제외한.
윈도우 DevC++ 32비트 테스트 결과입니다.

- malloc() 은 하나마다 새로운 주소를 생성합니다.
- free() 는 생성한 주소 하나마다 모두 해제하는것이 맞습니다.
- fscanf() 에서 파일이 없으면. 멈춥니다.

윈도우에서는 _msize()로 할당된 메모리 크기 확인이 가능합니다.

len[    1]   c[ 4008424]
len[    1]   c[ 4008440] 16 증가
len[    1]   c[ 4008456] 16 증가
len[    1]   c[ 4008472] 16 증가
len[    1]   c[ 4008488] 16 증가
len[    1]   c[ 4008504] 16 증가
len[    1]   c[ 4008520] 16 증가
len[    1]   c[ 4008536] 16 증가
len[    1]   c[ 4008552] 16 증가
len[    1]   c[ 4008568] 16 증가
 
크기가 많이 증가하면. 앞단위가 한번에 바뀝니다.
 
len[    1]   c[ 7514424] 16 증가
len[    1]   c[ 7514440] 16 증가
len[    1]   c[ 7514456] 16 증가
len[    1]   c[ 7514472] 16 증가
len[    1]   c[ 7514488] 16 증가
len[    1]   c[ 7514504] 16 증가
len[    1]   c[ 7514520] 16 증가
len[    1]   c[ 7514536] 16 증가

댓글 첨부 파일: 
첨부파일 크기
Package icon test 1바이트 메모리 할당.zip403.3 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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