Computer Science/운영체제

4강) 프로세스 관리, 시스템 콜의 종류(Process management, types of system calls)

열심히 사는 우진 2023. 1. 25. 02:53
반응형

** KOCW에서 반효경 교수님의 운영체제(2014년) 강의를 수강한 내용을 정리한 글입니다.

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

 

프로세스 생성 (Process Creation)

  • 부모 프로세스가 자식 프로세스를 생성
  • 프로세스의 트리 형성(계층 구조)
  • 프로세스에게 필요한 자원
    • 운영체제로부터 받는다
    • 부모와 공유한다
  • 자원의 공유 방식 → 가능하면 공유하다가 COW(Copy-on-Write)
    • 부모와 자식이 모든 자원 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델
  • 수행(Execution)
    • 부모와 자식이 공존하며 수행되는 모델
    • 자식이 종료(Terminate)될 때까지 부모가 기다리는 모델
  • 주소 공간(Address space)
    • 자식은 부모의 공간을 복사함(+ OS data)
    • 그 공간에 새로운 프로그램을 올림
  • 유닉스의 예
    • fork() 시스템 콜이 새로운 프로세스를 생성
      • 부모를 그대로 복사
      • 주소 공간 할당
    • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

 

프로세스 종료 (Process Termination)

  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려주는 경우(exit 시스템 콜)
    • 자식이 부모에게 output data를 보냄 (via wait)
    • 프로세스의 각종 자원들이 운영체제에게 반납됨
  • 부모 프로세스가 자식의 수행을 종료시키는 경우(abort 시스템 콜)
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 Task가 더이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더이상 수행되도록 두지 않는다
      • 단계적인 종료

 

fork() 시스템 콜

  • 프로세스는 fork() 시스템 콜에 의해 생성된다
    • 생성된 새로운 주소 공간은, caller의 복제이다.
int main() {
    int pid;
    pid = fork();
    if(pid == 0) printf("\n Hello, I am child!\n");
    else if(pid > 0) printf("\n Hello, I am parent!\n");
}
  • fork() 메서드가 실행되면, 새로운 프로세스가 생성된다.
    • 이때, 생성된 프로세스는 부모 프로세스의 문맥을 그대로 이어 받아, fork() 메서드 실행 이후의 코드부터 실행한다.

 

exec() 시스템 콜

  • 프로세스는 exec() 시스템 콜을 통해 다른 프로그램을 실행한다.
    • 새로운 프로그램으로 caller의 메모리 이미지를 대체한다.
int main() {
    int pid;
    pid = fork();

    if(pid == 0) {
        printf("\n Hello, I am child!\n");
        execlp("/bin/date", "/bin/date", (char *) 0);
    }

    else if(pid > 0) {
        printf("\n Hello, I am parent!\n");
    }
}

/* date */
int main() {
    ...
}
  • fork()를 통해 복제된 자식 프로세스라면(if pid == 0) → execlp() 함수를 실행한다.

 

wait() 시스템 콜

  • 프로세스 A가 wait() 시스템 콜을 호출하면
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(blocked 상태)
    • Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
int main {
    int childPID;
    S1;

    childPID = fork();

    if(childPID == 0)
        ...
    else {
        wait();
    }

    S2;
}

 

exit() 시스템 콜

  • 프로세스의 종료
    • 자발적 종료
      • 마지막 문장 수행 후(혹은 exit() 시스템 콜이 명시되어 있을 때) exit() 시스템 콜을 통해 이루어짐
      • main 함수 리턴 위치에 묵시적으로 컴파일러가 넣어줌
    • 비자발적 종료
      • 부모 프로세스가 자식 프로세스를 강제 종료시킴
        • 자식 프로세스가 한계치를 넘어서는 자워 ㄴ요청
        • 자식에게 할당된 태스크가 더이상 필요하지 않을 때
      • 키보드로 kill, break 등을 친 경우
      • 부모가 종료하는 경우
        • 부모 종료 전에 자식들이 먼저 종료됨

 

프로세스 간 협력

  • 독립적 프로세스 : 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 다른 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스 : 프로세스 협력 메커니즘을 통해 영향을 미칠 수 있음
  • 프로세스 간 협력 메커니즘(IPC: InterProcess Communication)
    • 메시지 전달(Message passing) : 커널을 통해 메시지 전달
    • 주소 공간 공유(Shared memory) : 서로 다른 프로세스 간에도 일부 주소 공간 공유
    • ** Thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기 어렵지만, 동일한 Process를 구성하는 Thread들 간에는 주소 공간을 공유하므로 협력이 가능

 

Message Passing

  • 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
  • Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시

  • Indirect Communication : Mailbox(또는 Port)를 통해 메시지를 간접 전달

 

 

 

 

 

 

 

반응형