본문 바로가기
Computer Science/Operating System

프로세스 생성/종료

by Gofo 2021. 6. 17.

Instruction 실행

Instruction을 실행하는 것에는 크게 2가지 종류가 있다.

  • 프로세스 : OS scheduler가 scheduling하는 대상
  • 프로세스가 아니면서 instruction을 실행하는 것 : interrupt handler, scheduler

 


Process Creation

UNIX를 기준으로 새로운 프로세스를 생성하는 방법에는 2가지가 있다.

  • scatch로 부터 만들어내는 방법
    • 최초의 process(process 0) 생성
    • 예 : process 0를 생성
  • 기존에 존재하는 프로세스를 복제하는 방법
    • process 0를 복제
    • process 0 이후의 다른 프로세스들은 process 0를 복제해서 만들어진다.
    • 예 : fork() system call

 

Scratch로부터 프로세스를 만드는 방법

최초의 프로세스(process 0)는 scratch로부터 만들어진다.

 

  1. 프로세스의 address space를 만든다.
    1. memory로 code와 data를 load 한다.
      • 실행 파일을 disk에서 memory로 load 한다.
      • memory에 code 영역과 data 영역을 구분해서 load 한다.
      • memory에 올라오지 않은 것은 그저 instruction이고, memory에 올라와야 프로그램이라 한다.
    2. stack을 만든다.
      • stack : 임시 data를 저장하는 memory 영역
      • stack이 있어야지 함수를 실행할 수 있다.
  2. PCB(process control block) 만든다.
  3. 프로세스를 ready queue로 만든다.
    • ready queue에 넣는다.
    • 프로세스가 정상적으로 실행될 수 있도록 한다.
  4. scheduler가 reqdy queue에 대해서 scheduling한다.

 

기존에 존재하는 프로세스를 복제하는 방법

<pre>fork()</pre>를 통해서 기존의 프로세스를 복제해서 새로운 프로세스를 생성한다.

 

fork()는 parent process의 address space와 PCB를 복제해서 child process를 만든다.

따라서 PCB의 identifier를 제외하고 parent와 child process는 동일하다.

 

fork()의 실행이 끝나는 시점에는 2개의 프로세스가 존재한다.

fork()의 실행이 끝나는 시점부터 child process가 동작하게 된다.

때문에 child process와 parent process 모두 fork에 대한 return 값이 필요하다.

따라서 fork()의 실행이 성공하면 2개의 return value를 반환한다.

  • child process에게 0를 return 한다.
  • parent process에게 child process의 pid를 return 한다.

 

  1. fork()를 호출한 process(parent process)의 실행을 멈추고 state를 저장한다.
  2. address space와 PCB를 복제한다.
    • address space : code, data, stack
    • 이 단계부터는 실질적으로 프로세스가 생성되었다고 볼 수 있다.
  3. 만들어진 child process를 ready 상태로 바꾼다.
    • child process를 ready queue에 넣는다.
  4. scheduler가 reqdy queue에 대해서 scheduling한다.

 

fork(), exec()

fork()를 통해서 만들어진 child process는 parent process와 PCB identifier를 제외하고 동일하다.

exec()은 프로세스의 memory space를 새로운 프로그램으로 교체한다.

 

fork()를 한 후에 exec()을 하면 다른 프로그램을 실행하는 새로운 프로세스를 생성할 수 있다.

주로 exec()은 child process에 의해서만 실행을 한다.

 


Swapper and Init Process

UNIX는 부팅 시 3개의 프로세스를 생성한다.

만들어진 순서대로 process 0, 1, 2 라고 한다.

  • process 0
    • = swapper
    • scratch로 부터 만들어진다.
    • 모든 프로세스들의 ancestor이다.
      • 다른 모든 프로세스들은 process 0을 fork()를 해서 생성한다.
    • idle 할 때 동작하는 idle task의 역할도 한다.
      • idle : 실행할 일이 아무것도 없는 상황
  • process 1
    • = init
    • process 0를 fork()해서 만들어진다.
    • 모든 user process들의 ancestor이다.
      • 모든 user process들은 process 1을 fork() 해서 생성한다.
      • fork() 한 후 exec()을 함으로써 다른 프로그램을 실행할 수 있다.
  • process 2
    • = pagedaemon
    • 운영체제가 필요로 해서 만들어진 프로세스
    • memory의 free한 영역들을 관리한다.
      • maintains a pool of free memory

 


Process Termination

두 종류의 termination이 있다.

  • normal termination
    • 정상적으로 종료된 상황이다.
    • 프로세스가 자신이 실행해야 하는 모든 code를 실행하고 마친 경우이다.
  • abnormal termination
    • 프로세스가 자신이 실행해야 하는 모든 code를 실행하지 못한 경우이다.
    • 예시
      • 프로세스가 실행하다가 exception을 일으킨 경우
      • 제3의 프로세스로부터 SIGKILL signal을 받은 경우

'Computer Science > Operating System' 카테고리의 다른 글

Thread  (0) 2021.06.18
Cooperating Processes  (0) 2021.06.17
Process Scheduling (Context Switching)  (0) 2021.06.16
Process, PCB(Process Control Block)  (0) 2021.06.16
User Mode, Kernel Mode  (0) 2021.06.16

댓글