관리 메뉴

너와 나의 스토리

[Unix] 좀비, 고아 프로세스 & Background, Foreground 프로세스 본문

Unix/실습

[Unix] 좀비, 고아 프로세스 & Background, Foreground 프로세스

노는게제일좋아! 2019. 11. 6. 00:36
반응형
기본적인 fork() 실습
  • UID: 프로세스를 실행 시킨 프로세스의 소유자를 의미
  • PID: 실행된 프로세스에 부여된 숫자
  • PPID: 부모 프로세스의 PID
// fork.c
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
	pid_t pid;
    printf("Calling fork()\n");
    pid=fork();
    
    if(pid>0) // 부모
       	printf("Parent PIDs : %d, %d, %d\n",pid,getpid(),getppid());
    
    else if(pid==0) // 자식
       	printf("Child PIDs : %d, %d, %d\n",pid,getpid(),getppid());
    
    else
    	printf("fork() error.\n");
        
    return 0;
}

 

sleep(), wait() 실습

 

 

 

부모 프로세스는 자식 프로세스가 종료되면 wait을 리턴 받아 그 후 과정을 진행.

자식 프로세스는 sleep(10)을 하므로 10초가 지연됨

 

 

 

 

 

 

 

 

 

* ps: 시스템에 동작중인 프로세스 확인하는 명령어

 

 

 

 

  • 좀비 프로세스
    • 자식 프로세스가 부모 프로세스보다 먼저 종료
    • 프로세스는 종료되었지만 메모리 상에서 프로세스 정보가 유지되고 있는 상태
    • 자식 프로세스에서 exit와 return으로 전달되는 인자값을 부모 프로세스가 받을 때까지 자식 프로세스는 좀비 프로세스로 남아있게 된다. 

// zombie.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(){
	pid_t pid;
    pid = fork();
    
    if(pid!=0) sleep(60);
    else printf("Parent becomes zombie for 60 secs.\n");
    return 0;
}

부모 프로세스가 wait하지 않고 60초간 아무 것도 안하는 상황. 그 안에 자식 프로세스가 먼저 끝남

 

 

 

부모 프로세스는 그냥 자기 할 일 하는 중

자식 프로세스가 좀비 프로세스가 됨

 

 

 

 

 

  • 고아 프로세스
    • 부모 프로세스가 자식 프로세스보다 먼저 죽는 경우
    • init 프로세스가 고아 프로세스의 부모가 되어준다.
    • init 프로세스가 고아 프로세스를 wait()해 고아가된 좀비가 제거된다.
    • 데몬(daemon) 등의 동작을 가능케 함
      • 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
      • 부모 프로세스가 init(PID=1)이고 제어하는 터미널이 없을 때, 그 프로세스를 daemon이라 한다.

// orphan.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
	pid_t pid;
    pid =fork();
    if(pid==0) sleep(60);
    else printf("Child will terminate in 60 secs.\n");
    return 0;
}

 

 

처음 실행 시에는 orphan 프로세스가 두 개 다 존재

 

부모 프로세스는 자식 프로세스가 종료되는 것을 기다리지 않고, 병렬적으로 자신의 일을 수행

 

시간이 지난 후, ps를 출력해보면 자식 프로세스만 남아았음(60초 sleep하도록 해서)

 

 

 

 

 

ps -al 명령어 입력

  • 두 프로세스 다 동작할 때

F  S   UID    PID    PPID  C

 

  •  부모 프로세스만 종료한 경우

F  S   UID    PID    PPID  C

ㄴ 자식 프로세스의 PPID가 부모 프로세스가 아닌 init 프로세스가 된다.

 

  • Foreground Process
    • 명령어의 실행 과정이나 결과를 화면에 출력
    • ex) sleep 10 명령어를 입력하면, 10초 간 기다린 후, 다음 명령어 수행 가능
    • 즉, 실행 중인 프로세스가 종료되길 기다린 후, 프롬프트 명령 대기 상태로 전환된다.
  • Background Process
    • 프로세스가 실행중이어도 이를 보이지 않는 background에서 돌려 놓고, 명령을 계속 받고 실행 가능
    • &를 붙여서 명령어를 입력하면 background로 실행됨
    • 장시간 작동되는 작업에 유용하다

 

 

 

 

 

 

출처: [unix system programming 2nd]

출처: https://sayo-le.tistory.com/17

반응형

'Unix > 실습' 카테고리의 다른 글

[Unix] 디렉터리 조작 실습  (0) 2019.10.12
[CH.2] 유저(그룹) 추가/제거 변경 및 권한  (0) 2019.10.09
[CH.5] 파일 조작 - System call  (2) 2019.10.09
[Unix] Make  (0) 2019.09.27
Comments