원자적 연산이란?

<aside> 🥕

더 이상 작은 단위로 쪼갤 수 없는, 한 번에 완전히 수행되는 연산

</aside>

다른 어떤 연산의 방해도 받지 않고 통째로 완료되거나 아예 시작되지 않거나 둘 중 하나만 보장되는 연산

중요한 이유

동시성이 존재하는 환경에서 공유 자원의 일관성을 보장할 수 있기 때문입니다. 여러 스레드가 동시에 같은 데이터에 접근할 때, 원자성이 보장되지 않으면 데이터가 손상될 수 있습니다.

원자성이 필요한 이유

i라는 변수의 값을 1 증가시키는 연산인 i++를 생각해보겠습니다.

i++ 연산은 코드 상으로는 한 줄로 보이지만, 실제로는 CPU에서 다음 세 가지 비원자적(Non-atomic) 단계로 이뤄집니다 :

  1. 메모리에서 i의 현재 값을 레지스터로 불러옵니다(LOAD)
  2. 레지스터 값을 1 더합니다(INCREMENT)
  3. 증가된 값을 다시 메모리의 i에 씁니다(STORE)

예시1) 두 개의 스레드가 동시에 i++ 연산을 실행한다면?

다음과 같이, 연산이 뒤섞이는 **레이스 컨디션(Race Condition)**이 발생할 수 있습니다 :

스레드 1 스레드 2 메모리(i)
i 를 레지스터로 로드(값 : 5) 5
i 를 레지스터로 로드(값 : 5) 5
레지스터 값에 1을 더함(값 : 6) 5
레지스터 값에 1을 더함(값 : 6) 5
레지스터 값(6)을 i에 저장 6
레지스터 값(6)을 i에 저장 6
결과 6(7이 아님)

예시2) 은행에서 한 계좌의 돈을 빼서 다른 계좌로 옮기는 과정 중, 만약 이 과정이 중간에 멈춘다면?

원자적 연산 구현 방법

하드웨어 지원