프로세스와 스레드의 차이점

운영체제에서 실행 중인 프로그램을 프로세스라고 하며, 시스템 자원을 할당받는 기본 단위입니다. 반면 스레드는 프로세스 내에서 실제로 작업을 수행하는 독립적인 실행 흐름으로, CPU 스케줄링의 대상이 됩니다.

하나의 응용 프로그램은 최소한 하나의 프로세스로 구성되며, 각 프로세스는 적어도 하나 이상의 스레드를 포함합니다.

동시에 여러 작업을 처리하기 위한 방법에는 멀티프로세싱과 멀티스레딩, 그리고 I/O 멀티플렉싱 등이 있습니다. 특히 네트워크 서버와 같은 환경에서는 다수의 클라이언트 요청을 동시에 처리해야 하므로 병행 처리 기법이 필수적입니다.

멀티프로세스 방식

프로세스는 CPU 시간, 메모리 등의 자원을 할당받는 최소 단위입니다. 프로그램이 시작되면 운영체제는 해당 프로세스를 위해 필요한 자원을 할당하고 준비 큐에 추가합니다. 스케줄러가 이 프로세스를 선택하면 실제 실행이 시작됩니다.

리눅스 환경에서는 fork() 시스템 호출을 통해 부모 프로세스로부터 새로운 자식 프로세스를 생성할 수 있습니다. 이를 활용하면 들어오는 요청마다 새 프로세스를 만들어 병렬로 처리하면서 부모 프로세스는 계속해서 새로운 연결을 감시할 수 있습니다.

import os

print(f"부모 프로세스 ID: {os.getpid()} - 시작 중...")
child_pid = os.fork()

if child_pid == 0:
    print(f"자식 프로세스 ID: {os.getpid()}, 부모 프로세스 ID: {os.getppid()}")
else:
    print(f"프로세스 {os.getpid()}가 자식 프로세스 {child_pid}를 생성했습니다")

위 코드의 출력 예시:

부모 프로세스 ID: 27223 - 시작 중...
프로세스 27223가 자식 프로세스 27224를 생성했습니다
자식 프로세스 ID: 27224, 부모 프로세스 ID: 27223

fork() 함수는 두 번 반환됩니다. 자식 프로세스에서는 0을 반환하고, 부모 프로세스에서는 새로 생성된 자식의 PID 값을 반환합니다. 운영체제는 부모 프로세스의 데이터를 복사하여 두 개의 분리된 실행 경로를 만듭니다.

멀티스레딩 방식

스레드는 프로세스 내에서 작업을 수행하는 가장 작은 단위로, 동일한 프로세스 내의 다른 스레드들과 메모리 공간을 공유합니다. 따라서 스레드 간 통신이나 데이터 공유가 매우 효율적이지만, 동기화 문제에 주의해야 합니다.

CPU가 스레드를 개별적으로 스케줄링하므로 다중 코어 시스템에서는 여러 스레드가 동시에 실행될 수 있어 성능 향상을 기대할 수 있습니다.

프로세스와 스레드 비교

  • 자원 관리 단위: 프로세스는 독립된 메모리 공간을 가지며 자원 할당의 기본 단위입니다. 스레드는 프로세스 내부에서 실행되는 단위로 동일한 메모리 공간을 공유합니다.
  • 생성 비용: 새로운 프로세스를 생성하는 것은 상대적으로 많은 비용이 듭니다. 반면 스레드 생성은 가볍고 빠릅니다.
  • 컨텍스트 전환 오버헤드: 프로세스 간 전환은 모든 상태 정보를 저장/복구해야 해서 비용이 크지만, 스레드 간 전환은 공유 자원이 많아 상대적으로 저렴합니다.
  • 통신 방식: 동일 프로세스 내 스레드들은 전역 변수 등을 직접 접근 가능하지만, 프로세스 간 통신(IPC)은 특별한 메커니즘이 필요합니다.
  • 안정성: 한 스레드에 문제가 생기면 전체 프로세스가 영향을 받지만, 프로세스 간에는 서로 격리되어 있어 안정성이 더 높습니다.

Unix 네트워크 프로그래밍 서적에서는 다음과 같이 설명하고 있습니다:

"fork는 고비용 작업입니다. 메모리가 부모에서 자식으로 복사되고 모든 디스크립터가 자식에게 복제됩니다. 현재 구현에서는 copy-on-write라는 기술을 사용해 자식이 자신의 사본이 필요할 때까지 부모의 데이터 공간을 복사하지 않도록 최적화하고 있지만, 이러한 최적화에도 불구하고 fork는 여전히 비쌉니다."

장단점 요약

특징 스레드 프로세스
실행 오버헤드 낮음 높음
자원 관리 공유로 인한 제약 있음 완전한 분리 및 보호
통신 용이성 공유 메모리를 통한 쉬운 통신 IPC 메커니즘 필요
안정성 하나의 실패가 전체에 영향 독립적인 실패 처리
적합 환경 SMP(대칭형 멀티프로세서) 분산 또는 고신뢰성 요구사항

사용 가이드라인:

  • 자원 보호와 관리가 중요하고 성능보다 안정성이 우선이라면 멀티프로세스 방식을 선택하세요.
  • 빠른 응답 속도와 효율적인 자원 활용이 중요하며 자주 컨텍스트 스위칭이 발생한다면 멀티스레딩이 적합합니다.

태그: Process Thread multiprocessing Multithreading operating-system

7월 18일 23:15에 게시됨