프로세스의 생성과 종료

Woosung Kim·2022년 1월 10일

프로세스의 생성

부모 프로세스(Parent process)에서 fork() 실행을 통해 자식 프로세스(Child process)를 생성하며, 이는 트리 구조(Process tree)를 형성한다.

fork()

fork()는 현재 실행 중인 프로세스를 복사하여 다른 프로세스를 생성하는 시스템 콜이다.

#include <stdio.h>

int main() {
  // 프로세스 번호 (Process ID; PID)가 저장될 변수 pid
  pid_t pid;

  // 자식 프로세스를 생성한다.
  // 성공시 0, 실패시 -1, 부모 프로세스이면 양수 (프로세스 ID)를 반환한다.
  pid = fork();

  if (pid < 0) {
    // pid 가 음수이면 에러가 난 것이다.

    fprintf(stderr, "fork failed!");
    return -1;

  } else if (pid == 0) {
    // pid 가 0 이면 자식 프로세스이다.
    // 자식 프로세스가 해야 할 일을 선언한다.

    printf("자식 프로세스 (# %i)", getpid());

  } else {
    // pid 가 양수이면 부모 프로세스이다.
    // 부모 프로세스가 해야 할 일을 선언한다.

    printf("부모 프로세스 (# %i)", getpid());

    // 자식 프로세스들이 모두 종료될 때 까지 기다린다.
    wait(&status);

  }
  return 0;
}
  • 자식 프로세스 : fork로 자식프로세스를 만든 상태. 부모의 데이터,힙,스택, PCB 복사
  • 좀비 프로세스 : 프로세스가 종료됐는데 메모리상에 정보가 남아있는 상태, 부모가 wait로 보고받지 못함
  • 고아 프로세스 : 부모 프로세스가 먼저 종료돼서 부모 프로세스를 잃은 프로세스, init이 자식프로세스 회수함

exec()

fork()가 새로운 프로세스를 복사하는 기능이라면, exec()는 프로세스는 그대로 둔 채 내용만 바꾸는 기능이다.

fork() vs exec()

fork()는 새로운 프로세스를 위한 메모리를 할당하지만 exec()은 메모리를 할당하지 않고, exec()에 의해 호출된 프로세스만 메모리에 남게된다.
결과적으로 fork()는 프로세스가 하나 더 생기는 것이고, exec()는 생성되는 새로운 프로세스는 없고, PID가 그대로 새로운 프로세스에 적용되며, 호출한 프로세스가 새로운 프로세스에 의해 덮어 쓰여지게 된다.

profile
개발하는 강아지

0개의 댓글