[Rust 공식문서 한국어 정리] ㊵. Rust 원자성과 락(Atomics and Locks) 가이드
[Rust 공식문서 한국어 정리] ㊵. Rust 원자성과 락(Atomics and Locks) 가이드
원문 제목: Atomics — Rust Standard Library
작성자: Rust Standard Library Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust에서 저수준 동시성 원시 타입인 원자성 변수(Atomics)와 락(Locks)을 사용하는 방법을 설명합니다.
std::sync::atomic의 Ordering, Mutex, RwLock, 그리고 메모리 순서 제약의 개념을 다룹니다.
Lock-free 프로그래밍의 기초와, Rust의 타입 시스템이 동시성 버그를 어떻게 방지하는지를 중심으로 설명합니다.
고성능 동시성 프로그램에서 메모리 가시성, 캐시 일관성, 레이스 컨디션을 제어하는 방법을 다룹니다.
멀티스레드 애플리케이션의 성능을 극대화하려는 시스템 프로그래머에게 필수적인 내용입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Atomic Types: AtomicUsize, AtomicBool 등으로 원자적 읽기/쓰기/연산을 수행합니다.
② Ordering: Relaxed, Acquire, Release, AcqRel, SeqCst로 메모리 가시성과 재배열 제약을 제어합니다.
③ Mutex: 상호 배제를 제공하는 락으로, 하나의 스레드만 임계 영역에 진입할 수 있습니다.
④ RwLock: 읽기-쓰기 락으로, 여러 읽기 스레드 또는 하나의 쓰기 스레드를 허용합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust의 Atomic 타입은 std::sync::atomic에 정의되어 있으며, platfrom-independent한 인터페이스를 제공합니다.
AtomicUsize, AtomicIsize, AtomicBool, AtomicPtr 등이 있으며, 각각 load, store, fetch_add, compare_exchange 등의 메서드를 가집니다.
모든 연산은 원자적으로 수행되므로 데이터 레이스는 발생하지 않지만, 논리적 레이스(logical race)는 여전히 가능합니다.
Ordering은 원자적 연산의 메모리 가시성 의미를 제어합니다.
Relaxed는 가장 약한 보장으로, 단순한 카운터에 적합합니다.
Acquire/Release는 한 스레드에서 쓴 값을 다른 스레드에서 읽을 때의 가시성을 보장합니다.
SeqCst는 가장 강력한 보장으로, 전체 프로그램의 원자적 순서를 제공하지만 성능 비용이 큽니다.
Mutex는 std::sync::Mutex로 제공되며, Poisoning 개념을 도입했습니다.
락을 보유한 스레드가 panic으로 종료되면 Mutex는 poisoned 상태가 되어, 이후 lock 시도는 에러를 반환합니다.
이는 손상된 상태로부터의 복구를 강제하며, 안전한 동시성 설계를 돕습니다.
parking_lot 크레이트는 더 빠르고 작은 락 구현을 제공하며, Rust 생태계에서 널리 사용됩니다.
RwLock은 읽기 작업이 많은 상황에서 Mutex보다 높은 동시성을 제공합니다.
std::sync::RwLock은 쓰기 기아(starvation) 가능성이 있으므로, 공정성이 중요한 경우에는 주의가 필요합니다.
parking_lot::RwLock은 공정한 읽기-쓰기 정책을 제공하여 이러한 문제를 완화합니다.
Lock-free 알고리즘을 구현할 때는 Atomic과 Ordering을 정밀하게 다루어야 합니다.
compare_exchange_weak는 루프 내에서 스핀락이나 CAS 루프를 구현할 때 사용되며, x86에서의 성능을 최적화합니다.
메모리 순서를 잘못 사용하면 subtle한 버그가 발생할 수 있으므로,除非 필요하면 SeqCst를 우선 사용하는 것이 안전합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
공유 카운터나 플래그는 AtomicUsize와 Ordering::Relaxed로 구현합니다.
복잡한 공유 상태는 Mutex<State>로 보호하고, lock()으로 임계 영역을 명확히 합니다.
읽기 집약적 데이터 구조는 RwLock으로 읽기 병렬성을 극대화합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Atomics와 Locks는 Rust 동시성 프로그래밍의 양대 축입니다.
Ordering을 정확히 이해하지 않으면 메모리 가시성 버그가 발생할 수 있으므로 신중해야 합니다.
상황에 맞는 동기화 도구를 선택하고, lock-free는 마지막 수단으로 고려하세요.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/std/sync/atomic/index.html
parking_lot: https://docs.rs/parking_lot/latest/parking_lot/
#Rust #Atomics #Mutex #RwLock #Concurrency #MemoryOrdering #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30