입출금 문제

입출금 문제는 입금과 출금이 동시에 수행될 때 발생할 수 있는 문제로서, 경쟁 상태에 관한 문제 중 하나이다.

문제 상황 
1000원이 들어있는 계좌에 대해 500원을 입금하는 작업과 500원을 출금하는 작업을 동시에 수행하는 상황이다.

 입금 프로세스
 ...
 잔액 = 잔액 + 500
 ...

 출금 프로세스
 ...
 잔액 = 잔액 - 500
 ...

이 때, 위 프로세스들에서 작업이 원자적으로 수행되지 않으면, 일관성이 손상될 수 있다. 위 코드에서 잔액 처리부분은 각각 한 문장으로서 원자적으로 보이지만, 실제 컴파일될 때는 아래와 같이 여러 개의 명령어(instruction)로 나뉘게 되어, 원자성을 잃게 된다.

 고급 언어
 잔액 = 잔액 + 500

 저급 언어
 레지스터 = 잔액
 레지스터 = 레지스터 + 500
 잔액 = 레지스터

해결 방법 
공유 데이터의 일관성을 유지하기 위해 공유 데이터를 접근하는 코드부분을 임계 구역으로 지정함으로써 문제를 해결할 수 있다.

같이 보기 
 경쟁 상태
 임계 구역
 트랜잭션
 원자성

동시성 제어