개요
부모로부터 생성된 프로세스는 부모의 PCB를 복제된 상태로 가지고 있게 된다 이때 부모 상태가 종료 상태를 회수 할 수 있도록 최소한의 정보를 남겨둔다 (PID, 종료상태, 리눅스의 경우 커널에서 사용하는 구조체)
좀비 프로세스 (Zombie)
부모 프로세스가 wait() 시스템 콜을 호출해야지만 상태를 회수 할 수 있는데 wait() 을 하지 않고 뒤늦게 종료해버리면 최소한의 메모리 정보가 OS 위에 남아있는데 이를 좀비 프로세스라고 함 (프로세스 실행은 종료되었지만, 마치 살아있는것 처럼 보이는것 )
최소한의 정보만 가지고 있어서 큰 성능 저하를 야기하지는 않지만, PID 를 차지하며 다른 프로세스의 실행을 방해하게 됨
예시코드)
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
int main() {
pid_t childPid;
childPid = fork();
if(childPid > 0) { // 부모 프로세스
printf("부모 PID : %ld, pid : %d\n",(long)getpid(), childPid);
sleep(30);
printf("부모 종료\n");
exit(0);
}
else if(childPid == 0){ // 자식 코드
printf("자식 시작 PID : %ld\n", (long)getpid());
sleep(1);
printf("자식 종료\n");
exit(0);
}
else { // fork 실패
perror("fork Fail! \n");
return -1;
}
return 0;
}
고아 프로세스 (Orphan)
부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우를 말함. 운영체제는 이를 허용하지 않아서 자식프로세스의 새로운 프로세스를 init 프로세스로 설정함 시스템이 프로세스가 종료 될 때 까지 추적해야하기때문에 성능 저하가 발생함
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/wait.h>
int main() {
pid_t childPid;
int i;
childPid = fork();
if(childPid > 0) { // 부모 프로세스
printf("부모 PID : %ld, pid : %d\n",(long)getpid(), childPid);
sleep(2);
printf("부모 종료\n");
exit(0);
}
else if(childPid == 0){ // 자식 코드
printf("자식 시작\n");
for(i=0;i<10;i++) {
printf("자식 PID : %ld 부모 PID : %ld\n",(long)getpid(), (long)getppid());
sleep(1);
}
printf("자식 종료\n");
exit(0);
}
else { // fork 실패
perror("fork Fail! \n");
return -1;
}
return 0;
}
'운영체제' 카테고리의 다른 글
[운영체제] - Multi Level Page Table (0) | 2024.01.28 |
---|---|
[OSTEP-28] - 락s (1) | 2024.01.12 |
[운영체제] - 연속 메모리 할당과 비연속 메모리 할당 (기본) (1) | 2024.01.05 |
[OS] - 메모리 관리 전략 (1) (1) | 2024.01.05 |
[운영체제] - 스케줄러 (0) | 2024.01.04 |