본문 바로가기

Computer Science/운영체제

반효경 운영체제 - 3. 프로세스 관리

프로세스 생성


  • 부모 프로세스가 자식 프로세스 생성
    • 복제 생성을 한다.
    • 1대 n의 관계
    • 구조가 트리형태로 구성된다.
  • 프로세스는 자원을 필요로 한다.
    • 운영체제로부터 받는다.
    • 부모와 공유한다.
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델(원칙)
  • 수행(Execution)
    • 부모와 자식은 공존
    • 자식이 종료될 때까지 부모가 기다리는(wait, blocked) 모델
  • 주소 공간
    • 자식은 부모의 공간을 복사함 (binary and OS data)
    • 자식은 그 공간에 새로운 프로그램을 올림
  • 유닉스의 예
    • fork() 시스템 콜이 새로운 프로세스를 생성
      • 부모를 그대로 복사 (OS data except PID + binary)
      • 주소 공간 할당
    • fork 다음에 이어지는 exec () 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
    • 사용자 프로그램은 불가능하고 사용자가 OS에게 자식을 낳아달라고 부탁하는 경우

프로세스 종료


  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
    • 자식이 부모에게 output data를 보냄 (via wait).
    • 프로세스의 각종 자원들이 운영체제에게 반납됨.
  • 부모 프로세스가 자식의 수행을 종료시킴 (abort)
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 테스크가 더 이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
      • 자식이 먼저 종료되야하므로 자식들을 먼저 종료시키고 부모가 종료된다. (단계적인 종료)
  • Copy-on-write (COW) 기법
    • 부모와 메모리 공간을 공유하다가 write(원래 있는 내용이 변경될 때)가 발생했을 때 copy를 하도록 하는 것.
    • 조각난 데이터에 write가 발생하면 그 부분만 copy가 발생함

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


  • fork() : create a child (copy)
  • exec() : overlay new image
  • wait() : sleep until child is done
  • exit() : frees all the resources, notify parent

 


fork() 시스템 콜


  • 프로세스는 fork() system call에 의해 생성된다.
    • caller의 주소공간을 복사해서 새로운 주소공간을 만든다.
  • Program counter도 그대로 복사하므로 자식 프로세스는 fork() 실행 이후부터 실행된다.
  • fork()의 생각할 수 있는 문제점
    • 부모와 자식을 어떻게 구분할 것인가?
      • 구분을 위해, 부모는 pid > 0을 return 받고, 자식은 pid = 0을 반환받는다.
    • 똑같은 제어흐름을 따르는 프로그램
      • pid의 구분으로 exec하지 않아도 같은 코드 내에서 다른 일을 시킬 수 있다. (조건문으로 pid > 0일때, 0일때를 구분하는 경우 등)
      • exec 시스템 콜을 통해서 다른 프로그램을 실행할 수 있도록 한다.

exec() 시스템 콜


  • 프로세스가 다른 프로그램을 실행할 수 있도록 하는 시스템 콜
    • 프로그램의 시작 부분부터 다시 시작한다.

  • exec을 반드시 fork와 같이 써야하는 것은 아니다.
    • 프로그램을 덮어씌우는 용도로 사용
    • 프로그램이 덮어씌워지는 의미이므로 exec 이후의 코드는 실행되지 않는다.

위 코드를 실행하면 exec 이후의 2는 출력되지 않는다.

 


wait() 시스템 콜


  • 프로세스 A가 wait() 시스템 콜을 호출하면
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(block 상태)
    • Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
  • 자식이 종료될 때까지 기다리는 시스템 콜
    • 자식이 종료될 때까지 부모가 기다리는 모델에 해당된다.
  • 리눅스의 command line은 wait() 시스템 콜을 호출하는 모델이다.
    • 프로그램이 실행이 완료될 때까지 다른 프로그램을 호출할 수 없음

exit() 시스템 콜


  • 프로세스의 종료
    • 자발적 종료
      • 마지막 statement 수행 후 exit() 시스템 콜을 통해 종료
      • 프로그램에 명시적으로 적지 않아도 compiler가 main 함수가 리턴되는 위치에 exit()을 호출함.
    • 비자발적 종료
      • 부모 프로세스가 자식 프로세스를 강제 종료시킴
        • 자식 프로세스가 한계치를 넘어서는 자원 요청
        • 자식에게 할당된 테스크가 더 이상 필요하지 않음
      • 키보드로 kill, break 등을 친 경우
        • Ctrl + C, alt+F4 등
      • 부모가 종료하는 경우
        • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스 간 협력


  • 독립적 프로세스
    • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스
    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스 간 협력 메커니즘(IPC : Interprocess Communication)
    • 메시지를 전달하는 방법
      • message passing : 커널을 통해 메시지 전달
      • 프로세스 간 직접 메시지 전달은 불가능
    • 주소 공간을 공유하는 방법
      • shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음

*thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보긴 어려우나, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능.


Message Passing


  • Message system
    • 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
  • Direct Communication
    • 통신하려는 프로세스의 이름을 명시적으로 표시
    • ex) Process P(Send(Q,message)) → (커널의 개입) → Process Q(Receive (P, message))
  • Indirect Communication
    • mailbox (또는 port)를 통해 메시지를 간접 전달
    • 통신 대상이 명시되어있지 않음
    • ex) Process P(Send(M,message)) → Mailbox M → Process Q(Receive (M, message))

Message Passing - mailbox를 통해 indirect Communication(좌) / shared memory를 통한 데이터 공유(우)


Shared Memory


  • 커널의 도움을 받아 두 프로세스가 주소 공간을 공유할 수 있도록 허락 받음
  • 한번 shared 되면, 다음부터는 프로세스 간에 커널 없이 직접적으로 data를 주고 받을 수 있음.