10. Process Copy, Termination, Zombie, Orphan

COW (Copy On Write)

프로세스 생성 시간 줄이기 위함

Fork를 해서 효율적으로 Process를 생성할 때, 최초에는 자식 부모가 같은 Shared Page를 가리킴

그러나 부모 혹은 자식이 Write을 하여 값이 바뀌는 상황이 생길 때, 그제서야 Page를 복사하여 별도의 구분되는 Page를 가짐

  • Zero Fill On Demand

    페이지 할당 시 내용을 0으로 초기화 하는것

    새로운 페이지를 할당 받을 시는 이해하지만 왜 COW를 할 때 ZFOD가 필요한지 아직은 잘 모르겠음

    어차피 새 페이지에 복사본을 생성할 때는 Write으로 값을 수정하려고 할 때이고, 그러면 그냥 바로 수정하려던 값으로 초기화 해서 넘겨주면 되는 것 아닌가..?

  • Fork , VFork

    VFork 는 새로운 프로세스를 만들 때 부모 프로세스가 일시적으로 중단이 되고 자식 프로세스랑 메모리를 공유

    결정적인 차이점은 fork는 자식 만든다고 부모가 중단되지 않음

    vfork는 부모 프로세스가 일시적으로 중단됨, 자식이 exit or execute 되기 전까지는 부모가 block됨

    과거에 Fork는 지금처럼 부모와 동일한 메모리 공간을 참조하다가 바뀌면 Copy하는 COW 방식이 아니라, Memory 공간을 전부 복제했음

    보통 새로운 프로세스를 만들기 위해 Fork and Exec 방식으로 만드는데, exec은 다른 프로세스를 만드는 함수라고 생각하면 됨

    exec을 실행하면 Memory 상에 있던 text, stack 등을 새로운 다른 실행 파일로 덮어씌우는 것

    그렇기에 Fork시 쓰지도 않는 Memory를 복사하는 불필요한 OverHead를 줄이고자, 부모와 같은 Memory 영역을 Share하는 식으로 만들어지는 함수가 VFork

    다만 그렇기에 만약 exec를 안했을 경우 값을 수정하는 등의 행위를 할 때, Race Condition이 발생할 수 있음

    이를 해결하기 위해 부모 Process는 자식이 Exit되어서 완전히 종료되거나, Exec로 별개의 Process를 만들기 전까지는 Block되는 것

    다만 현재에 이르러선 COW로 Fork가 진행되기 때문에 VFork는 존재 의의가 없어졌다는 듯 함

Process Termination

  • 자발적 종료 (exit)

    exit()로 우리가 직접 프로세스를 종료하는 것

    종료하면 프로세스 자원 deallocated 됨

  • 비자발적 종료 (kill, abort)

    OS나 부모 등 다른 Process에 의해 종료

    Kill이나 Abort 명령어 통해 실행

Zombie

프로세스는 종료됐지만 커널이 PCB나 일부 자원들을 제거할 수 없는 어정쩡한 상태

Child 프로세스가 Exit 된 후 부모 프로세스에게 (wait 등) 상태가 전달될 때까지의 어정쩡한 상태

  • Reaping

    자식의 exit 값이 부모에게 전달되는 과정

    종료 상태가 부모에게 전달되어야 함

    => 부모가 wait을 통해서 수신함으로써 마무리됨

  • Zombie 상태 기간

    • wait, waitPID로 거두어질 때까지

    • 부모 Process가 Terminate될 때까지

  • Wait, WaitPid

    Parent Process가 fork를 하고 wait을 하면 Child Process의 종료 상태 값이 wait의 인자로 즉각적으로 전달이 됨

    인자가 오기를 기다리는 동안 parent는 Block 상태가 됨

    => 이렇게 Child Process의 상태 값을 수신함으로써 Zombie Process가 나타나는 것을 막을 수 있음

Orphan

만약 Child Process보다 Parent Process가 먼저 종료되면 Child Process의 부모를 init 으로 옮긴다

  • Process Termination 과정

    1. cleanup handler 호출
    2. Zombie 상태로 설정 및 종료 상태를 Kernel에 저장
    3. 자원 해제
    4. 부모에게 시그널 보냄
    5. 자식 프로세스들을 init으로 옮김

© 2025. Na2te All rights reserved.