IT 프로그래밍/운영체제

[FT] [운영체제] 프로세스의 생성과 삭제

기술1 2025. 3. 28. 22:42

프로세스의 상태

운영체제에서 프로세스(Process) 는 실행 중 여러 가지 상태(state) 를 가집니다. 대표적인 상태는 다음과 같습니다.


1. 프로세스의 주요 상태

상태설명
생성 상태 (New) 프로세스가 생성되어 PCB가 할당 된 상태
준비 상태 (Ready) 실행 가능한 상태이지만 CPU를 할당받지 못한 상태
실행 상태 (Running) CPU를 할당받아 실행 중 인 상태
대기 상태 (Waiting, Blocked) 입출력 작업 등 특정 이벤트를 기다리는 상태
종료 상태 (Terminated) 실행이 끝나 PCB가 폐기되고 자원이 반환된 상태

2. 프로세스 상태 전이 (State Transition)

  • 준비 → 실행: CPU를 할당받으면 실행 상태로 전환
  • 실행 → 준비: 타이머 인터럽트 발생 시 다시 준비 상태로 이동
  • 실행 → 대기: 입출력 요청 등으로 실행이 불가능해지면 대기 상태로 이동
  • 대기 → 준비: 대기 중이던 이벤트가 완료되면 다시 준비 상태로 전환
  • 실행 → 종료: 프로세스가 정상 종료되거나 강제 종료될 경우 종료 상태로 이동

3. 프로세스 계층 구조

운영체제에서는 프로세스가 계층적으로 관리 됩니다.
Linux, Unix, macOS 등 대부분의 OS에서 프로세스는 트리(tree) 구조 를 형성하며 부모-자식 관계를 가집니다.

  1. 최초의 프로세스 (Init 또는 systemd)
    • 운영체제가 부팅되면 최초의 프로세스(예: init 또는 systemd)가 실행됩니다.
    • 이후 다른 프로세스를 생성하며, 생성된 프로세스는 부모 프로세스의 자식 프로세스 가 됩니다.
  2. 프로세스 생성 방식
    • fork(): 기존 프로세스를 복제하여 새로운 프로세스(자식 프로세스)를 생성
    • exec(): 기존 프로세스를 새로운 프로그램으로 대체하여 실행

이와 같은 방식으로 운영체제 내에서 프로세스들이 계층적으로 생성되고 관리 됩니다.

 

fork()와 exec() 시스템 콜

운영체제에서 새로운 프로세스를 생성하고 실행하는 방식 으로 fork()와 exec() 시스템 콜이 사용됩니다.


1. fork() - 프로세스 복제

fork()는 부모 프로세스를 복제하여 자식 프로세스를 생성 하는 시스템 콜입니다.

특징

  • 부모 프로세스와 거의 동일한 자식 프로세스 가 생성됨
  • 메모리(코드, 데이터, 힙, 스택)를 복제 하지만 PID(프로세스 ID)는 다름
  • 새로운 프로세스가 병렬로 실행됨 (독립적인 실행 흐름)

동작 방식

  1. 부모 프로세스가 fork()를 호출
  2. 자식 프로세스가 생성됨 (부모 프로세스의 복사본)
  3. 자식 프로세스는 부모 프로세스의 이후 코드부터 실행
  4. 부모와 자식은 개별적으로 실행되며, 각자 PID를 가짐

. exec() - 새로운 프로그램 실행

exec()는 기존 프로세스의 메모리를 새로운 프로그램으로 덮어쓰기 하는 시스템 콜입니다.
즉, exec()를 호출하면 기존 코드가 사라지고 새로운 프로그램이 실행됩니다.

특징

  • exec()가 실행되면 현재 프로세스의 코드, 데이터, 힙, 스택이 새로운 프로그램으로 변경
  • PID는 유지되지만, 실행 중이던 프로그램은 사라짐

동작 방식

  1. 부모 프로세스가 fork()를 호출하여 자식 프로세스를 생성
  2. 자식 프로세스에서 exec()를 호출하여 새로운 프로그램을 실행
  3. 기존 프로세스의 코드가 새로운 프로그램으로 대체됨

3. fork()와 exec() 비교

시스템 콜동작 방식메모리 공유PID 변경 여부사용 목적
fork() 부모 프로세스를 복제하여 자식 프로세스 생성 코드, 데이터, 힙, 스택 복제됨 새로운 PID 할당 새로운 프로세스 생성
exec() 기존 프로세스를 새로운 프로그램으로 대체 기존 메모리 삭제, 새로운 코드 로드 PID 유지 새로운 프로그램 실행

 


4. fork()와 exec()의 조합

  • 일반적으로 fork()로 자식 프로세스를 만든 후, 자식 프로세스에서 exec()를 호출 하여 새로운 프로그램을 실행하는 방식이 사용됨.
  • 이를 통해 부모 프로세스는 그대로 유지 되고, 자식 프로세스만 새로운 프로그램을 실행 가능