운영체제
[운영체제] 동시성 vs 병렬성
위시리
2025. 2. 7. 17:07
프로세스 & 스레드 / 동시성 & 병렬성
컴퓨터를 사용하다보면 유튜브를 보면서 워드 작업을 하면서 크롬으로 검색을 할 수 있다. 어떻게 컴퓨터는 이렇게 여러 가지 작업을 동시에 실행할 수 있는걸까?
컴퓨터는 여러 작업을 동시에 실행하기 위해 동시성(Concurrency) 과 병렬성(Parallelism) 개념을 활용하고 이를 구현하는 주요 방법은 프로세스(Process) 와 스레드(Thread) 를 사용하는 것이다. 운영체제(OS)는 CPU 스케줄링과 메모리 관리를 통해 이 과정을 조율한다.
동시성과 병렬성이 어떻게 이루어지는지 이해하려면 프로세스와 스레드의 차이를 먼저 알아야한다.
(추후 분리하여 정리 예정)
1️⃣ 프로세스와 스레드
✅ 프로세스(Process)
- 운영체제에서 실행 중인 하나의 프로그램 단위
- 운영체제에서 각 프로세스를 독립적인 단위로 관리하여 실행된다.
- 독립적인 단위 → 독립적인 메모리 공간(Code, Data, Heap, Stack)을 가진다.
- 멀티프로세스(Multiprocessing) 를 사용하면 여러 프로세스를 병렬로 실행 가능하다.
- 프로세스 간 통신(IPC, Inter-Process Communication)이 필요하므로 비용이 크다.
🔹 Ex
- 크롬 브라우저의 각 탭은 독립적인 프로세스로 실행됨 → 하나의 탭이 멈춰도 다른 탭에는 영향 없다.
✅ 스레드(Thread)
- 스레드는 프로세스 내부에서 실행되는 작은 실행 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 이 스레드들은 같은 메모리 공간을 공유하면서 실행된다.
- 멀티스레딩(Multithreading) 을 사용하면 하나의 프로세스 내에서 여러 작업을 동시 실행 가능하다.
- 스레드 간 동기화 문제(데드락, 레이스 컨디션) 가 발생할 수 있다.
🔹 Ex
- 게임에서 그래픽 렌더링 스레드와 물리 연산 스레드가 동시에 실행
- 웹 서버(Spring Boot, Node.js)에서 여러 요청을 처리하는 멀티스레딩 방식
프로세스와 스레드의 차이 정리
정의 | 실행 중인 프로그램 | 프로세스 내에서 실행되는 작업 단위 |
독립성 | 각 프로세스는 독립적인 메모리 공간을 가짐 | 같은 프로세스 내에서 메모리를 공유 |
통신 방식 | IPC(Inter-Process Communication) 필요 | 같은 프로세스 내에서는 공유 메모리 사용 |
문맥 전환 비용 | 높음 (각 프로세스는 개별적인 메모리 공간을 가짐) | 낮음 (스레드는 같은 메모리를 사용하기 때문에 빠름) |
병렬 실행 | 다중 CPU(Core)를 활용해 병렬 실행 가능 | 멀티스레딩을 사용해 동시성(Concurrency) 구현 가능 |
2️⃣ 동시성 vs 병렬성
✅ 동시성(Concurrency)
🔹 동시성의 원리
- 여러 작업(Task)이 겉으로 보기에는 동시에 실행되는 것처럼 보이는 개념
- 하지만 실제로는 하나의 CPU 코어에서 작업들이 빠르게 번갈아가며 실행되는 중이다.
- 시간을 쪼개어 실행됨 → 논리적으로 동시에 실행되는 것처럼 보인다.
- CPU가 하나인 경우에도 빠른 문맥 교환(Context Switching) 을 통해 여러 작업을 수행하는 것처럼 동작한다.
- 주요 기법: 멀티태스킹(Multitasking), 비동기 프로그래밍(Async/Await), 코루틴(Coroutine)
🔹 독립적인 프로세스
- 각 프로세스는 독립된 메모리 공간을 가지므로 하나의 프로세스가 죽어도 다른 프로세스에 영향을 주지 않는다.
- 예를 들어, 크롬 브라우저에서 여러 개의 탭을 각각 다른 프로세스로 실행하여, 하나의 탭이 크래시 나도 다른 탭이 영향을 받지 않는다.
🔹 스레드는 독립적이지 않음 !
- 같은 프로세스 내에서 실행되므로, 공유 메모리를 사용한다.
- 하나의 스레드가 오류로 인해 충돌하면, 같은 프로세스 내의 다른 스레드도 영향을 받을 수 있다.
- 예를 들어, 게임이 하나의 프로세스에서 실행될 때, 그래픽 렌더링 스레드가 크래시 나면 게임 전체가 다운될 수 있다.
📌 정리하면
- 프로세스는 독립적인 실행 단위라서 하나가 죽어도 다른 프로세스에 영향 x
- 스레드는 공유 메모리를 사용하므로 하나의 스레드 문제가 전체 프로세스에 영향을 줄 수 o
🔹 Ex
- 웹 서버가 여러 클라이언트 요청을 처리할 때, 하나의 요청이 DB 조회를 기다리는 동안 다른 요청을 먼저 처리하는 방식
✅ 병렬성(Parallelism)
🔹 병렬성의 원리
- 여러 작업(Task)이 실제로 동시에 실행되는 것 (실제로 동시에 실행)
- 다중 코어 CPU 또는 다중 프로세서 시스템에서 각 코어가 독립적으로 작업을 수행한다.
- → 여러 개의 프로세서가 각각 다른 작업을 동시에 수행
- 주요 기법: 멀티프로세싱(Multiprocessing), GPU 병렬 연산, 쓰레드 병렬 처리
🔹 프로세스 기반 병렬성
- 여러 개의 프로세스가 독립적으로 실행되고 각 프로세스는 서로 다른 CPU 코어에서 병렬로 실행될 수 있다.
- 서로 독립적인 메모리 공간을 가지므로 병렬 실행이 쉽지만, 통신 비용(IPC)이 큼.
- 예제: 웹 브라우저와 동영상 플레이어가 각각 실행되는 경우.
🔹 스레드 기반 병렬성
- 하나의 프로세스 내부에서 여러 스레드가 같은 메모리를 공유하면서 병렬로 실행됨.
- 스레드 간의 전환 비용은 적지만, 동기화 문제(경쟁 상태, 데드락 등)가 발생할 수 있음.
- 예제: 게임에서 그래픽 렌더링, 물리 연산, AI 연산이 각 스레드에서 동시에 실행됨
📌 정리하면
- 프로세스는 독립적인 실행 단위라서 하나가 죽어도 다른 프로세스에 영향이 없음.
- 스레드는 공유 메모리를 사용하므로 하나의 스레드 문제가 전체 프로세스에 영향을 줄 수 있음.
🔹 Ex
- AI 모델 학습 시 GPU에서 여러 행렬 연산을 동시에 수행
- 멀티코어 CPU가 여러 개의 스레드를 동시에 실행
🚀 병렬성과 독립성은 트레이드오프 관계에 있기 때문에, 상황에 따라 적절한 선택을 해야한다!
- 독립성이 중요한 경우 → 프로세스 사용
- 독립적인 실행이 필요할 때(예: 크롬 브라우저 탭)
- 빠른 병렬 실행이 필요한 경우 → 스레드 사용
- 공유 데이터를 빠르게 처리할 때(예: 게임, 웹 서버)