운영체제에서 Atomic Operation(원자적 연산) 은 더 이상 쪼갤 수 없는, 중간에 끼어들 수 없는 단일 연산 단위를 의미한다.
즉, 어떤 작업이 Atomic(원자적) 하다는 것은 실행 도중 인터럽트, 문맥 교환, 다른 스레드의 개입 없이 완전히 실행되거나 전혀 실행되지 않음을 보장한다.
🧠 모든 병렬 프로그래밍의 핵심 개념 중 하나이며, 동기화 문제를 방지하기 위한 기본 단위이다.
멀티스레드 환경이나 병렬 시스템에서는 여러 스레드가 공유 자원에 동시에 접근할 수 있다. 이 때 연산이 Atomic 하지 않다면, 다음과 같은 문제가 발생할 수 있다:
// 두 스레드가 같은 변수를 증가시키는 경우
x = x + 1; // 실제로는 아래 3단계로 나뉨
1. 레지스터에 x 읽기
2. +1 연산
3. x에 결과 저장
✅ 이 문제를 방지하기 위해 “Atomic Operation”을 사용해야 한다.
CPU 또는 OS는 기본적으로 몇 가지 원자적 연산을 하드웨어 또는 명령어 수준에서 제공한다.
bool CAS(int *addr, int expected, int new_val) {
if (*addr == expected) {
*addr = new_val;
return true;
}
return false;
}
LOCK prefix, xchg, cmpxchg#include <stdatomic.h>
atomic_int count = 0;
atomic_fetch_add(&count, 1);
stdatomic.h 를 통해 다양한 원자적 연산 제공__sync_fetch_and_add(&x, 1);
__sync_bool_compare_and_swap(&x, expected, new_val);
pthread_mutex 대신 일부 원자적 연산을 사용하여 락 없이 데이터 보호 가능| 항목 | Atomic Operation | Mutex / Lock |
|---|---|---|
| 동작 단위 | 아주 짧고 단순한 연산에 적합 | 임계 구역 전체 보호에 적합 |
| 성능 | 빠름 (락 오버헤드 없음) | 느릴 수 있음 (컨텍스트 스위칭 발생 가능) |
| 복잡도 | 간단한 연산만 처리 가능 | 복잡한 로직도 보호 가능 |
| 데드락 위험 | 없음 | 있음 |
| 사용 예 | 카운터 증가, 플래그 설정 등 | 공유 리스트, 큐, 트리 등 복잡한 구조 |
🚨 Atomic은 락의 대체재가 아니며, 작고 단순한 작업에 한해 효율적인 동기화 도구다.
Atomic하다고 해서 다 안전한 것은 아님
캐시 일관성 문제와 false sharing도 주의
멀티 CPU 환경에서는 메모리 배리어(Memory Barrier)나 volatile 키워드 사용 고려