티스토리 뷰

Process의 생성과 종료

 

[ Process 생성 ]

  · Directed 

    : 지시된 프로세스 생성.

    : PCB 초기화.

  · Cloning

    : 정확한 복제본 생성.

    : 부모의 가상 주소의 복사본을 가져옴. → Code, Stack, Heap, Register 등등 동일하지만, Pid는 다름.

    : fork() 시스템 콜로 실행. → Process Spawning이라고 함.

    : 서로 분리된 State로 진행. → 서로 독립적.

    : Parent와 Child의 실행순서는 비결정적.

    : 한 번의 호출로 두 번의 반환이 일어난다. → Call once, return twice

       ( 부모 프로세스자식 프로세스의 pid를,자식 프로세스0을 Return )

    : 프로세스 생성 속도가 빠르고, 추가 작업 없이 자원 상속 가능.

    : 효율적인 시스템 관리 가능.

fork() 실행 과정

  · Replacing

    : 프로세스의 Code, Stack, Heap, Register 등이 새 프로그램의 것으로 대체.

    : Pid는 변경되지 않음.

    : exec() 시스템 콜로 실행.

    : 호출이 일어나지만, 반환이 일어나지 않는다. → Call once, never return

    

[ Process 종료 ]

  · Termination

    : 프로세스 종료.

    : 프로세스 종료는 세 가지 중 하나의 원인으로 일어난다.

      1. main 함수에서의 return.

      2. exit() 시스템 콜 호출.

      3. 종료하라는 Signal을 받을 경우.

 

  · exit()

    : 종료 상태값(Exit Status)Parent Process에 알려주며 종료한다.

       ( 0~255까지 있으며 보통 0이면 정상 종료, 0이 아니면 에러임을 나타낸다 )

       ※ 메인 함수를 void main으로 작성하게 되면 마지막 return값이 %rax에 남아 Exit Status를 알 수 없다.

    : 자식 프로세스에서 발생.

    : 자발적 종료.

    : 프로세스가 보유한 시스템 자원을 할당 해제해준다.

    : PCB에 Zombie State를 저장한다.

 

[ Zombie Process와 Reaping ]

  · wait()

    : 부모 프로세스가 자식 프로세스에게서 종료 상태값을 받기 위해 호출.

    : 자식 프로세스가 종료 될 때까지 Block.

    : 느린 시스템 콜(Slow System Call).

    : 받는 pid의 순서는 보장되지 않음.

    매크로 함수

      · WIFEXITED : 자식 프로세스가 정상적으로 종료했는지 확인하는 함수. True : 정상 종료

      · WEXITSTATUS : 정상적으로 종료 됐을 시 종료 상태값을 반환.

 

  · Zombie Process (= Defunct Process)

    : 실제로는 종료된 프로세스지만 PCB 정보가 남은 상태인 프로세스.

    : 부모 프로세스에게 wait()을 통해 수거 될 때 까지의 상태를 Zombie State라고 한다.

    : 통상적인 프로세스 종료(exit() 호출) 시 Zombie State가 된다.

    : 메모리 누수(Memory Leak)의 원인이 되며, 누적될 수 있다. → Bash나 Server의 경우

Zombie State의 표시와 wait() ~ exit() Reaping의 과정

 

  · Orphan Process

    : 부모 프로세스가 자식 프로세스보다 먼저 종료 된 프로세스.

    : wait()을 통해 종료 상태값을 부모 프로세스에게 보낼 수 없게 되므로, Reparent 과정을 가진다.

       ( 본래 가졌던 부모 프로세스 대신 Init Process으로 대체된다. Reparent는 exit()에 구현되어 있다. )

Parent의 선종료로 Reparent가 수행되는 과정

  · Reaping

    : Zombie Process를 정리하는 과정.

    : exit() ~ wait()가 수행되는 과정.

    : Init Process에서 주기적으로 wait() 시스템 콜을 호출하여 Orphan Process를 제거.

 

  ·  waitpid()

    : wait()보다 유연하게 사용 가능.

    : 자식 프로세스가 종료될 때 까지 block과 non-block을 정할 수 있음.

    : 기다리려고 하는 pid를 명시할 수 있음. → -1을 넣을 경우 wait()과 동일하게 아무나 받음.

    : wpid값이 양수이면 exit() 되어 받은 pid, 0이면 받아야 할 프로세스가 남음, -1이면 남은 것이 없음을 의미.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함