운영체제 - 프로세스 관리(2)

WooHyeong·2022년 12월 30일
0

OS(Operating System)

목록 보기
7/7

이전 강의에서 자식 프로세스는 부모 프로세스가 복제해서 만든다고 하였다. 부모 프로세스의 주소 공간인 code, data, stack을 그대로 복사해서 만들어지게 된다.

Copy on Write(cow) : 부모 프로세스 내용이 바뀔 때 복사해서 새로운 걸 만든다.

fork() 시스템 콜

사용자 프로세스인 부모 프로세스가 직접 생성하는 것이 아니라
운영체제한테 자식 프로세스를 만들어달라고 하는 요청을 시스템콜을 통해서 하게 되는데 이것을 fork() 시스템 콜이라고 한다.

int main()
{ int pid;
  pid = fork(); // 새로운 프로세스 생성
  // 새로 생성된 자식 프로세스는 fork() 다음 부분부터 실행한다.
  // 그 이유는 부모 프로세스의 컨텍스트를 복제하기 때문이다. 정확히는
  // program counter를 복제해서 다음 부분을 실행해야 한다는 것을 알려주기 때문이다.
  // 부모와 자식 프로세스의 fork()의 리턴값이 다르다.
  // 부모 프로세스는 fork()의 리턴값이 양수를 얻게 된다.
  // 자식 프로세스는 리턴값으로 0을 받는다.
  // fork()의 결과값을 가지고 다른 작업을 할 수 있다.
  if (pid == 0)
  	print("\n Hello, I am child!\n");
   
  else if (pid > 0)
  	print("\n Hello, I am parent!\n");
}

exec() 시스템 콜

exac() 시스템 콜은 프로세스를 새로운 프로세스로 태어나도록 하는 역할을 한다. 대충 프로세스를 갱생시켜서 새로운 삶은 주는 시스템 콜인 것 같다.
그렇지만 exec()은 꼭 자식 프로세스를 만들어서 해야하는 작업은 아니다. 즉 fork()없이 exec()만으로 프로세스를 새로운 프로세스로 만드는 작업도 가능하다.

int main()
{ int pid;
  pid = fork();
  if (pid == 0) {
  	print("\n Hello, I am child!\n");
    execlp("/bin/date", "/bin/date",(char*)0); //exec() 시스템콜
    // 새로운 프로그램으로 덮어 씌운다.
    // 한 번 exec()을 하면 다시 원래 프로세스로 돌아갈 수는 없다.
    // exec() 이후의 코드는 절대로 실행되지 않는다.
    
   }
  else if (pid > 0)
  	print("\n Hello, I am parent!\n");
}

wait() 시스템 콜

wait() 시스템 콜은 프로세스를 blocked 상태로 잠들게하는(sleep) 것이다. blocked 상태는 오래 걸리는 이벤트를 기다리고, 이벤트가 만족되면 다시 cpu를 얻을 수 있는 ready 상태로 돌아오게 된다.
wait() 시스템 콜은 보통 자식 프로세스를 생성한 다음에 하게 되는데, 자식 프로세스가 종료되기를 기다리면서 blocked 상태가 된다.

exit() 시스템 콜

exit() 시스템 콜을 프로세스를 종료시킬 때 호출하는 시스템 콜이다.

프로세스의 종료

  • 자발적 종료

    • 마지막 statement 수행 후 exit() 시스템 콜을 통해
    • 프로그램에 명시적으로 적어주지 않아도 main함수가 리턴되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료

    • 부모 프로세스가 자식 프로세스를 강제 종료시킴

      • 자식 프로세스가 한계치를 넘어서는 자원 요청
      • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 키보드로 kill, break 등을 친 경우

    • 부모가 종료하는 경우

      • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스 간 협력

원칙적으로 프로세스는 독립적이다.

독립적 프로세스(Independent process)

프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 다른 프로세스의 수행에 영향을 미치지 못함
(부모가 자식 프로세스를 죽이는 예외 존재)

협력 프로세스(Cooperating process)

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

프로세스 간 협력 메커니즘(IPC: Interprocess Communication - 프로세스 간 정보를 주고 받을 수 있는 방법)

프로세스끼리 직접 메시지를 전달할 수 있는 방법은 없다.

  • 메시지를 전달하는 방법

    • message passing : 운영체제 커널을 통해 메시지 전달

      Message Passing은 두 가지 방법으로 나눌 수 있다. 상대의 메시지를 받아볼 프로세스 이름을 명시하느냐 하지 않느냐에 따라서 Direct CommunicationIndirect Communication으로 나눌 수 있다.

      Message system
      - 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
      Direct Communication
      - 통신하려는 프로세스의 이름을 명시적으로 표시
      Ex) Send(Q, message) 프로세스 Q한테 message를 전달
      Indirect Communication
      - mailbox(또는 port)를 통해 메시지를 간접 전달
  • 주소 공간을 공유하는 방법

    • shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
    • thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

본 포스팅은 이화여대 반효경교수님 운영체제 강의를 바탕으로 작성하였습니다.

profile
화이링~!

0개의 댓글