💻
프로그래밍
동시성
Concurrency
여러 작업을 동시에 처리하는 개념. 병렬성과 달리 논리적 동시 실행. 스레드, 코루틴으로 구현.
Concurrency
여러 작업을 동시에 처리하는 개념. 병렬성과 달리 논리적 동시 실행. 스레드, 코루틴으로 구현.
동시성(Concurrency)은 여러 작업이 논리적으로 동시에 진행되는 것처럼 보이게 하는 프로그래밍 개념입니다. 병렬성(Parallelism)이 물리적으로 동시에 여러 작업을 실행하는 것이라면, 동시성은 작업들 사이를 빠르게 전환하며 동시 진행하는 것처럼 처리합니다.
단일 코어 CPU에서도 동시성은 가능합니다. 운영체제의 스케줄러가 여러 프로세스나 스레드를 빠르게 전환하며 실행하기 때문입니다. 이를 통해 I/O 대기 시간 동안 다른 작업을 처리할 수 있어 전체 시스템 효율이 높아집니다.
동시성 프로그래밍의 주요 도전은 공유 자원에 대한 안전한 접근입니다. 레이스 컨디션, 데드락, 라이브락 같은 문제를 피하기 위해 뮤텍스, 세마포어, 모니터 같은 동기화 기법을 사용합니다. 최근에는 액터 모델이나 CSP(Communicating Sequential Processes) 같은 패러다임도 인기입니다.
각 언어는 다양한 동시성 모델을 제공합니다. JavaScript는 이벤트 루프와 async/await, Go는 고루틴과 채널, Rust는 소유권 기반의 안전한 동시성, Java는 스레드와 CompletableFuture를 사용합니다.
import asyncio
import threading
import time
# 동시성 vs 순차 실행 비교
# 순차 실행 (느림)
def sequential_io():
for i in range(3):
time.sleep(1) # I/O 시뮬레이션
print(f"순차 작업 {i} 완료")
# 동시성: asyncio (단일 스레드, 협력적 멀티태스킹)
async def async_task(name, delay):
await asyncio.sleep(delay)
print(f"비동기 작업 {name} 완료")
return name
async def concurrent_io():
tasks = [
async_task("A", 1),
async_task("B", 1),
async_task("C", 1)
]
results = await asyncio.gather(*tasks) # 동시 실행
return results
# 동시성: 스레딩 (I/O 바운드 작업에 적합)
def threaded_task(name, delay):
time.sleep(delay)
print(f"스레드 작업 {name} 완료")
def concurrent_threads():
threads = [
threading.Thread(target=threaded_task, args=(f"T{i}", 1))
for i in range(3)
]
for t in threads:
t.start()
for t in threads:
t.join()
# 실행 비교
print("=== 순차 실행 ===")
start = time.time()
sequential_io()
print(f"소요 시간: {time.time() - start:.2f}초") # ~3초
print("\n=== 비동기 동시 실행 ===")
start = time.time()
asyncio.run(concurrent_io())
print(f"소요 시간: {time.time() - start:.2f}초") # ~1초