[OS] Process Management

애이용·2021년 4월 15일
0

OS

목록 보기
3/16
post-custom-banner

프로세스 생성(Process Creation)

  • 부모 프로세스(Parent process)가 자식 프로세스(Children process)를 생성
  • 프로세스의 트리(계층 구조) 형성
  • 대부분의 운영체제는 프로세스를 식별할 때 pid로 구분한다. pid가 1인 init 프로세스가 루트 부모 프로세스 역할을 수행하고, 시스템이 부팅되면 init 프로세스는 다양한 사용자 프로세스를 생성한다.
  • 프로세스는 자원을 필요로 함
    • 운영체제로부터 받는다
    • 부모와 공유한다. 이때 초기화 자료를 부모 프로세스가 자식 프로세스로 넘겨줄 수 있다.
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델
  • 수행(Execution)
    • 부모와 자식은 공존하며 수행되는 모델
    • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델

과정 살펴보기


1. fork() 시스템 콜이 새로운 프로세스를 생성한다.
- 부모 프로세스의 주소 공간을 복사한다. (binary + OS data except PID) -> 부모와 자식 프로세스간 쉽게 통신 가능
2. fork() 시스템 호출 후, 둘 중 하나의 프로세스가 exec() 시스템 콜을 통해 자신의 메모리 공간을 새로운 프로그램으로 교체한다.
3. 자식 프로세스가 실행되는 동안 부모 프로세스가 할 일이 더이상 없으면 자식이 종료될 때까지 ready queue에서 자신을 제거하기 위해 wait() 시스템 콜을 한다. (block 상태)
4. 자식 프로세스가 종료(exit())되면 커널은 부모 프로세스를 깨운다. (ready 상태) 부모 프로세스 역시 exit()으로 종료한다.

시스템 콜 살펴보기

fork()

프로세스는 fork() 시스템 콜로 생성된다.

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의 리턴값 pid에 대해 알아보자.
부모 프로세스의 pid는 자식 프로세스의 식별자(PID)이다. -> pid > 0
자식 프로세스의 pid는 0이다. -> pid = 0

exec()

프로세스는 exec() 시스템 콜을 통해 다른 프로그램을 메모리에 올린다. (overwrite)

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");
}

gcc 컴파일러

gcc exec.c -o exec
./exec

출력 결과

 Hello, I am parent

 Hello, I am child
ayoung@~~ 운영체제 % 2021년 4월 16일 금요일 17시 50분 35초 KST

wait()

프로세스 A가 wait() 시스템 콜을 호출하면

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

exit()

  • 자발적 종료
    • 마지막 statement 수행 후, exit() 시스템 콜을 통해 종료
    • 프로그램에 명시적으로 작성하지 않아도, main 함수가 리턴되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제 종료
      • 자식 프로세스가 한계치를 넘어서는 자원을 요청하는 경우
      • 자식에게 할당된 태스크가 더이상 필요하지 않는 경우
    • 키보드로 kill, break 등을 친 경우
    • 부모가 종료하는 경우 : 부모 프로세스가 종료하기 전에 자식들이 먼저 종료

프로세스 간 협력

  • 독립적 프로세스(Independent process)
    프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 않는다.
  • 협력 프로세스(Cooperating process)
    프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스에 영향을 미칠 수 있다.

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

Message Passing

  • 커널 통해 메시지를 전달하는 방법
  • Message System : 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
  • Direct Communication(많이 사용)
    • 통신하려는 프로세스의 이름을 명시적으로 표시
    • Process P : Send(Q, message)
    • Process Q : Receive(P, message)
  • Indirect Communication
    • mailbox(또는 port)를 통해 메시지를 간접 전달
    • Mailbox M
      • Process P : Send(M, message)
      • Process Q : Receive(M, message)

주소 공간을 공유하는 방법

  • shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있다.
  • 만들어진 공유 메모리는 커널에 의해 관리된다.
  • 공유 메모리의 생성 요청은 최초 공유 메모리 영역을 만드는 프로세스가 커널에 공유 메모리 공간의 할당을 요청함으로써 이루어진다.
  • cf) thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들간에는 주소 공간을 공유하므로 협력이 가능하다. (굳이 msg나 shared memory를 쓰지 않아도 공유 가능하다.)

참고링크

profile
로그를 남기자 〰️
post-custom-banner

0개의 댓글