프로그램 vs 프로세스
프로그램
- 정의: 컴퓨터가 실행할 수 있도록 작성된 명령어들의 집합입니다.
- 특징: 실행 전의 정적인 코드와 리소스 모음으로, 파일 형태로 존재합니다.
프로세스
- 정의: 실행 중인 프로그램으로, 실제로 CPU와 메모리 등의 자원을 할당받아 동작합니다.
- 특징: 각 프로세스는 자신만의 독립적인 메모리 공간을 가지며, 프로그램의 실행 상태를 나타냅니다.
단일 프로세스 시스템 (Single Process System)
초기 컴퓨터 시스템에서는 한 번에 하나의 프로그램만 실행되었습니다.
예를 들어, 웹 서핑 도중 파일을 다운로드하면 다운로드가 완료될 때까지 다른 작업(웹 서핑 등)을 할 수 없었습니다.
이처럼 단일 프로세스 시스템은 작업의 동시 수행에 한계가 있었습니다.
멀티프로그래밍 (Multiprogramming)
단일 프로세스의 한계를 극복하기 위해 등장한 개념이 멀티프로그래밍입니다.
- 개념: 여러 프로그램을 동시에 메모리에 올려놓고, 한 프로세스가 입출력(I/O) 작업으로 대기하는 동안 다른 프로세스가 CPU를 사용할 수 있도록 하는 방식입니다.
- 장점: 자원의 효율적 활용으로 CPU가 대기 시간 없이 사용될 수 있습니다.
- 한계: 다운로드처럼 시간이 오래 걸리는 작업의 경우, 다른 작업이 실행되는 데 여전히 제한이 있었습니다.
멀티태스킹 (Multitasking)
멀티프로그래밍의 한계를 더욱 발전시킨 개념이 바로 멀티태스킹입니다.
- 개념: 여러 프로세스가 짧은 시간 단위(일반적으로 10ms~100ms)로 번갈아가며 CPU를 사용해 실행되는 방식입니다.
- 원리: 각 프로세스가 매우 짧은 시간 동안 실행되므로, 사용자에게는 동시에 여러 작업이 실행되는 것처럼 보입니다.
- 비유: 밥을 먹으면서 동시에 TV를 보는 상황처럼, 한순간에는 밥을 먹고 다음 순간에는 TV를 보는 방식으로 빠르게 작업이 전환됩니다.
단점:
- 단일 프로세스 내 동시 작업 불가: 한 프로세스는 여전히 한 번에 하나의 작업만 수행합니다.
- 컨텍스트 스위칭 비용: 프로세스 간 전환에는 많은 오버헤드가 발생하며, 데이터 공유가 까다롭습니다.
5. 듀얼 코어와 스레드의 등장
하드웨어 발전: 듀얼 코어 및 멀티 코어 시스템
최근 컴퓨터는 듀얼 코어 이상의 멀티 코어 프로세서를 탑재하게 되었습니다.
즉, 동시에 여러 작업을 병렬로 수행할 수 있는 환경이 마련되었습니다.
스레드란?
이러한 하드웨어 발전과 함께, 스레드라는 개념이 등장하였습니다.
스레드는 기존 프로세스의 단점을 보완하며, 한 프로세스 내에서 보다 효율적으로 여러 작업을 처리할 수 있게 해줍니다.
스레드의 주요 특징
- 경량 실행 단위:
한 프로세스는 여러 개의 스레드를 가질 수 있으며, 각 스레드는 CPU에서 실행되는 최소 단위입니다.
- 메모리 공간 공유:
동일 프로세스 내의 스레드들은 같은 힙 메모리 등 공유 가능한 자원을 사용합니다.
→ 이로 인해 데이터 교환이 용이하지만, 동기화(synchronization)에 주의해야 합니다.
- 빠른 컨텍스트 스위칭:
스레드 간 전환은 프로세스 간 전환보다 오버헤드가 적어 빠르게 이루어집니다.
- 병렬 처리:
듀얼 코어 이상의 시스템에서는 각 코어에 스레드를 배분해 실제로 동시에 여러 작업을 수행할 수 있습니다.

이미지 출처: Slideplayer
GIL (Global Interpreter Lock) 주의
-
개념:
GIL은 파이썬에만 존재하는 독특한 개념으로, 멀티스레딩 환경에서 다수의 스레드가 동시에 파이썬 바이트 코드를 실행하지 못하게 막는 일종의 뮤텍스(Mutex)입니다.
-
역할:
파이썬 프로세스는 한 시점에 한 스레드에만 모든 자원을 할당하여 실행하도록 제한하며, 다른 스레드는 접근할 수 없게 만듭니다.
-
영향:
- 장점: 내부 자료구조의 동시 접근 문제를 간단하게 해결합니다.
- 단점: CPU 집약적 작업에서는 멀티 코어 활용에 제한이 있어 성능 이점을 보기 어렵습니다.
-
해결 방법:
CPU 바운드 작업에는 멀티프로세싱을 사용하거나, GIL이 없는 다른 인터프리터(PyPy 등)를 고려할 수 있습니다.
GIL은 파이썬의 내부 동기화 문제를 해결하는 데 도움을 주지만, 멀티스레딩을 통한 병렬 처리에서는 큰 이점을 제공하지 않습니다.
이번 게시글에서는 스레드의 탄생 배경을 알아보았습니다. 다음 게시글에서는 Python에서 스레드를 사용하는 방법에 대해 정리하겠습니다.