코학다식

[OS] 프로세스 생성과 종료 본문

Fundamentals/OS

[OS] 프로세스 생성과 종료

copeng 2019. 9. 26. 17:35

Operating System

chapter 3, Processes (2)

 

 

 

 

프로세스 생성


 

  • 부모 프로세스는 자식 프로세스를 생성하는데, 이는 프로세스들의 트리를 구성하게 된다.
  • 프로세스는 프로세스 식별자(pid)를 통해 식별되고 관리된다.
  • Resource sharing option
    • 부모와 자식은 모든 자원을 공유한다.
    • 자식은 부모의 자원의 부분집합을 공유한다.
    • 부모와 자식은 자원을 공유하지 않는다.
  • Execution option
    • 부모와 자식은 동시에 실행된다.
    • 부모는 자식이 종료될 때까지 기다린다.
  • Address space option
    • 자식은 부모의 복사체다.
    • 자식은 그것의 안에 로드된 프로그램을 가진다.
  • 리눅스 시스템에서의 프로세스 트리(tree)

 

 

 

 

UNIX에서의 프로세스 생성


 

먼저 그림을 보자.

 

> a.out

 

쉘로 위와 같은 명령을 실행하면 새로운 프로세스가 생성된다. 그 과정은 다음과 같다.

 

  • fork라는 시스템 콜이 새로운 프로세스를 생성한다.

  • 새로운 프로세스는 원래 프로세스의 주소 공간의 복사본으로 구성된다.

    • 복사본으로 구성되었기 때문에, 내용은 같지만 다른 메모리 공간에 존재한다.
    • 따라서 부모의 전역 변수 등을 변경해도 자식의 내용은 바뀌지 않는다.
  • 두 프로세스는 fork() 명령 이후에 (스케줄러를 통해) 동시에 실행을 계속한다.

    • 가령, 부모가 다음과 같다고 하면 fork()문 이후 부모와 자식은 if 문부터 동시에 실행을 계속한다.
    int i;
    main {
        int pid;
        pid = fork();
        if (pid == 0) {
            ...
        }
        else {
            ...
        }
    }

 

  • 반환된 pid 값은 다르다.
  • 부모는 자식의 pid, 자식은 0을 반환받는다.
    • 그래서 fork() 이후의 코드에서 pid 값을 통해 분기를 실행하는 경우가 많다.
  • fork를 통해 반환받은 pid 변수의 값은 로컬 변수의 return 값이다. 이는 실제 프로세스 식별자(pid)와 다르다.
  • exec 시스템 콜이 fork 이후에 자식 프로세스에서 사용되어 프로세스 메모리 공간이 새 프로그램으로 오버라이드되고, 새 프로그램이 실행된다.

 

Example of a Process Creation(UNIX)

 

 

 

프로세스 종료


 

  • 프로세스는 마지막 명령을 수행하고 운영체제에게 exit(status) 시스템 콜을 사용해서 자신을 삭제하기를 요청한다.
    • 부모는 자식의 상태 값을 얻을 수 있다. (wait(&status)을 통해)
    • 프로세스의 자원은 운영체제에 의해 해제된다.
  • 부모는 자식 프로세스의 실행을 kill을 통해 끝낼 수 있다.
    • 자식이 할당된 자원을 초과한 경우
    • 자식에게 할당된 task가 더 이상 필요하지 않은 경우
    • 부모가 exiting 중일 때
      • 운영체제는 부모가 종료되는 경우 자식이 계속 실행되는 것을 허락하지 않는다.
      • 이를 Cascading termination이라고 한다.

 

 

 

좀비 vs 고아 프로세스


 

  • 좀비 프로세스 또는 defunct 프로세스는 실행이 완료되었음에도 PCB가 사라지지 않고 프로세스 테이블에 엔트리를 가진 프로세스이다.
    • 프로세스가 종료되었음에도 부모가 wait을 통해 자식의 자원을 정리하지 않은 프로세스
    • 자식이 죽은 동안 부모가 실행중인 경우
    • 부모가 wait을 요청하면 자식은 정상적으로 종료된다.
    • 모든 프로세스는 보통 짧은 시간동안 좀비로 존재한다.
  • 부모가 wait을 일으키지 않고 종료된 경우, 그의 자식 프로세스들은 고아 프로세스가 된다. (이때 고아가 된 자식 프로세스들은 실행 중이다.)
    • init 프로세스가 이 프로세스들의 새 부모로 할당된다.
    • init 프로세스는 고아 프로세스의 exit status를 모으기 위해 주기적으로 wait을 일으킨다.
    • 자식 프로세스가 실행 중인 동안 부모 프로세스가 죽으면 고아 프로세스가 된다.
Comments