프로세스의 생성과 종료

Woosung Kim·2022년 1월 10일
0

프로세스의 생성

부모 프로세스(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개의 댓글