운영체제 | Atomic Operation

성수당·2025년 9월 12일

운영체제

목록 보기
16/31
post-thumbnail

🥔 Atomic Operation이란?

운영체제에서 Atomic Operation(원자적 연산)더 이상 쪼갤 수 없는, 중간에 끼어들 수 없는 단일 연산 단위를 의미한다.

즉, 어떤 작업이 Atomic(원자적) 하다는 것은 실행 도중 인터럽트, 문맥 교환, 다른 스레드의 개입 없이 완전히 실행되거나 전혀 실행되지 않음을 보장한다.

🧠 모든 병렬 프로그래밍의 핵심 개념 중 하나이며, 동기화 문제를 방지하기 위한 기본 단위이다.

🥔 왜 원자성이 중요한가?

멀티스레드 환경이나 병렬 시스템에서는 여러 스레드가 공유 자원에 동시에 접근할 수 있다. 이 때 연산이 Atomic 하지 않다면, 다음과 같은 문제가 발생할 수 있다:

예시: 원자성이 없는 증가 연산

// 두 스레드가 같은 변수를 증가시키는 경우
x = x + 1; // 실제로는 아래 3단계로 나뉨
1. 레지스터에 x 읽기
2. +1 연산
3. x에 결과 저장
  • 만약 두 스레드가 동시에 이 연산을 수행하면?
  • Race Condition이 발생하여 값이 덮어쓰여질 수 있다.

✅ 이 문제를 방지하기 위해 “Atomic Operation”을 사용해야 한다.

🥔 원자적 연산의 종류

CPU 또는 OS는 기본적으로 몇 가지 원자적 연산을 하드웨어 또는 명령어 수준에서 제공한다.

🔹 1. 기본 연산

  • 정수 변수에 대한 읽기 / 쓰기 (단일 명령어 내에서 처리되면 대부분 원자적)
  • 비트 연산 (CPU에 따라 다름)

🔹 2. CAS (Compare And Swap)

bool CAS(int *addr, int expected, int new_val) {
    if (*addr == expected) {
        *addr = new_val;
        return true;
    }
    return false;
}
  • 메모리 주소에 저장된 값이 기대한 값과 같을 때만 새로운 값으로 바꾼다.
  • 락 없이 동기화를 구현할 수 있는 대표적 방법 (Lock-Free 프로그래밍)

🔹 3. Test-and-Set, Swap, Fetch-and-Add 등

  • 대부분의 CPU는 이러한 Atomic Instruction 을 어셈블리 수준에서 제공한다.
  • 예: x86의 LOCK prefix, xchg, cmpxchg

🥔 사용자 수준에서의 Atomic 연산

🔸 1. C 언어 (C11 이상)

#include <stdatomic.h>

atomic_int count = 0;

atomic_fetch_add(&count, 1);
  • stdatomic.h 를 통해 다양한 원자적 연산 제공

🔸 2. GCC 내장 함수

__sync_fetch_and_add(&x, 1);
__sync_bool_compare_and_swap(&x, expected, new_val);
  • GCC에서 제공하는 저수준의 atomic 연산 함수들

🔸 3. 라이브러리 수준

  • POSIX의 pthread_mutex 대신 일부 원자적 연산을 사용하여 락 없이 데이터 보호 가능
  • 하지만 락이 필요한 경우가 더 많음

🥔 Atomic vs Lock

항목Atomic OperationMutex / Lock
동작 단위아주 짧고 단순한 연산에 적합임계 구역 전체 보호에 적합
성능빠름 (락 오버헤드 없음)느릴 수 있음 (컨텍스트 스위칭 발생 가능)
복잡도간단한 연산만 처리 가능복잡한 로직도 보호 가능
데드락 위험없음있음
사용 예카운터 증가, 플래그 설정 등공유 리스트, 큐, 트리 등 복잡한 구조

🚨 Atomic은 락의 대체재가 아니며, 작고 단순한 작업에 한해 효율적인 동기화 도구다.

🥔 사용 시 주의사항

  • Atomic하다고 해서 다 안전한 것은 아님

    • 복수 변수 동시 접근은 atomic으로도 보호 불가
  • 캐시 일관성 문제false sharing도 주의

  • 멀티 CPU 환경에서는 메모리 배리어(Memory Barrier)나 volatile 키워드 사용 고려

🥔 마무리

  • Atomic Operation 은 병렬 환경에서 간단한 연산을 빠르고 안전하게 수행하기 위한 핵심 도구
  • 대부분의 언어, 컴파일러, CPU는 atomic 연산을 지원하며, 성능 최적화에 활용됨
  • 하지만 복잡한 공유 자원 보호에는 락 기반의 동기화가 여전히 필요하다
profile
말하는 감자🥔

0개의 댓글