[질문] [./a.out <defunct>] 라는 메시지가...

래리버드의 이미지

fork를 사용하여 프로그램을 구성하였는데,

실행 후에 process를 보면 메인 밑에 [./a.out <defunct>]라는 메시지가 나옵니다.

이런메시지는 좀비 때문인걸로 알고 있는데요..

지금 현재로는 프로그램이 돌아가는데는 별 무리가 없습니다.

그래서 혹시나 돌다가 나중에라도 무슨 문제가 있을 수 있는지가 궁금합니다.

답변 부탁드립니다.

즐거운 주말 되세요...

sorcerer의 이미지

좀비는 당장은 눈에 보이는 어떤 영향은 없습니다.
하지만 죽지는 않고 메모리를 차지하고 있는 것이므로 쌓이면 메모리누수,
그러니까 사용 할 수 있는 메모리가 줄어들지요.
될 수 있으면 없는게 좋습니다.
wait() 같은 함수를 참고해 보세요.

SOrCErEr

mach의 이미지

래리버드 wrote:

실행 후에 process를 보면 메인 밑에 [./a.out <defunct>]라는 메시지가 나옵니다.

이런메시지는 좀비 때문인걸로 알고 있는데요..


fork()시 부모 프로세스에서 SIGCLD에 대한 시그널핸들러를 달아주세요.
비권장 사항은 부모 프로세스에서 자식 프로세스의 사망시그널을 무시하는것입니다.
signal(SIGCLD, SIG_IGN);
래리버드 wrote:

그래서 혹시나 돌다가 나중에라도 무슨 문제가 있을 수 있는지가 궁금합니다.

프로세스 상태가 zombie로 바뀌게 되면, zombie 프로세스는 커널
프로세스테이블의 한 엔트리를 차지하고 있고,
모든 리소스는 반환합니다. 또한, 스케쥴링에서는 제외됩니다.
하나의 좀비프로세스인 경우, 프로세스테이블 엔트리 하나를 점유하지만,
이런 식의 프로세스가 증가하면, 무수히 많은 엔트리를 장악하게 될테고,
불필요하게 메모리를 점유하게 되는 현상이 되겠지요? 따라서 좀비는 없게끔
해야 합니다.
원초적으로 프로세스생성한 쪽에서 책임져라!(부모가 자식프로세스의
사망을 핸들링해라)라는 명제로 유닉스 설계자가 설계해서 이런 메카니즘이
만들어진 것입니다.
* KLDP BBS 검색에서 검색해보면 검색어: 좀비 zombie 좋은 답변이 아주 많겠지요?

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

kukuman의 이미지

http://www.joinc.co.kr/modules.php?name=News&file=article&sid=122&mode=nested&order=0&thold=0#147

해당 내용중 재미 있는 부분^^

Quote:
비록 좀비프로세스가 어떠한 자원도 소모하지 않는다고는 하지만 커널입장에서 봤을때는 task 자료구조를 유지하기 위한 얼마간의 자원을 소모하고 있음을 알수 있다. 무엇보다 커널이 유지할수 있는 task 구조체의 리스트의 크기에 제한이 있음으로, 많은 좀비프로세스가 발생할경우 시스템성능에영향을 미칠수 있다. 또한 리스트의 크기가 크면 리스트를 순환하는데 걸리는 시간(각 프로세스를 스케쥴링하기 위한)도 더걸리게 됨으로 역시 성능에 좋지 않은 영향을 미칠수 있을것이다. 관리자가 ps 명령을 이용해서 시스템을 모니터링 할때 기분이 나뻐지는 심리적효과도 무시할 수 없다(정신적인 데미지를 입는다).

실제로 전 저 데미지가 가장 크더군요... 8)

Be at a right place at a right time...

sangwoo의 이미지

mach wrote:

fork()시 부모 프로세스에서 SIGCLD에 대한 시그널핸들러를 달아주세요.
비권장 사항은 부모 프로세스에서 자식 프로세스의 사망시그널을 무시하는것입니다.
signal(SIGCLD, SIG_IGN);

그냥 참고입니다. ^^;
POSIX에서는 (제 기억에는..;; ) SIGCHLD를 SIG_IGN로 set하면 결과는 undefined입니다. 하지만 BSD계열의 유닉스에서는 SIGCHLD를 ignore하면 자동으로 자식 프로세스의 좀비화를 막아줍니다.
그래서 signal(SIGCHLD, SIG_IGN); 을 사용한 BSD 쪽 프로그램을 리눅스 등의 sysV계열에서 컴파일하면 문제가 종종 생기죠. 윗분 말씀대로 signal handler에서 wait()등을 호출해주는 것이 올바른 처리라고 생각합니다. :)

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

댓글 달기

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