fork()와 exec()
- fork()와 exec()는 모두 한 프로세스가 다른 프로세스를 실행시키기 위해 사용 → 즉, 자식 프로세스를 생성
- fork() 시스템 호출은 새로운 프로세스를 위한 메모리를 할당
- (부모의 내용을 그대로 복사하여 새로운 메모리 공간에 새롭게 할당하여 자식 프로세스를 생성)
- exec()는 fork()처럼 새로운 프로세스를 위해 메모리를 할당하지 않고, exec()를 호출한 프로세스에 덮어씌워지며 부모 프로세스의 내용을 복사하지 않음.
- 자식 프로세스가 자동으로 exec() 실행하여 부모 프로세스 내용 전부 지움.
좀비 프로세스
프로세스가 종료되었음에도 불구하고 메모리상에서 프로세스에 대한 정보가 사라지지 않은 상태
자식 프로세스가 부모 프로세스보다 먼저 종료되는 경우

좀비 프로세스의 생성이유?
자식프로세스가 종료되는 상황
- 인자를 전달하면서 exit를 호출하는 경우
- main함수에서 return문을 실행하면서 값을 반환하는 경우
→ 운영체제는 이 값이 자식프로세스를 생성한 부모프로세스에게 전달될 때까지 자식프로세스를 소멸시키지 않음.
→ 이것이 좀비 프로세스
자식 프로세스가 exit() 시스템 콜을 호출하면서 종료되면 이 프로세스에 관련된 모든 메모리와 자원이 해제되어 다른 프로세스에서 사용가능합니다.
자식 프로세스가 부모 프로세스보다 먼저 죽는 경우 부모 프로세스가 종료 상태를 회수하기 위해 커널은 자식 프로세스의 최소한의 정보(PID, 종료 상태 등)를 가지고 있게 됩니다.
부모 프로세스가 좀비 프로세스의 종료 상태를 회수하게 되면 (wait 시스템 콜 호출을 통하여) 좀비 프로세스는 제거됩니다.
커널 입장에서 좀비 프로세스는 최소한의 정보만을 가지고 있어 큰 성능 저하를 야기하지는 않지만, 프로세스 스케줄링에 있어서 queue에 대기하고 있는 프로세스의 양이 증가하게 되고, 커널 구조체를 유지하기 위한 비용이 증가합니다.
고아 프로세스
부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우로, init() 즉 초기 프로세스가 자식 프로세스의 새로운 부모 프로세스가 됩니다.
종료되는 프로세스가 발생할 때 커널은 이 프로세스가 누구의 부모 프로세스인지 확인한 후, 커널이 자식 프로세스의 부모 프로세스 ID를 1 (init 프로세스)로 변경됩니다.
고아 프로세스가 작업을 종료하면 init 프로세스가 wait 함수를 호출하여 고아 프로세스의 종료 상태를 회수함으로써 좀비 프로세스가 되는 것을 방지합니다.
고아 프로세스는 init 프로세스가 관리를 해 주지만 부모 프로세스가 종료되기 전에 모든 자식 프로세스를 wait() 하는 것이 일반적입니다.
'CS > System Software' 카테고리의 다른 글
fork() vs clone() (0) | 2023.03.12 |
---|---|
O_APPEND의 기능 (0) | 2023.03.12 |
SRAM vs DRAM (0) | 2023.03.12 |
System call vs API (1) | 2023.03.12 |
댓글