티스토리 뷰
Process의 생성과 종료
[ Process 생성 ]
· Directed
: 지시된 프로세스 생성.
: PCB 초기화.
· Cloning
: 정확한 복제본 생성.
: 부모의 가상 주소의 복사본을 가져옴. → Code, Stack, Heap, Register 등등 동일하지만, Pid는 다름.
: fork() 시스템 콜로 실행. → Process Spawning이라고 함.
: 서로 분리된 State로 진행. → 서로 독립적.
: Parent와 Child의 실행순서는 비결정적.
: 한 번의 호출로 두 번의 반환이 일어난다. → Call once, return twice
( 부모 프로세스는 자식 프로세스의 pid를,자식 프로세스는 0을 Return )
: 프로세스 생성 속도가 빠르고, 추가 작업 없이 자원 상속 가능.
: 효율적인 시스템 관리 가능.
· 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의 경우
· Orphan Process
: 부모 프로세스가 자식 프로세스보다 먼저 종료 된 프로세스.
: wait()을 통해 종료 상태값을 부모 프로세스에게 보낼 수 없게 되므로, Reparent 과정을 가진다.
( 본래 가졌던 부모 프로세스 대신 Init Process으로 대체된다. Reparent는 exit()에 구현되어 있다. )
· Reaping
: Zombie Process를 정리하는 과정.
: exit() ~ wait()가 수행되는 과정.
: Init Process에서 주기적으로 wait() 시스템 콜을 호출하여 Orphan Process를 제거.
· waitpid()
: wait()보다 유연하게 사용 가능.
: 자식 프로세스가 종료될 때 까지 block과 non-block을 정할 수 있음.
: 기다리려고 하는 pid를 명시할 수 있음. → -1을 넣을 경우 wait()과 동일하게 아무나 받음.
: wpid값이 양수이면 exit() 되어 받은 pid, 0이면 받아야 할 프로세스가 남음, -1이면 남은 것이 없음을 의미.
'컴퓨터 공학 이론 > 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] File Structure & I/O (0) | 2022.12.03 |
---|---|
[시스템 프로그래밍] Signal (0) | 2022.12.03 |
[시스템 프로그래밍] Process와 Context Switching (0) | 2022.11.30 |
[시스템 프로그래밍] Exceptional Control Flow와 System Call (0) | 2022.11.29 |
[시스템 프로그래밍] Linking (0) | 2022.11.29 |