운영체제 - 프로세스 생성 및 삭제

TopOfTheHead·2025년 7월 22일

운영체제

목록 보기
9/24

Operation on Process
。OS는 프로세스를 Creation하거나 Termination하는 기능을 제공해야함

  • 프로세스 생성 ( Process Creation ) : fork()

    。 프로세스는 부모 & 자식 간 트리구조를 가지며 자원을 공유하거나 독립적으로 활용

    。System Call : fork()를 통해 자식 프로세스 생성 시 물리적인 메모리 레이아웃 영역은 동일하게 공유하며 단지 PCB만 복사하여 프로그램 카운터 등으로 부모 프로세스와 구분
    ▶ 부모 프로세스와 Task가 완전하게 동일한 복제본을 생성

    。COW를 통해 프로세스를 생성하더라도 동일한 물리적 메모리 레이아웃 영역을 공유하도록하고, WRITE가 발생한 경우에만 별도의 물리적 메모리 공간으로 구분되는 복사본을 생성하여 메모리공간을 최적화

    프로세스 생성 원리 예시

    。 System Call : wait()이 없으므로 부모 프로세스와 자식 프로세스가 병렬적으로 실행
    ▶ 부모 프로세스가 먼저 처리된 경우

    。 System Call : fork()로 자식프로세스를 생성한 경우 부모프로세스의 Task와 이를 복제한 자식프로세스의 Task를 수행 후 return 0을 통해 Termination

    。 pid를 통해 생성된 자식 프로세스ID를 알 수 있음

    。 부모 프로세스의 조건문에서 System Call : wait()이 선언되어 자식 프로세스를 우선 Execute

    。프로세스 생성 시 부모 프로세스가 System Call : wait()를 접한 경우 부모 프로세스를 대기 큐로 전달 후 자식 프로세스를 먼저 Execute 및 Terminate된 경우 인터럽트를 통해 부모 프로세스를 준비 큐로 전달하여 실행 재개
    ▶ wait()을 선언안하면 부모 프로세스와 자식 프로세스를 동시에 병렬실행

    。자식 프로세스가 terminated 된 경우 부모 프로세스에 의해 자식 프로세스가 사용한 자원을 Kernel에 반환
    ▶ 이때 부모 프로세스가 wait()을 선언하지 않으면 자식 프로세스는 좀비 프로세스가 된다.
    • fork() #include <unistd.h>
      。UNIX OS의 호출한 부모 프로세스의 메모리상 물리적 메모리 레이아웃을 공유하는 자식 프로세스를 복제하여 생성하는 System Call
      ▶ 부모 프로세스와 완전한 복제본을 생성

      pid = fork()에서 Kernel에 의해 생성된 자식프로세스 PID를 pid_t type의 값으로 return
      。 pid < 0 일 경우 자식프로세스의 생성이 실패한 경우
      。 pid == 0 일 경우 자식프로세스가 fork()를 실행한 경우
      。 pid > 0 일 경우 자식프로세스의 프로세스 ID를 return.

    • wait() : #include <sys/wait.h>
      。UNIX OS에서 부모프로세스의 Task가 자식프로세스가 termination이 될때까지 Block하는 System Call
      ▶ 부모 프로세스에서 wait()을 접할 경우 대기큐로 전달 및 자식프로세스가 terminate되면 인터럽트를 통해 부모 프로세스를 준비 큐로 전달하여 Execute

      。자식 프로세스에서는 필요가 없으므로, pid > 0인 상황에서 선언

      。자식프로세스가 종료된 경우 해당 프로세스 ID를 return 및 status에 termination을 저장
      • pid_t :
        。프로세스 ID를 저장하기위한 자료형

      • 부모 프로세스 ( Parent Process ) :
        。새로운 프로세스( = 자식 프로세스 )를 생성하는 기존 프로세스

        。wait()을 선언할 경우 부모 프로세스를 대기 큐로 전달 후 생성한 자식 프로세스를 우선 Execute후 Terminate된 경우 인터럽트를 통해 부모 프로세스를 준비 큐로 전달한 후 Execute

      • 자식 프로세스 ( Child Process ) :
        。다른 프로세스( = 부모 프로세스 )에 의해 생성된 프로세스
        ▶ 부모 프로세스와 동일한 프로그램과 데이터를 가진 복사본

        。부모 프로세스와는 독립적인 가상의 복사된 주소공간을 갖는 프로세스로서 PID와 실행흐름이 구분됨
        ▶ 부모 프로세스와 동일한 물리적 메모리 레이아웃 공간을 공유하며 단지 PCB만 복사하여 프로그램 카운터 등으로 부모 프로세스와 구분

        。부모 프로세스에서 wait()을 선언하지 않는 경우 자식 프로세스는 terminate되더라도 사용한 자원을 반납하지 않는 좀비 프로세스가 된다.


    • 프로세스 생성 시 실행방식
      。System Call : fork() 선언 후 System Call : wait() 여부에 따라 변화

      • 부모 프로세스와 자식 프로세스가 동시에 병렬로 Execute
        。fork() 선언 후 wait()이 없는 경우 부모 프로세스와 자식 프로세스가 병렬적으로 실행

      • 자식 프로세스를 먼저 Execute 후 Terminate된 경우 부모 프로세스의 실행 재개
        。fork() 선언 후 wait()이 있는 경우 부모 프로세스는 wait()을 통해 대기 큐에 전달되어 자식 프로세스가 Terminate 될때까지 대기하다 자식 프로세스가 Terminate된 경우 인터럽트를 발생시켜 준비 큐로 전달 후 Execute


    • 프로세스 생성 시 주소공간 방식
      • 자식 프로세스와 부모 프로세스의 물리적 메모리 레이아웃 공유
        。자식프로세스 생성 시 부모프로세스의 주소공간을 Read Only로 Mapping하여 물리적으로 메모리 공간을 공유하도록 설정 및 PCB만 복사하여 구분
        ▶ PCB의 프로그램 카운터에 의한 프로세스의 실행하는 타이밍만 다르면 되므로.

        。 자식 프로세스는 부모 프로세스와 동일한 물리적 메모리 주소공간을 공유하지만 독립적인 가상의 복사된 주소공간을 갖는것처럼 설정됨

        。동일한 물리적 메모리의 주소공간을 공유하는 자식 프로세스 또는 부모 프로세스 중 하나가 데이터 수정 발생 시 COW 를 통해 서로 독립적인 물리적 메모리공간을 갖도록 설정

        COW ( Copy On Write )
        。동일한 물리적 메모리공간을 공유하는 자식 프로세스 또는 부모 프로세스 중 하나가 데이터 수정 시 WRITE 요청 발생 시 별도의 물리적 메모리 주소공간 할당 및 데이터를 복사 후 WRITE 작업 수행하여 자식 프로세스 와 부모 프로세스 간 서로 독립적인 물리적 메모리공간을 갖도록 하는 기법



      • 자식 프로세스가 새로운 프로그램을 적재한 경우
        。이때는 프로세스에 새로운 주소공간을 할당.


  • Process Termination
    。코드의 마지막 statement이 끝난 경우 ( ex. return이 발생 시 ) 자동으로 프로세스는 terminated.

    。System Call : exit()을 통해 실행 중 강제로 OS에게 프로세스를 Terminate하도록 명령이 가능

    。OS의 입장으로는 모든 Task에 할당된 자원을 해지하는 행위
    ex. 메모리 할당 , Open File , I/O Buffer에 할당된 자원들을 해지
    • 좀비 프로세스 ( Zombie Process )
      。프로세스가 Terminated 되었지만 메모리상에 죽지않고 잔류된 프로세스
      ▶ 부모 프로세스에서 System call : wait()을 선언하지 않아서 정상적으로 자원을 반납되지않아 자식 프로세스를 Terminate 해도 할당된 자원이 해지가 안되서 살아있는 상태

      좀비 프로세스 해결법

      • 부모 프로세스에서 늦게나마 wait()을 호출하여 자식 프로세스에 할당된 자원을 반납

      • 부모 프로세스를 종료시켜 모든 자식 프로세스를 종료.

      • 좀비 프로세스를 강제 종료


    • 고아 프로세스 ( Orphan Process )
      。부모 프로세스가 먼저 종료된 자식 프로세스를 의미
      ▶ 프로세스를 생성 후 wait()을 하지않고 실행되어 자식 프로세스보다 부모 프로세스가 먼저 Terminate된 경우

      。자식 프로세스는 wait()을 호출할 부모 프로세스가 사라져 Terminate해도 할당된 자원이 해지되지않고 메모리에 남아있게됨
      ▶ 좀비 프로세스와 동일한 문제 발생

      고아 프로세스 해결법

      • init 프로세스에게 고아 프로세스를 입양
        init 프로세스 : 모든 프로세스의 조상

        。 고아 프로세스의 새로운 부모가 되면서 init 프로세스는 이미 Terminated되었지만, 고아 프로세스 문제를 해결하기위해 주기적으로 wait()을 호출

