병행 프로세싱에서 동시성과 동기화를 설계하는 법
병행성과 병렬성의 차이부터 경쟁 조건, 교착상태, 동기화 메커니즘과 병행 프로그래밍 모델의 선택 기준을 정리한다.
2026-08-14 · 최초 발행 2026-01-04
작업이 함께 진행되는 방식과 실제 동시 실행은 다르다
병행성(Concurrency)은 여러 작업이 동시에 진행되는 것처럼 보이게 하는 특성이다. 단일 CPU에서도 작업을 번갈아 실행하면 논리적인 동시성을 만들 수 있다. 이를 Interleaved Execution이라 하며, 시간 분할이 그 기반이다.
병렬성(Parallelism)은 여러 작업이 물리적으로 같은 시점에 실행되는 상태를 뜻한다. 다중 CPU 또는 다중 코어 환경에서 가능한 Overlapped Execution이 여기에 해당한다.
병행 처리는 하드웨어부터 애플리케이션까지 여러 계층에서 구현된다. 하드웨어에서는 다중 코어, 하이퍼스레딩, SIMD 명령어가 기반이 된다. 운영체제는 프로세스 스케줄링, 컨텍스트 스위칭, 인터럽트 처리를 맡고, 언어는 쓰레드·코루틴·async/await·액터 모델을 제공한다. 애플리케이션에서는 멀티쓰레딩, 이벤트 루프, 워커 풀로 이를 조합한다.
독립적으로 실행되던 작업이 공유 자원에서 만날 때
독립 프로세스는 다른 프로세스의 실행에 영향을 주지 않는다. 반면 협력 프로세스는 공유 자원에 접근하면서 상호작용한다. 이 지점에서 실행 순서에 따라 결과가 달라지는 경쟁 조건(Race Condition)과, 같은 입력에서도 결과가 달라질 수 있는 비결정성(Non-determinism)이 나타난다.
단일 CPU의 시분할 실행은 다음처럼 작업이 교차한다.
Process A: ====A==== ====A==== ====A====
Process B: ====B==== ====B==== ====B====
Time: |----|----|----|----|----|----|---->
다중 CPU에서는 각 프로세스가 실제로 함께 실행될 수 있다.
CPU 1 - Process A: ==============A==============
CPU 2 - Process B: ==============B==============
Time: |--------------|------------>
프로세스는 CPU를 점유한 실행(Running), CPU 할당을 기다리는 준비(Ready), I/O나 이벤트를 기다리는 대기(Waiting/Blocked) 상태를 오간다. 스케줄러의 결정, 인터럽트, 시스템 콜이 상태 전이의 계기가 된다.
공유 자원을 안전하게 다루지 못할 때 생기는 문제
동시 갱신에서는 일부 변경사항이 사라지는 Lost Update가 발생할 수 있다. Dirty Read는 커밋되지 않은 데이터를 읽는 경우이며, Non-repeatable Read는 같은 데이터를 다시 조회했을 때 값이 바뀌는 현상이다. 트랜잭션 중 레코드가 삽입되거나 삭제되어 조회 결과가 달라지면 Phantom Read가 된다.
교착상태(Deadlock)는 다음 조건이 맞물릴 때 발생한다.
- 상호배제(Mutual Exclusion): 자원을 배타적으로 사용한다.
- 점유와 대기(Hold and Wait): 자원을 보유한 채 추가 자원을 기다린다.
- 비선점(No Preemption): 자원을 강제로 회수할 수 없다.
- 순환 대기(Circular Wait): 자원 대기 그래프에 사이클이 존재한다.
기아상태(Starvation)도 별도로 살펴야 한다. 낮은 우선순위 프로세스가 고우선순위 프로세스를 막는 우선순위 역전, 특정 프로세스가 계속 자원을 얻지 못하는 무한 대기, 일부 프로세스만 계속 선택되는 불공정 스케줄링이 여기에 포함된다. 두 프로세스가 서로에게 양보하느라 진행하지 못하는 Livelock도 발생할 수 있다.
원자적 연산과 동기화 도구의 역할
하드웨어는 공유 자원 접근을 제어하기 위한 원자적 연산을 제공한다.
| 메커니즘 | 설명 | 특징 |
|---|---|---|
| Test-and-Set | 원자적 읽기/쓰기 | 가장 기본적인 동기화 명령어 |
| Compare-and-Swap | 조건부 원자적 갱신 | Lock-free 자료구조 기반 |
| Fetch-and-Add | 원자적 증가 연산 | 카운터 구현에 유용 |
| Load-Link/Store-Conditional | RISC 아키텍처 지원 | ABA 문제 해결 |
| Memory Barrier | 메모리 순서 보장 | 최적화 제어 |
소프트웨어 수준에서는 Semaphore, Mutex, Monitor, Spinlock을 사용한다. Semaphore는 P/V 연산을 쓰는 카운팅 기반 동기화 도구다. Mutex는 소유권 개념을 갖는 이진 세마포어이며, Monitor는 조건 변수를 포함하는 고수준 동기화 방식이다. Spinlock은 Busy-waiting을 사용하므로 짧은 임계 영역에 적합하다.
Peterson's Algorithm은 하드웨어 지원 없이 상호배제를 구현하는 소프트웨어 전용 알고리즘이다. 2-프로세스에 한정되어 확장성 제약이 있고, 현대 CPU에서는 메모리 순서 문제 때문에 메모리 배리어가 필요하다. 다만 동기화 원리를 이해하는 데 학술적 가치가 있다.
데이터 공유 방식이 프로그래밍 모델을 가른다
공유 메모리 모델은 POSIX Threads, Windows Threads, Java Threads처럼 쓰레드를 기반으로 한다. 단일 머신 내부 병렬 처리에 적용하며, 통신 오버헤드는 낮지만 Lock·Mutex·Semaphore에 따른 동기화 비용을 고려해야 한다.
메시지 패싱 모델은 MPI, ZeroMQ, gRPC처럼 프로세스 사이에서 데이터를 복사해 전달한다. 공유 상태를 두지 않으므로 분산 시스템, 클러스터, 분산 컴퓨팅에 적합하다.
액터 모델은 비동기 메시지 전달과 격리된 상태 관리를 바탕으로 한다. Erlang, Akka, Orleans가 구현 예이며, 데드락 없이 높은 확장성을 얻을 수 있다.
동일 연산을 반복하는 데이터 병렬 모델은 SIMD, GPU 컴퓨팅, MapReduce를 활용한다. 컴파일러의 자동 벡터화와 함께 과학 계산, 빅데이터 분석에 적용된다.
병렬화 전에 확인할 성능 제약
Amdahl's Law는 병렬화 가능한 비율을 P, 프로세서 수를 N으로 둘 때 성능 향상을 다음과 같이 표현한다.
Speedup = 1 / [(1-P) + P/N]
순차적으로 처리해야 하는 부분은 전체 성능의 제약으로 남는다. 따라서 병렬화의 한계를 예측할 때 이 비율을 먼저 확인해야 한다.
실행 과정에서는 Context Switching 비용, Lock 획득과 해제에 드는 동기화 비용, 멀티코어 간 캐시 일관성, 같은 캐시 라인의 다른 변수가 경쟁하는 False Sharing도 성능을 떨어뜨린다. 데이터나 태스크 단위로 작업을 분할하고, 동적·정적 작업 배분으로 부하를 균형 있게 맞추며, 캐시 친화적인 접근 패턴을 유지하는 방식이 필요하다. CAS 기반 비차단 자료구조를 사용하는 Lock-free 알고리즘도 선택지다.
운영체제부터 데이터베이스까지 이어지는 병행 처리
운영체제에서는 Linux Kernel의 SMP 지원과 RCU(Read-Copy-Update) 동기화, Windows의 IOCP(I/O Completion Port)와 User-Mode Scheduling, macOS의 Grand Central Dispatch(GCD)와 NSOperation, RTOS의 우선순위 기반 선점형 스케줄링이 병행 처리와 연결된다.
애플리케이션 프레임워크는 Java의 Executor Framework·Fork/Join Pool·CompletableFuture, Python의 multiprocessing·asyncio·concurrent.futures, C++의 std::thread·std::async·OpenMP·TBB, Go의 Goroutine과 Channel 기반 CSP 모델처럼 서로 다른 실행 방식을 제공한다.
데이터베이스에서는 PostgreSQL과 Oracle의 MVCC(Multi-Version Concurrency Control), 버전 번호로 충돌을 감지하는 Optimistic Locking, 2PL(Two-Phase Locking)을 사용하는 Pessimistic Locking, Read Uncommitted ~ Serializable의 Isolation Level이 병행 접근의 일관성을 다룬다.