정적메모리와 동적메모리의 사용에 대해서 의문점이 생기는데요~

ins878의 이미지

안녕하세요~ 프로그래밍을 공부하고 있는 학생입니다.

다름이 아니라, fork()를 사용하여, 자식프로세스에서 반복문으로 함수를 계속 호출하게 했습니다. 호출되는 함수에는 일반적인 변수를(동적메모리 사용 안함) 선언하고 사용했습니다. 동적메모리는 하나도 사용안하고 정적메모리만 사용했습니다.
문제는 프로세스를 실행시키고 top으로 프로세스 상황을 보니, 점점 조금씩 메모리를 잡아 먹더군요.~ 결국 일정 시간이 흐르니 자식프로세스가 죽고 좀비 프로세스로 되었습니다.
궁금한 점은 정적메모리를 사용해도, 함수가 호출되고 반환되면, 함수에서 사용하는 정적메모리의 공간(스택)이 반환되는 걸로 알고 있습니다. 분명 함수에 리턴 값도 없는데, 메모리가 조금씩 늘어나는 것을 보고 신기하고 놀랐습니다.
이 프로그램에서 메모리를 조금씩 잡아 먹는 것이 정적메모리만 사용해서인가요? 아니면, 메모리를 점점 잡아먹는 뭐 다른 이유가 있는지~~?? 소스코드는 너무 방대해서~ 올릴수가 없네요~T.T

고수님들은 정적메모리와 동적메모리를 어떻게 사용하고 있습니까? 저 같은 경우 보통 임시로 사용하는 것에 동적메모리를 많이 사용하는데...
혹시, 동적메모리를 어디에 사용하면 정적메모리를 사용하는 것보다 좋다는 뭐~ 그런 조언이나 참고할 만한 자료가 없는가요?

=============================================
어리석은 질문일지 모르지만~~ 초보인 저에게는 참 남감합니다.
동적메모리와 정적메모리를 어떻게 조화롭게 사용해야 할지.... :cry:
=============================================

고수님들~ 좋은 조언 부탁드립니다.

bugiii의 이미지

그 호출당하는 함수 안에서 무슨 일이 있었는지 자세히 알려주셔야 합니다.

메모리 잡아먹는 귀신이 눈에 띄는 malloc 이나 new 에만 있지 않다는 것을 상기하시고, OS의 여러 자원들의 획득과 해제에 (예, 파일 디스크립터 등) 도 신경을 한번 써보시기 바랍니다.

ins878의 이미지

저도 소스코드를 보면서 찾고는 있는데요~ 소스파일이 1~2개가 아니라~ㅋㅋㅋ 올리기 힘드네요~^^

파일디스크립터를 사용하긴 하는데요~ 반복문 안에서 파일 디스크립터를 사용하고 반환하면 문제는 없지 않은가요?

ex)
for(...)
{
fd = fopen(...);
fprintf(...);
fclose(fd);
}

이렇게 사용하면 문제가 없잖아요~~??

=============================================
참고로
=============================================
제는 대학생 2학년인데요~ 4학년 졸업작품을 대신 만들고 있어요~ 프로그램이 Mysql와 libpcap을 이용하여 간단한 침입탐지 시스템을 구현하는 건데요~
자료는 없고 기간도 겨우 2개월 정도로~ 해서 간단하게 포트스캔 탐지를 구현 했습니다. 당연히 소스코드는 디죽박죽입니다. 아~ 미치겠어요 저도 2학년이라 할 것도 많고 실력도 그렇게 뛰어난 것도 아닌데~... 4학년 졸업 작품 발표는 10월 초이고~
===============================================

죄송하지만, 자식프로세스가 죽으면 다시 새로 살려낼 수 있는 방법은 없는가요?~
패킷을 DB에 저장하는 것은 부모프로세스가 하고, 자식 프로세스는 30초 간격으로 쓰레드를 이용하여 (검사 모듈 호출) 패킷을 검사하게 구현은 했는데~
왜~ 그놈의 프로그램이 메모리를 점점 잡아 먹는지~휴~

소스코드를 봐 주실 수 있는 분 없나요~ 잘은 못 했지만~ 엄청 뒤죽박죽이예요~~ T.T

mach의 이미지

기능적인 구현에는 문제가 없다고 가정하고 글을 씁니다.

자식프로세스가 메모리를 잡아먹는다?
이 경우, 자식프로세스에서 부른 모든 함수를 나열해보세요. (if, for등 제어는 중요치않음)
중복되는것은 물론 제거하고. 잘 살펴보세요. 호출한 함수중(라이브러리) 내부에서 메모리 할당하는 것이 있을수 있습니다.
DB와 접속한다면 이 인터페이스관련(결국 함수)해서도 살펴봐야겠습니다. 접속 및 해제는 잘하고 있는가?
DB 에서 fetch할때 메모리부분은 어떻게 되는가?

부모프로세스에서는 일단 SIGCLD(자식프로세스 사망)에
대한 signal() 핸들러를 달아서, 재실행시키던가 하세요.

* 디버깅은 지겹지만, 실력을 키우는 밑거름입니다. 열심히 포기말고 해보세요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

sangwoo의 이미지

regcomp() 나 shmat() 같은 함수들도, 적절히 처리해 주지 않으면 메모리 릭이
계속 생기죠. (아픈 기억이.. -_ㅠ)
bugiii 님 말씀대로 이런 녀석들을 reclaim하지 않고 그냥 리턴하는 건 아닌지
차근차근 살펴보세요~

----
Let's shut up and code.

yielding의 이미지

숙제를 부탁한 4학년 참 나쁩니다.. 2학년 숙제를 도와주지는 못할 망정..

그리고 동적메모리의 반대 개념으로 정적메모리를 말씀하신거 같은데 스택영역을 말씀하신거죠?

스택에 만들어진 변수는 스택이 없어지면서 해제되는게 맞습니다. 천천히 살펴보세요. 분명이 해제하지 않은 메모리가 있을겁니다.

고수들은(제가 고수라는 말은 아닙니다. ^^) 동적메모리를 필요할때 사용하지만 사용중 exception이 날 경우를 대비해 칼같이 할당한것을 반환하고 종료하도록 프로그램을 구성합니다..
RAII(resource acquisition is initialization) idiom가 대표적인 예가 될거고요, smart pointer, resource guard Object, Object Factory 패턴등이 이러한 의도를 가지고 구현되는 툴이라 할 수 있습니다.

Life rushes on, we are distracted

ins878의 이미지

:lol:

아직 부족한 실력이지만, 열심히 찾아서 해보겠습니다~^^

이렇게 삽질을 하면서, 또 메모리에 버그에 대해서 공부하는 것 같네요~^^

고수님들 많은 것 가르쳐 주셔서 감사드립니다.

댓글 달기

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