ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] 프로세스의 생성과 프로세스 간의 협력
    Computer Science/OS 2023. 1. 12. 18:56

    시스템이 부팅 된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그 다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 됩니다.

    이 때 프로세스를 생성한 프로세스를 부모 프로세스라고 하고, 새롭게 생성된 프로세스를 자식 프로세스라고 한다.

    프로세스의 세계에선, 자식이 먼저 죽고 이에 대한 처리는 자식을 생성했던 부모 프로세스가 담당하는 방식으로 진행된다.

    프로세스 생성(Process Creation)

    • 부모 프로세스가 자식 프로세스 생성
    • 프로세스의 트리(계층 구조) 형성
    • 프로세스는 작업을 수행하기 위해서는 자원을 필요로 함
      • 자원 획득 방법
        • 운영체제로부터 받는다
        • 부모와 공유한다

    • 자원의 공유
      • 부모와 자식이 모든 자원을 공유하는 모델
      • 일부를 공유하는 모델
      • 전혀 공유하지 않는 모델

    • 수행(Execution)
      • 부모와 자식은 공존하며 수행되는 모델
      • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델

    • 주소 공간(Address space)
      • 처음 주소 공간을 생성할 때에는 자식은 부모의 공간을 복사(binary and OS data)
      • 자식은 그 공간에 새로운 프로그램을 올림

    • 프로세스의 생성 절차에 대한 유닉스의 예
      • fork() 시스템 콜이 새로운 프로세스를 생성
        • 부모를 그대로 복사 (OS data except PID + binary) → 부모 프로세스와 자식 프로세스는 비록 주소 공간을 따로 갖게 되지만 주소 공간 내에는 동일한 내용을 가지게 된다.

        • 주소 공간 할당
      • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림


    프로세스 종료

    • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
      • 자식이 부모에게 output data를 보냄(via wait)

      • 프로세스의 각종 자원들이 운영체제에게 반납됨

    • 부모 프로세스가 자식의 수행을 종료시킴(abort)
      • 자식이 할당 자원의 한계치를 넘어섬

      • 자식에게 할당된 테스크가 더 이상 필요하지 않음

      • 부모가 종료(exit)하는 경우
        • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다

        • 단계적인 종료


    fork() 시스템 콜

    운영체제는 자식 프로세스의 생성을 위해 fork() 시스템 콜을 제공한다.

    프로세스가 fork() 시스템 콜을 하게 되면 CPU의 제어권이 커널로 넘어가게 되고, 커널은 fork()를 호출한 프로세스를 복제해 자식 프로세스를 생성하게 된다 . (부모 프로세스의 주소 공간 이외에도 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제)

    → 부모 프로세스가 현재 수행한 시점(프로그램 카운터 시점)부터 수행하게 됨


    exec() 시스템 콜

    exec() 시스템 콜은 프로세스가 지금까지 수행했던 상태를 잊어버리고 그 주소 공간을 완전히 새로운 프로그램으로 덮어씌운 후 새로운 프로그램의 첫 부분부터 다시 실행을 시작하도록 하는 시스템 콜이다.


    wait() 시스템콜

    wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용된다.

    • block 상태로 오래걸리는 이벤트를 기다리고 CPU 상태를 얻을 수 있는 ready 상태로 변경시켜 작업을 재개할 수 있도록 한다.


    exit() 시스템콜

    프로세스는 명령을 모두 수행한 후, 프로그램이 마쳐지는 코드부분에 exit()라는 시스템 콜을 넣어주도록 되어 있다.

    프로세스의 종료에는 2가지가 있다.

    • 자발적 종료
      • 마지막 statement 수행 후 exit() 시스템 콜을 통해

      • 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌

    • 비자발적 종료( 밖에서 종료 시킬 때)
      • 부모 프로세스가 자식 프로세스를 강제 종료 시킴
        • 자식 프로세스가 한계치를 넘어서는 자원 요청

        • 자식에게 할당된 태스크가 더 이상 필요하지 않음

      • 키보드로 kill, break 등을 친 경우

    프로세스와 관련된 시스템콜

    • fork()
      • create a child (copy)
      • 프로세스를 복재 생성하는

    • exec()
      • overlay new image
      • 새로운 프로그램을 덮어 씌우는

    • wait()
      • sleep until child is done
      • 자식이 종료될 때까지 기다리는

    • exit()
      • frees all the resources, notify parent
      • 자원을 반납하고 프로세스를 종료시키는

    프로세스 간 협력

    원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미칠 수 없다.

    그러나, 업무의 효율에 따라 독립적인 프로세스들이 협력할 경우가 있다.

    따라서, 운영체제는 프로세스 간의 협력 메커니즘을 제공해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있게한다.

    • 독립적 프로세스(Independenet process)
      • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함

    • 협력 프로세스(Cooperating process)
      • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음

    • 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
      • 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신 → 정보를 주고받을 수 있는 방법 

     

    프로세스 간 협력 메커니즘(IPC: Interprocess Communication)

    IPC의 대표적인 방법에는 2가지가 있다. 

    • 메시지를 전달하는 방법(message passing)
      •  커널을 통해 메시지 전달

      • 필요한 공유자원이 필요할 시, 메시지를 주고받으며 통신하는 방식

      • 종류
        • 직접 통신
        • 간접 통신

    • 주소 공간을 공유하는 방법(shared memory)
      • 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음

      • 프로세스 간 공유가 되도록 설정해놓은 메모리

      • 처음 생성 시에만, 시스템 호출을 사용하기 때문에 속도가 빠르다.

      • 서로의 데이터에 일관성 문제가 유발 될 수 있어, 동기화 문제를 책임져야한다.
        why? 프로세스 A와 B가 독자적인 주소 공간을 가지고 있지만, 이 주소 공간이 물리적 메모리에 매핑될 때, 공유메모리 주소 영역에 대해서는 동일한 물리적메모리 주소로 매핑되기 때문에 일관성 문제가 유발될 수 있다.

      • thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는 주소 공간을 공유하므로 협력이 가능하다

    댓글

Designed by Tistory.