logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

Atomic Operation에 대해서

by 엉뚱도마뱀 posted Dec 18, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

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이라는 결과를 초래했다.

 

아래는 테스트 예제이다.

 

public class Test extends Thread {
 static int count = 1; 
 public void run() { 
   cnt++; 
   System.out.println(cnt); 
} 

public static void main(String[] args) { 
  Test test1 = new Test();
  Test test2 = new Test();
  Test test3 = new Test();
  test1.start();
  test2.start();
  test3.start();
 } 
}

 

예상대로라면 순서는 알 수 없으니 아무튼 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

http://mygumi.tistory.com/112

TAG •

List of Articles
No. Subject Author Date Views
22 안드로이드 개발시 API Key, 암호화 정보 코드에서 숨기는 방법, Kotlin DSL의 경우 lizard2019 2023.06.20 193
21 구글에서 제공하는 안드로이드 개발 기초 학습코스 file digipine 2022.03.18 378
20 Toolchain Error 'No such file or directory' 해결방법 lizard2019 2019.12.19 1371
19 Ubuntu 16.0.4 openjdk 7 설치방법 lizard2019 2019.12.19 826
18 Ubuntu 리눅스 fastboot 설치 lizard2019 2019.12.13 1502
17 atomic vs volatile vs synchronized file 엉뚱도마뱀 2017.12.18 1186
» Atomic Operation에 대해서 엉뚱도마뱀 2017.12.18 1226
15 Android 하드웨어 코덱 포팅하기, OpenCore, OpenMAX digipine 2017.11.03 1609
14 Ubuntu 기본 쉘 dash 대신 bash로 설정 digipine 2017.11.02 703
13 [안드로이드] 가속도 (Accelerometer)센서 Shake 이벤트 예제 digipine 2017.11.02 1627
12 Android - 블루투스 BLE 개발하기 digipine 2017.11.02 16583
11 안드로이드 Native C 코드에서 Intent 보내는 방법 digipine 2017.11.02 1296
10 안드로이드 시스템 개발시 mmm 커멘드 사용법 digipine 2017.11.01 1168
9 Android - 이미지(비트맵) 리사이징 digipine 2017.11.01 1306
8 [Java] SortedSet과 Comparable을 이용한 정렬(Sort) digipine 2017.10.29 772
7 Android - AlarmManager를 이용해서 서비스 실행 시키는 코드 digipine 2017.10.29 498
6 Android - 슬립모드 (Sleep Mode) 방지 코드 digipine 2017.10.29 2395
5 Android - Browser 에서 Activity 실행하기 file digipine 2017.10.29 712
4 안드로이드 파일 입출력시 한글 깨짐 문제 digipine 2017.10.29 1643
3 Android 기반 Application Ant 빌드 방법 digipine 2017.10.29 538
Board Pagination Prev 1 2 Next
/ 2