평안하자

원자적 연산이란? 본문

Backend

원자적 연산이란?

eeeeerrr 2024. 3. 5. 19:05

실용주의 프로그래머와 동시성 관련된 공부를 하면서 원자적 연산에 대해 개념적으로 조금 헷갈리는 부분이 있어 별도로 빼서 간단히 정리해보았다. 트랜잭션, 락, Atomic 변수 등 더 할 얘기는 많지만 이정도로 마무리하고 다른 글에서 더 살펴보도록 하자.

https://affectionatedevlog.tistory.com/22

 

[실용주의 프로그래머] 6장. 동시성

동시성과 병렬성 처리는 필수! 동시성 (Concurrency) 둘 이상의 코드 조각이 실행될 때 동시에 실행중인 것처럼 행동하는 것 (병행성) 동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전

affectionatedevlog.tistory.com


 

원자적 연산이란?

원자적 연산이란, 중간 단계 없이 시작부터 끝까지 한 번에 이루어지는 연산을 말합니다. 즉, 연산이 '나누어질 수 없는' 것을 의미합니다. 예를 들어, 은행 계좌에서 돈을 인출하는 과정을 생각해 봅시다. 이 과정은 돈의 잔액을 확인하고, 특정 금액을 빼는 두 단계로 이루어집니다. 원자적이지 않은 연산에서는 이 두 단계 사이에 다른 과정이 끼어들 수 있습니다. 예를 들어, 계좌의 잔액을 확인한 뒤에 돈을 빼기 전에, 다른 사람이 돈을 빼가는 경우가 있을 수 있습니다. 이렇게 되면, 원래 인출하려던 사람은 잘못된 정보에 기반해 행동하게 됩니다.

원자적 연산의 필요성

위의 예에서처럼, 두 프로세스가 동시에 같은 데이터에 접근하려 할 때, 데이터의 일관성을 보장하기 위해서는 원자적 연산이 필요합니다. 원자적 연산을 사용하면, 한 프로세스가 데이터를 가져오고 갱신하는 동안 다른 프로세스가 그 데이터를 변경할 수 없습니다. 즉, 데이터의 가져오기와 갱신이 하나의 단일 연산처럼 처리되어, 중간에 다른 프로세스가 끼어들 여지가 없습니다.

 

이를 해결하기 위한 한 가지 방법은 '락(lock)'을 사용하는 것입니다. 락은 특정 데이터에 대한 접근을 단독으로 허용하는 메커니즘입니다. 한 프로세스가 데이터를 사용하고 있다면, 다른 프로세스는 그 프로세스가 작업을 완료하고 락을 해제할 때까지 기다려야 합니다.

쉽게 말해

원자적 연산이 없다면, 여러분이 은행 계좌에서 돈을 인출하는 동안 누군가가 같은 계좌에서 돈을 빼가거나, 당신이 마지막 쿠키를 집으려는 순간 친구가 그것을 가져가 버릴 수 있습니다. 원자적 연산은 이러한 문제를 방지하기 위해, 모든 과정을 나누지 않고 한 번에 완벽하게 수행하게 만듭니다.