BuNa_
IT Story
BuNa_
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • 네트워크 (0)
      • Design Pattern (1)
      • OOP (4)
    • 대외활동 (24)
      • 우아한테크코스 (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해커톤 (1)
    • Android (29)
      • MVVM (2)
      • 스터디 (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • 어따세워 (5)
      • DnD 과외 서비스 (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인공지능 (22)
    • 백준 (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 선형회귀
  • 우테코
  • 파이썬
  • 외부 단편화
  • MVVM
  • 원시값 포장
  • RecyclerView
  • External fragmentation
  • 딥러닝
  • 우테코 프리코스
  • 인공지능 분류
  • Compose
  • UMC
  • ViewModel
  • 우테코 5기
  • 셀레니움
  • 인공지능
  • 우아한테크코스
  • 안드로이드
  • Ai
  • 운영체제
  • Android
  • 백준
  • 객체지향 생활체조
  • 컴공선배
  • 어따세워
  • 다이나믹 프로그래밍
  • k-means++
  • K-means
  • Baekjoon

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BuNa_

IT Story

[운영체제] 좀비(Zombie) 프로세스와 고아(Orphan) 프로세스
CS/운영체제

[운영체제] 좀비(Zombie) 프로세스와 고아(Orphan) 프로세스

2022. 11. 9. 15:07

✏️  좀비(Zombie) 프로세스와 고아(Orphan) 프로세스

 


좀비(Zombie) 프로세스는 자식 프로세스가 부모 프로세스보다 먼저 종료된 프로세스를 의미합니다.
고아(Orphan) 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료된 프로세스를 의미합니다.


💡  프로세스의 Creation & Termination

부모 프로세스는 fork() 시스템콜을 통해 새로운 자식 프로세스를 생성합니다.

fork() 시스템콜을 통해 생성된 자식 프로세스는 부모 프로세스를 복제하기 때문에 부모와 동일한 형태를 가집니다.

그리고 이후에 exec() 시스템콜을 호출하면, 생성한 프로세스의 메모리 공간을 새로운 프로그램으로 대체할 수 있습니다.

 

'커널이 자체적으로 생성한 init 프로세스와 이후 생성되는 자식 프로세스 트리'

 

 

이러한 프로세스들은 크게 2가지 방식으로 실행됩니다.

  • Parent와 Child가 Concurrently하게 실행됩니다.
  • Parent는 wait() 시스템콜을 호출하여 Child가 terminate(종료) 될때까지 기다립니다.

 

'부모 프로세스와 자식 프로세스 실행 분기'

위 설명과 같이, fork() 시스템콜을 통해 child가 생성되고, exec() 시스템콜을 호출하여 자식 프로세스의 메모리 공간을 새로운 프로그램으로 대체합니다.

그리고 parent는 wait() 시스템콜을 호출하여 자식이 exit() 될때까지 기다립니다.

exit() 시스템콜을 호출(또는 return) 할 때 반환된 자식 프로세스의 status는 wait() 시스템콜의 파라미터로 전달됩니다.

#include <sys/wait.h>    // <sys/wait.h> 헤더 선언
pid_t wait (int *status)   // 리턴값은 종료된 자식 프로세스의 pid

 

이렇게 자식 프로세스가 exit되면, 자식 프로세스가 사용하던 리소스(메모리 공간, I/O Buffer 등)를 반환하고 완전히 제거됩니다.

그러나, 이러한 흐름과는 다른 2가지 상황이 존재합니다.

 

💡  좀비(Zombie) 프로세스

 

좀비(Zombie) 프로세스는 자식(Child) 프로세스가 부모(Parent) 프로세스보다 먼저 종료된 프로세스를 지칭합니다.

이 내용은 위와 동일하지만, 다른 점이 하나 있습니다.

 

바로 부모 프로세스가 아직 wait 시스템콜을 호출하지 않은 상태입니다.

그렇기 때문에 자식 프로세스가 종료되어도, 사용하던 리소스를 반환하지 못하기 때문에 완전히 제거되지 못합니다.

(죽어도 사라지지 않는 좀비와 같아 이러한 이름이 붙은 것으로 보입니다.)

 

그렇기 때문에 이러한 상황을 대비하여 자식 프로세스가 먼저 종료되어도 커널은 최소한의 정보(pid, exit status 등)를 가지고 있습니다.

이후에 부모 프로세스가 wait() 시스템콜을 호출하여 종료 상태를 회수하면, 좀비 프로세스가 정상적으로 제거됩니다.

 

 

💡  고아(Orphan) 프로세스

 

고아(Orphan) 프로세스는 부모(Parent) 프로세스가 자식(Child) 프로세스보다 먼저 종료된 프로세스를 지칭합니다.

위와 반대의 상황입니다.

 

일반적인 경우, 부모 프로세스는 wait() 시스템콜을 통해 자식 프로세스가 종료될 때까지 기다립니다.

그러나 wait() 시스템콜을 호출하지 않고 부모가 먼저 종료되면 자식은 orphan 상태가 됩니다.

 

이 때, 자식 프로세스의 부모 프로세스가 제거되었기 때문에, 자식 프로세스의 새로운 부모는 init 프로세스가 됩니다.

(init은 최초에 커널이 자체적으로 생성하는 root 프로세스입니다.)

그렇기 때문에 새로운 부모 pid는 1로 변경됩니다.

 

init 프로세스는 기존의 부모 프로세스 대신 wait() 시스템콜을 호출하여 자식이 종료될 때까지 기다리고, 종료된다면 리소스를 회수하여 자식 프로세스 또한 정상적으로 종료 및 제거시킵니다.

 

 

⭐  결론

  • 좀비 프로세스는 자식 프로세스가 부모 프로세스보다 먼저 종료된 상태의 프로세스
    • 커널이 자식 프로세스에 대한 최소한의 정보를 가지고 있음.
    • 부모가 이후에 wait() 시스템콜을 호출하면 자원을 회수하고 정상적으로 제거 됨.
  • 고아 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료된 상태의 프로세스
    • init 프로세스가 새로운 부모 프로세스가 됨.
    • init 프로세스가 wait() 시스템콜을 호출 함.
    • 자식 프로세스가 종료되면 정상적으로 자원을 반환 함.

 

 

 

github : https://github.com/tmdgh1592

 

tmdgh1592 - Overview

느리더라도 천천히..!! 😁. tmdgh1592 has 21 repositories available. Follow their code on GitHub.

github.com

 

 

저작자표시 비영리 변경금지 (새창열림)

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 비연속할당(Noncontiguous allocation) - 세그먼테이션(Segmentation)  (0) 2023.01.06
[운영체제] Contiguous Allocation의 문제점 - External Fragmentation(외부단편화)  (1) 2023.01.02
[운영체제] Address Binding - Compile, Load, Execution time binding  (0) 2022.12.30
[운영체제] 식사하는 철학자들 문제 (Dining philosophers problem) - Deadlock, Starvation  (8) 2022.11.30
[운영체제] CPU 스케쥴러 (Short-Term, Long-Term, Midium-Term 스케쥴러)  (2) 2022.11.15
    'CS/운영체제' 카테고리의 다른 글
    • [운영체제] Contiguous Allocation의 문제점 - External Fragmentation(외부단편화)
    • [운영체제] Address Binding - Compile, Load, Execution time binding
    • [운영체제] 식사하는 철학자들 문제 (Dining philosophers problem) - Deadlock, Starvation
    • [운영체제] CPU 스케쥴러 (Short-Term, Long-Term, Midium-Term 스케쥴러)
    BuNa_
    BuNa_
    안드로이드 개발자를 향해 달리고 있는 공대생입니다! 🧑 Android, Kotlin, Java, Python 등 학습하고 있는 내용과 프로젝트를 주로 업로드하고 있습니다. 지적과 조언은 언제나 환영입니다!😊 github : https://github.com/tmdgh1592

    티스토리툴바