| 개념 | 설명 |
|---|---|
| 동시성 (Concurrency) | 여러 작업이 동시에 진행되는 것처럼 보이게 만드는 것 (실제로는 하나씩 번갈아가며 처리) |
| 병렬성 (Parallelism) | 여러 작업이 물리적으로 동시에 수행되는 것 (멀티코어 CPU에서 실제 병렬 실행) |
[ 프로그램 실행 ]
↓
[ 여러 작업이 필요 ]
↓
┌────────────┬────────────┐
│ 동시성 │ 병렬성 │
│ (논리적 동시에)│ (물리적 동시에)│
└────────────┴────────────┘
↓
[ 공통적으로 쓰레드, 스케줄러, 버퍼 등 활용 ]
↓
[ 성능 향상 및 응답성 개선 ]
| 항목 | 동시성 | 병렬성 |
|---|---|---|
| 코어 수 | 1개 | 2개 이상 |
| 실행 방식 | 빠른 전환(context switching) | 진짜 동시에 실행 |
| 속도 | 느릴 수 있음 (전환 오버헤드 존재) | 더 빠름 (작업 분산) |
작업의 성격 (CPU-bound vs I/O-bound)
context switching 오버헤드
캐시 활용
즉, 병렬성은 상황에 따라 2배 ~ 10배 이상의 속도 차이를 만들 수 있어.
추상화란, 복잡한 시스템 내부 구현을 감추고, 사용자(혹은 개발자)가 간단한 인터페이스로만 다룰 수 있게 하는 것.
예:
Thread.start() 한 줄로 시작 가능.| 관계 요소 | 설명 |
|---|---|
| 병렬성은 복잡함 | 여러 스레드가 공유 자원을 다루면, 동기화 문제·데드락·레이스 컨디션 등 복잡성이 폭발해. |
| 추상화는 복잡성을 숨겨줌 | 병렬 시스템의 내부 구조를 감추고, 개발자가 쉽게 병렬 처리를 할 수 있도록 도와줘. |
| 추상화가 병렬성 도입을 쉽게 해줌 | 병렬 처리의 성능 이점을 누리되, 프로그래머가 직접 모든 걸 관리하지 않게 해 줘. |
| 병렬성 기술 | 추상화 계층 | 설명 |
|---|---|---|
pthread | 낮은 추상화 | 개발자가 직접 락, 동기화, 스케줄링 제어 |
Java ExecutorService, Python concurrent.futures | 중간 추상화 | 스레드 풀, 큐 등을 프레임워크가 관리 |
| GPU 병렬 처리 (e.g. CUDA) | 높은 추상화 도구 필요 | 쓰레드 수 천 개를 관리하는 건 복잡하므로, 추상화가 필수 |
| MapReduce / Spark | 아주 높은 추상화 | 병렬성을 거의 느끼지 않고 데이터 처리 가능 |
병렬성은 성능 향상을 가능하게 해주지만, 복잡성을 동반한다.
추상화는 이 복잡성을 감추고, 병렬성을 쉽게 활용할 수 있도록 만들어주는 수단이다.
| 문제 | 설명 |
|---|---|
| 세밀한 스레드 제어 불가 | 스레드 수, 바인딩, 스케줄링 우선순위 등을 튜닝할 수 없으면 성능 최적화가 어려워져. |
| 자원 할당의 비효율 | 내부 구현을 숨기면, CPU 코어나 메모리 사용이 비효율적으로 돌아가도 알아채기 어려움. |
| 병목 지점 분석 어려움 | 병렬 처리 중 어느 부분에서 병목이 생기는지 파악이 힘듦. |
| 병렬성 숨긴 구조로 인해 불필요한 동기화 비용 발생 | 추상화된 내부에서 락을 너무 과도하게 쓰면 오히려 병렬성이 병목이 되기도 해. |
MapReduce나 Spark 같은 고수준 추상화 프레임워크는 병렬 처리를 정말 쉽게 해줘.OpenMP, CUDA, pthread 같은 로우레벨은 복잡하지만 성능 튜닝 가능.병렬성 추상화는 항상 "균형" 이 중요해.
너무 낮으면 복잡하고, 너무 높으면 비효율적이야.
대부분의 프레임워크는 이 균형을 위해: