Atomic Operation의 개념은 재진입성, 임계 구역, 스레드 안전, 동기화 프리미티브 등 관련 용어를 이해하는 데 많은 도움을 준다.
Atomic Operation의 정의는 단순하게 Atomicity(원자성)은 깨지지 않는 성격이기에 즉, 중단되지 않는 연산이라고 볼 수 있다.
깨지지 않는 것과 중단되지 않는 것의 의미를 동일하게 생각하기 어려울 수 있다.
예를 통해 알아보자.
만약 두 명의 사용자가 프린터를 출력하기 명령을 내린다면, 각 인쇄는 중단되지 않고 한번에 실행되어야한다.
만약 프린터 드라이버가 두 사용자의 자료를 부분적으로 보내게 된다면, 예상하지 못한 결과를 초래하게 된다.
그러므로 프린터 드라이버는 하나의 프로그램으로부터 둘 이상의 명령이 오더라도 항상 예상된 결과대로 처리해줘야한다. (원자성)
이 말은 전문 용어로 말하자면, 프린터 접근에 대해 동기화 작업을 한다는 것이다.
원자성이란 데이터베이스에서 많이 접할 수 있었다.
원자성(atomicity)은 데이터베이스 시스템에서 ACID 트랜잭션 특성중의 하나다. 하나의 원자 트랜잭션은 모두 성공하거나 또는 실패하는 데이터베이스 운용의 집합이다. 원자성의 보증은 데이터베이스의 부분적인 갱신으로 더 큰 문제가 야기되는 것을 방지한다.
항공 티켓 주문이 원자성의 한 예다. 티켓은 반드시 지불과 예약이 동시에 되거나 아니면 모두 되지 않아야 한다. 성공적으로 지불은 되었으나 좌석 예약은 되지 않은 경우는 허용되지 않는다. 하나의 트랜잭션은 항공 티켓 예약뿐 아니라 호텔, 운송, 현재 환율로 정확히 환전되는 데에도 적용된다.
데이터베이스의 원자성과 다를 수 있으나, 개념은 같다.
개념이 같다는 것에 중점을 두고 이해를 하자.
원자성이란, 프로그래밍에서 접근하면 이해하기 쉽다. (Java 기준)
간단하게 원자 연산이란 위에서 설명했듯이 중단되지 않는 연산, 비원자 연산이란 중단되는 연산이라고 보자.
int count = 0; // Atomic Opeartion
count++; // Non Atomic Opeartion
int count = 0는 원자 연산이고, count++는 비원자 연산이라고 예를 들 수 있다.
그 이유는 count++의 경우를 예로 설명하겠다.
멀티스레드 어플리케이션에서 global/static 변수가 증가되는 함수가 호출된다고 생각해보자.
count++;
위 상태는 3가지 작업으로 분리할 수 있다.
1. count 변수의 값을 가져온다.
2. count 변수의 값을 증가한다.
3. 변경된 count 변수를 저장한다.
위 작업의 흐름을 자세히 보자. (count = 2)
만약 스레드(A)에서 관련 함수가 호출되어, count의 값을 가져온다.
이 실행 시점에서 스레드(A)가 선점되어있고, 다른 스레드(B)에서 관련 함수를 똑같이 호출되어 완료되었다고 가정하자.
그 결과 스레드(B)로 인해 count 변수는 3으로 증가된다.
그 후 스레드(A)가 재개됐을 때 count는 스레드(B)로 인해 증가된 3이 아닌 이전 값이 2를 가져와있었기 때문에 count는 증가되어 3이 나오게 된다.
관련 함수가 2번 호출되면 당연히 4라는 값이 나와야하지만 3이라는 결과를 초래했다.
아래는 테스트 예제이다.
예상대로라면 순서는 알 수 없으니 아무튼 1, 2, 3 이 한번씩 출력 되어야한다.
하지만 같은 숫자가 두 번씩 호출되는 것을 볼 수 있다.
이렇게 비원자 연산은 분리되어 작업이 이루어져 한번에 처리되지 않는 의미와 같기 때문에 위와 같은 결과 초래하게 된다.
위 설명을 토대로 보자면, Atomic Operation의 예로는 명령 실행을 들 수 있다.
일반적으로 실행 유닛에 대한 명령은 시작되면 중간에 중단될 일을 없기 때문이다.
하지만 고급 언어로 작성된 명령은 일반적이지 않고, 다수의 지침을 기반으로 제공되고 있다.
이러한 언어 특성 때문에 Non-Atomic Operation의 근본적인 주 원인이 된다.
비원자 연산의 문제점을 위해 java에서는 원자 연산을 다수의 방법으로 제공해준다.
AtomicInteger, volatile, synchronization 등을 제공해준다.
원본을 참고하여 번역하였으니 원본도 확인하길 바란다.
위 키워드들을 주제로 따로 글을 다루겠다.
Atomic Operation 참고 원본
http://www.geeksforgeeks.org/g-fact-57/
atomic and non atomic
http://omtlab.com/atomic-and-non-atomic-operations-in-java/
atomic vs volatile vs synchronization