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

돗개·2020년 11월 29일
1

운영체제

목록 보기
4/7

프로세스 생성 (Process Creation)

부모 프로세스가 자식 프로세스를 복제생성한다. 문맥(주소공간, program counter)을 모두 복제해 생성한다.

(효율적인 OS에서는 일단 copy하지 않고, 자식이 부모의 주소공간을 공유하다가 내용이 달라져야할 때, 일부를 copy. 즉, (내용을 바꾸는)write가 발생했을 때, copy를 하겠다 : COW)

  • 프로세스의 트리 (계층구조) 형성 (자식을 여럿 생성, 자식이 자식을 생성..)

  • 프로세스는 자원(CPU, memory)을 필요로 함

    • 운영체제로부터 자원을 받는 경우 (일반적)
    • 부모와 자원을 공유하는 경우
  • 자원의 공유(보다는 경쟁) - 프로세스가 만들어지면 독립적인 프로세스가 됨

    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부만 공유하는 모델 (copy-on-write : COW)
    • 전혀 공유하지 않는 모델 (일반적/원칙적)
  • 수행

    • 부모와 자식이 공존하며 수행되는 모델
    • 자식을 생성한 뒤, 자식이 종료될 때까지 부모가 기다리는 모델

부모 프로세스는 어떻게 자식을 생성할까?

프로세스 생성을 OS에게 부탁해 시스템 콜을 통해 자식을 생성한다.

  • 주소공간 (Address Space)

    : 자식은 부모의 공간을 복사(binary and OS data)한 뒤, 자식은 그 공간에 새 프로그램을 올린다.

  • 유닉스의 예

    • 1단계 ) fork( ) 시스템 콜이 새로운 프로세스를 생성. (OS가 대신해서 자식을 낳아주는 격)
      • 부모를 그대로 복사(OS data except PID + binary)
      • 주소 공간 할당
    • 2단계 ) fork 다음에 이어지는 exec( ) 시스템 콜을 통해 새로운 프로그램을 메모리에 올리고, 덮어씌움.

프로세스 종료 (Process Termination)

: 프로세스의 세상에서는 자식이 부모보다 먼저 죽어야한다.

  • exit(자발적 종료) : 프로세스가 마지막 명령을 수행한 후, OS에게 이를 알려줌.
    • 자식이 부모에게 output data를 보냄 (wait를 통해)
    • 프로세스의 각종 자원들이 OS에게 반납됨
  • abort(강제 종료) : 부모 프로세스가 자식의 수행을 종료시킴.
    • 자식이 할당자원의 한계치를 넘어섬 (자식이 펑펑 씀)
    • 자식에게 할당된 task가 더 이상 필요하지 않음 (자식한테 시킬 일이 없음)
  • 단계적 종료 : 부모가 종료되는 경우, OS는 자식이 더 이상 수행되도록 두지 않는다. (손자 죽고->자식 죽고->부모 죽음)

프로세스의 생성부터 종료까지 관리하는 시스템 콜 종류에 대해 알아보자.

fork( ) 시스템 콜

: fork( ) 시스템 콜에 의해 프로세스가 생성된다. (caller에 의해 복제된 새 주소공간 생성)

// 부모 프로세스
int main()
{ int pid;
  printf('\n Hello!\n');
  pid = fork();						 // 자식 프로세스 생성됨 (context복제됨)
  if (pid == 0)		// 자식일 때   			 // 여기서부터 자식 프로세스가 실행됨
      printf('\n Hello, I am child!\n');
  else if (pid > 0)     // 부모일 때
      printf('\n Hello, I am parent!\n');
}

자식 프로세스는 fork( ) 함수 이후부터 실행.

자식 프로세스의 결과=> Hello, I am child!

부모 프로세스의 결과=> Hello!
Hello, I am parent!

  • 문제점
    • 복제본(자식)이 본인을 원본이라 주장, 부모를 복제본 취급
    • 세상 모든 프로세스가 동일한 흐름을 따름
  • 해결방안 (fork의 return 값을 다르게 설정)
    • 부모 return 값을 > 0, 자식 return 값을 = 1로 설정.

exec( ) 시스템 콜

: 프로세스는 exec( ) 시스템 콜에 의해 다른 프로그램을 수행할 수 있다. 완전 새로운 프로그램(갓난아기)으로 덮어 씌워짐. 한 번 exec 하면 되돌아와 다음 함수를 실행할 수 없다. (exec 이후의 코드는 영원히 실행 불가)


wait( ) 시스템 콜

(자식과 경쟁하지 않는 모델에서 사용됨)

: 프로세스 A가 wait( ) 시스템 콜을 호출하면, (보통 자식 프로세스를 만들고 wait)

  • 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다. (block 상태)
  • childe 프로세스가 종료되면, 커널은 프로세스 A를 깨운다. (ready 상태)


exit( ) 시스템 콜

: 프로세스의 종료

  • 자발적 종료
    • 마지막 statement 수행 후, exit( ) 시스템 콜을 통해 종료
    • 프로그램에 명시적으로 적어주지 않아도, main 함수가 return되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료 (부모/사람이)
    • 부모 프로세스가 자식 프로세스를 강제 종료시킴
    • 사람이 키보드로 kill, break 등을 친 경우
    • 부모가 종료되는 경우에는 부모 종료 전, 자식들이 먼저 종료됨

프로세스 간 협력

  • 독립적 프로세스 (Independent process)

    : 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 않는다.

  • 협력 프로세스 (Cooperating process)

    : 프로세스 협력 매커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미친다.

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

: 프로세스간 정보를 주고 받는 매커니즘

  • message passing : 커널을 통해 메시지 전달

  • shared memory : 서로 다른 프로세스 간에도 (물리적 메모리에 매핑할 때) 일부 주소 공간을 공유하게 하는 shared 메모리 매커니즘이 있음 (신뢰할 수 있는 프로세스끼리 사용한다. 처음에는 커널이 공간을 만들어 주고, 이후에는 자기들끼리 점잖게..)

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


-Interprocess Communication


-Message Passing

  • message system : 프로세스 사이에 공유변수를 일체 사용하지 않고, 커널을 통해 통신하는 시스템.

    • Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시

    • Indirect Communication : Mailbox(또는 port)를 통해 메시지를 간접 전달 (아무나에게 보낼 수 있음)


참고 : 반효경 교수님의 운영체제 강의를 듣고 학습, 정리한 내용입니다.
profile
울보 개발자(멍.. 하고 울어요)

0개의 댓글