2 minute read

일상생활에서 동시성

요즘들어 알리익스프레스를 자주 사용한다. 그 이유는 가격이 저렴한 것도 있지만, 추가적인 할인을 해주는 쿠폰을 나눠주기도 한다. 이 쿠폰까지 사용하면 어느 쇼핑몰보다 저렴하게 상품을 구매할 수 있다. 그러나 쿠폰 재고 소진으로 쿠폰을 못받을 수 있다. 여기서 문득 생각이 들었다. 알리 월간 사용자수는 약 4억 명정도라고 가정하면, 쿠폰 이벤트를 시작할 때 동시에 수 많은 사용자가 쿠폰 발행을 할텐데 쿠폰 잔여 갯수를 정확하게 관리하는 것은 어려운 문제일 수 있다.

동시성(Concurrency)이란

동시성(Concurrency)은 두 가지 이상의 작업이 동시에 실행하는 것처럼 보이는 기술을 의미한다. 하지만 실제로 두 사건이 동시에 일어나는 것은 아니며, 빠르게 전환하면서 동시에 일어나는 것처럼 보일 뿐이다. 이는 소프트웨어 기술에서 구현할 수 있다.

동시성과 자주 비교되는 병렬성(Parallelism)은 실제로 여러 작업이 동시에 실행하여 처리 속도를 높이는 것을 의미한다. 컴퓨터에서 여러 작업을 동시에 실행하려면 물리적인 자원인 여러 CPU 코어가 필요하다.

정리하자면, 동시성은 시간을 분배받아 여러 작업들이 하나씩 실행되어 동시에 실행되는 것처럼 보이는 기술이고, 병렬성은 여러 CPU 코어를 사용해서 같은 시간에도 여러 작업이 실제로 동시에 실행되어 작업 속도를 단축시킨다.

동시성 제어를 하지 않을 경우 발생하는 문제점

경쟁 상태(Race condition)

경쟁 상태(Race condition)는 작업의 시작 시간, 순서, 실행 시간 등에 영향을 받아 출력결과가 일정하지 않게되는 상황이다. 데이터 관점에서는 여러 트랜잭션이 동시에 같은 데이터를 읽거나 수정하려고 할 때 발생하는 문제이다. 이 경우, 데이터의 무결성이 손상될 수 있다. 예를 들어, 두 명의 사용자가 동시에 같은 쿠폰의 잔여 갯수를 확인하고 발행하려고 한다고 가정해 본다면 아래와 같은 현상이 발생할 수 있다.

먼저, 사용자1이 쿠폰을 조회한다. 이어서 사용자2도 쿠폰을 조회한다. 둘다 잔여 쿠폰 갯수가 0보다 커서 발급이 가능한 상태여서 쿠폰 발급을 하게된다. 이 예시로 보면 분명 잔여 갯수가 1개가 남은 상태라서 쿠폰 1장만 발급되어야 하는데 2개가 발급되어 데이터 무결성이 손상되었다.

교착상태(Deadlock)

데드락(Deadlock)은 교착 상태라고도 불리며, 두 개 이상의 프로세스가 서로 자원을 기다리고 있는 상태로 인해 어떤 프로세스도 진행될 수 없는 상황을 의미한다. 데이터 관점에서는 데드락은 두 개 이상의 트랜잭션이 서로를 기다리고 있는 상태로 인해 어떤 트랜잭션도 진행될 수 없는 상태를 의미한다. 예를 들어, 두 개의 사용자1과 사용자2가 각각 다른 데이터를 잠그고 있다고 가정해 보자. 만약 사용자1이 사용자2에 의해 잠겨있는 데이터를 필요로 하고, 사용자2가 사용자1에 의해 잠겨있는 데이터를 필요로 한다면, 두 트랜잭션은 서로를 기다리게 되어 데드락 상태에 빠지게 된다.

결론

위와 같은 상황들은 같은 시간에 여러 작업들이 실행중 인 경우 발생할 수 있는 문제이다. 이러한 문제를 해결하기 위해 동시성 제어가 필요할 수 있다. 즉, 하나의 작업 단위로만 실행되게 함으로써 위와 같은 문제들을 예방할 수 있다. 그러나 장점만 있는 것은 아니다. 한 작업이 끝나야 다음 작업을 할 수 있으므로 성능 저하가 발생할 수 있고 특히, 대량의 작업이 동시에 접근하는 경우 성능 저하가 심각할 수 있다. 동시성 제어를 구현하기 위해 코드 복잡성이 커지게 되고 이는 디버깅, 테스트 등의 유지보수를 어렵게 만들 수 있다. 결국, 시스템의 특성과 요구 사항에 따라 적합한 동시성 제어 기법을 선택하고, 그에 따른 장점과 단점을 모두 고려하여 적절하게 적용해야 한다.

다음 포스팅: 잠금(Lock)을 이용한 동시성(Concurrency) 제어

Comments