본문 바로가기
Computer Science/운영체제

[OS] fork()와 exec() (fork()와 exec() 비교, exit()과 abort() 비교, wait())

by 그적 2024. 2. 7.

 

목차

  • fork() 함수
  • exec() 함수
  • fork()와 exec() 비교
  • wait() 함수
  • exit() 함수와 abort() 함수

 


1. fork() 함수

fork() 함수는 호출한 부모 프로세스 데이터를 모두 복사해 새로운 프로세스를 생성하는 시스템 콜이다. 실행 중인 프로세스에 fork() 함수가 동작하게 된다면, 프로세스의 메모리를 모두 복사해 자식 프로세스를 생성한다. 자식 프로세스는 실행 중이던 부모 프로세스의 PC(Program Counter)부터 다음 명령을 수행한다.

 

(특징)

  • 새로운 프로세스가 생성되어 새로운 메모리 공간이 할당된다.
  • 실행 중이던 프로세스의 메모리를 복제한다.
  • 프로세스 종료 시 PID 값이 리턴되는데, 부모 프로세스 PID는 자식 프로세스의 PID(양수)를, 자식 프로세스의 PID는 0을 반환받는다. (PID 값이 -1이면, 에러가 발생했다는 의미이다.)

 

아래 사진에서 PID는 프로세스의 번호, PPID는 부모 프로세스의 번호이며, 각 프로세스당 PID와 PPID를 가진다.

 


2. exec() 함수

exec() 함수는 기존 프로세스 메모리를 덮어씌워 새로운 프로세스를 생성하는 시스템 콜이다. exec() 함수 인자에 있는 실행 파일을 읽어 실행시키며, exec() 실행 이후 기존 프로세스는 더 이상 동작하지 않는다.

 

(특징)

  • 기존 프로세스 메모리 공간에 새로운 프로세스가 생성된다.
  • 새로 생성된 프로세스는 기존 프로세스와 동일한 PID 값을 가진다.

 


3. fork()와 exec() 비교

  fork() exec()
공통점 새로운 프로세스 생성을 위한 시스템 콜이다.
차이점 (메모리) 새로운 메모리 공간이 할당된다. 기존 메모리 공간을 재사용한다.
차이점 (복제) 실행 중이던 프로세스의 메모리가 복제된다. 실행 중이던 프로세스의 메모리를 덮어씌운다.
차이점 (PID) 새로 생성된 프로세스(자식)의 PID 값은 0이다. 새로 생성된 프로세스의 PID 값은 기존과 동일하다.

 


4. wait() 함수

wait() 함수는 자식 프로세스가 종료되기를 기다리는 동안, 부모 프로세스가 blocked 된 상태로 기다리는 시스템 콜이다. 부모 프로세스는 대기 큐에 존재하고 있으며, 자식 프로세스가 종료되어야 레디 큐로 이동할 수 있다.

 


5. exit() 함수와 abort() 함수

exit() 함수는 자발적인 종료를 수행하는 시스템 콜이다. 프로세스가 마지막 명령을 수행한 후, 명령이 끝났음을 CPU에게 알리기 위해 exit() 함수를 실행한다. 만약 자식 프로세스일 경우에는 부모 프로세스에게 프로세스 종료를 알리는 역할을 한다.

 

abort() 함수는 비자발적인 종료를 수행하는 시스템 콜이다.

  • 첫째, 부모 프로세스가 자식 프로세스를 종료할 때
  • 둘째, 쉘 명령어인 kill이 수행될 때
  • 셋째, 부모 프로세스가 종료된 경우

위의 세 가지가 프로세스가 비자발적으로 종료되는 경우, 즉 abort() 시스템 콜이 발생하는 상황이다. 만약 부모 프로세스가 먼저 종료될 경우, PPID 값은 1로 설정된다.

 

댓글