프로세스 생성 예제

  • 프로세스의 Copy On Write


    。부모프로세스에서 wait()을 통해 자식프로세스를 우선 Execute하더라도 부모프로세스의 전역변수 value의 변화는 없다.
    ▶ 전역변수 value는 각각의 프로세스에서 독립적으로 존재

    。자식프로세스와 부모프로세스는 Task가 동일하여 서로 물리적 메모리 주소공간을 공유하지만, 자식프로세스에서 수정이 발생한 경우 COW에 의해 부모프로세스와 자식프로세스는 서로 물리적으로 독립적인 메모리 주소공간을 가지게 됨



  • 복수의 프로세스 생성


    。 3번 fork() 시 총 8개의 프로세스 생성
    。 4번 fork()할 경우 총 16개의 프로세스 생성
    ▶ 프로세스 갯수 = 2t2^t로 증가


    。 0번 프로세스 : i=0으로 value += 5 3번 수행
    。 2번 프로세스 : i=1으로 value = 5의 0번 프로세스 복사 후 value += 5 2번 수행
    。 5번 프로세스 : i=2으로 value = 10의
    2번 프로세스 복사 후 value += 5 1번 수행
    ▶ 각 프로세스의 전역변수 value = 15를 가진다.



  • execlp() 활용 예제


    。fork()에 의해 생성된 자식프로세스의 내용이 execlp("/bin/ls","ls",NULL);에 의해 /bin 디렉토리의 ls 실행파일로 교체
    ▶ 자식프로세스의 PCB는 유지한채로 내용만 교체됨

    。execlp("/bin/ls","ls",NULL);가 수행된 경우 차후에 쓰여진 명령어까지 모두 교체되므로, printf("Line J\n")은 실행되지 않음
    • ls ( List Segment )
      。UNIX에서 디렉토리의 내용( = 파일 및 폴더 목록 )을 보여주는 가장 기본적인 커맨드

    • exec family
      。UNIX OS에서 기존 프로세스를 호출한 프로세스로 대체하는 용도의 System Call 그룹

      。현재 프로세스의 메모리 레이아웃을 Exec을 호출한 프로세스로 덮어씌우면서 프로세스를 대체.
      ▶ 현재 프로세스의 PCB는 유지되어 프로세스 ID도 유지되지만, 내부는 새로운 프로세스의 내부로 교체

      。 주로 fork() 후 exec을 사용하여 부모프로세스를 자식프로세스로 대체하는 용도로 활용

      exec 계열 System Call

      • execlp(실행파일경로, 인자1, ... , NULL)
        。현재 실행중인 프로세스의 메모리 레이아웃을 새로운 파일로 대체( = 이미지 교체 )하는 System Call

        。파일경로로 지정된 파일을 실행 및 매개변수를 전달.
        ▶ 환경변수 PATH에 정의된 경로를 기준으로 파일을 찾고 실행

        。마지막 매개변수는 NULL 포인터로 설정


  • 각 프로세스에서 자신의 PID 확인
    。getpid()를 호출하여 현재 호출한 프로세스 ID 확인

    getpid()
    。호출한 프로세스의 프로세스 ID를 pid_t type으로 반환.
    ▶ fork()는 생성한 자식프로세스 ID를 반환하므로 다르다.

출처
。운영체제 공룡책 강의

profile
공부기록 블로그

0개의 댓글