본문 바로가기
Computer Science/Operating System

[운영체제] 프로세스 관리

by whatamigonnabe 2023. 2. 11.

프로세스의 라이프 사이클

프로세스 생성

  • 프로세스는 부모 프로세스가 자식 프로세스를 생성하여 트리 구조를 이룹니다.
  • 프로세스의 생성은 오직 운영체제에 의해서만 이뤄집니다.
  • 자식 프로세스는 부모 프로세스의 문맥을 복제해여 사용합니다.
  • 운영체제에 따라 자식 프로세스의 자원을 운영체제로부터 바로 받을 수도 있고, 부모와 공유할 수도 있습니다.
  • 자원을 공유하는 이유는 자원을 효율적으로 활용하기 위함입니다.
    • 자식 프로세스를 생성하면 부모의 자원(코드, 스택, 데이터)를 복사하지 않고, 부모의 주소 공간을 공유합니다.
    • 이후 자식 프로세스가 부모와 다른 자원을 필요하게 되는 시점에서 부모의 자원을 복사하여 독자적으로 사용합니다. 이것이 Copy-On_Write(COW)입니다.
  • 프로세스 종료
  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 시스템콜(exit)를 통해 알려줍니다.
    • 자식이 부모에게 wait 시스템콜을 통해 ouput data를 보냅니다.
    • 프로세스의 자원들을 운영체제에게 반납합니다.
  • 부모 프로세스가 자식 프로세스를 시스템 콜(abort)를 통해 종료시키는 경우도 있습니다.
    • 자식이 할당된 자원을 초과해서 사용하거나, 자식의 태스크가 더 이상 필요하지 않는 경우입니다.
  • 또는 부모 프로세스가 먼저 종료(exit)되는 경우도 있습니다.
    • 이 경우에는 자식 프로세스부터 순차적으로 종료시킵니다.

프로세스 시스템 콜

fork()

  • 자신의 프로세스를 복제하여 자식 프로세스를 만드는 시스템 콜
  • 부모 프로세스의 경우 fork()의 return 값이 양수이고 자식 프로세스는 0입니다.
  • fork()를 실행하면, 부모의 PC가 포함된 문맥이 복되제기 때문에, 자식 프로세는 fork()이후의 프로세스부터 실행합니다.
    int main() {
    pid = fork();
    if (pid == 0)
      printf("I am child\n");
    else if (pid > 0) 
      printf("I am parent\n");
    }

exec()

  • 완전히 새로운 프로세스를 실행시키는 시스템콜입니다.
  • 꼭 자식을 만들어야하는 것은 아닙니다.

wait()

  • 어떤 프로세스가 wait() 시스템 콜을 호출하면, 해당 프로세스를 sleep상태로 전환하고 자식 프로세스가 모두 종료된 후 다시 ready상태로 전환합니다.

exit()

  • 프로세스를 종료시키는 시스템 콜입니다.
  • 프로세스의 모든 인스트럭션을 수행하고 나면 수행합니다.
  • 또는 자식 프로세스가 할당된 자원을 초과하서 사용하건, 자식이 더 이상 필요하지 않을 경우, 부모가 종료시킵니다.
  • 또는 키보드를 통해 사용자가 강제 종료시킬 수 있습니다.
  • 또는 부모가 종료하게 되면, 자식들을 먼저 종료시킨 후 마지막에 종료됩니다.

프로세스 간 협력

  • 원칙적으로는 프로세스 간에 협력하지 않고 경쟁합니다.
  • 협력 매커니즘을 통해 프로세스 간에 영향을 줄 수 있습니다.
    • 메시지 전달
      • Message Passing: 커널을 통해서 메시지를 전달
    • 주소 공간 공유
      • Shared Memory: 일부 주소 공간을 공유할 수 있습니다.