Race Condition (경쟁 상태)
● 여러 스레드(Thread)나 프로세스(Process)가 동시에 같은 메모리 영역, 자원에 접근하여 읽거나
쓰기를 할 때, 각 작업의 순서가 결과에 영향을 미치고 있다면 Race Condition이라 합니다.
- 두 스레드가 같은 변수의 값을 읽고, 그 값을 바탕으로 연산 후 다시 저장하려 할 때,
어느 스레드가 먼저 값을 저장하느냐에 따라서 변수의 최종 값이 달라질 수 있습니다.
● 왜 발생하는가
- 한 스레드가 공유 변수의 값을 읽은 후 수정하여 저장하는 사이에 다른 스레드도 같은 작업을 수행하면
서로의 작업이 덮여 쓰여 원치 않는 결과가 발생할 수 있습니다. 이를 Read-Modifiy-Write라 합니다.
- 어떤 조건을 확인하고 행동하는 시점 사이에 다른 스레드가 그 조건에 영향을 주면 원하던 값이
나오지 않습니다. 이를 Check-Then-Act라 합니다.
예시를 들어보면
● 은행 계좌 이체
- 초기 잔액이 10000원인 계좌에 두 사용자가 각각 5000원, 6000원을 인출하려고 합니다.
- 스레드 A와 스레드 B가 동시에 잔액을 10000원으로 확인한 후 인출을 진행하게 된다면,
두 요청 모두 잔액이 충분하다고 판단하여 실제로 11000원이 인출되는 상황이 올 수 있고
계좌의 남은 잔액이 음수 상태가 될 수 있습니다.
→ 즉, 경쟁 상태(Race Condition)가 발생하면, 각 요청의 실행 순서에 따라 결과가 달라지기 때문에
데이터 무결성 항목에 위배됩니다.
제어 문제
● Mutual exclusion
- Race Condition을 최대한 배제하기 위해서는 두 개 이상의 프로세스가 공용 데이터에 동시에 접근을 하는 것을 막아야 합니다. 한 프로세스가 공용 데이터를 사용하고 있으면 그 자원을 사용하지 못하도록 막거나, 다른 프로세스가 그 자원을 사용하지 못하도록 막으면 Race Condition에 빠지지 않습니다. 이를 상호 배제(Mutual exclusion)이라고 합니다.
● Deadlock
- 상호 배제를 시행한다고 해서 해결되는 것이 아닙니다. 추가적인 제어 문제가 발생하는데 교착상태(Deadlock)가 발생할 수 있습니다. 프로세스가 각자 프로그램을 실행하기 위해 두 자원 모두에 접근해야 한다고 가정할 때, 프로세스는 두 자원 모두를 필요로 하기 때문에 두 리소를 사용하여 프로그램을 수행할 때까지 이미 소유한 리소스를 해제하지 않습니다. 이러한 상황이 된다면 두 프로세스는 교착 상태(Deadlock)가 발생하는 문제가 있습니다.
● Starvation
- 기아 상태라고도 하며, 프로세스들이 더 이상 진행을 하지 못하고 영구적으로 블록되어 있는 상태입니다. 시스템 자원에 대한 경쟁 도중에 발생할 수 있으며 프로세스 간의 통신 과정에도 발생할 수 있는 문제입니다. 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로 아무것도 완료하지 못하는 상태에 빠지게 됩니다.
경쟁 상태를 예방하려면
● Race Condition을 사전에 예방하기 위해 공유 자원에 접근할 때 동기화 과정이 필요합니다.
○ 락(Mutex) : 임계 구역(Critical Section)에 접근할 때 Lock을 걸어 한 번의 하나의 스레드만 실행이 되도록 합니다.
○ 세마포어(Semaphore) : 제한된 수의 스레드만 공유 장원에 접근할 수 있도록 제어합니다.
○ 원자적 연산(Atomic Operation) : 하드웨어나 라이브러리에서 제공하는 원자적 연산을 사용하여 중간에 다른 스레드가 끼어들지 못하게 설정합니다.
정리
Race Condtion은 동시성 프로그래밍에서 자주 발생합니다. 성능과 프로그램에 맞는 동기화 기법을 사용하여 경쟁 상태를 예방하고 대비해야 합니다.
'Develop Diary > Interview' 카테고리의 다른 글
[Interview] TCP와 UDP의 차이를 설명해주세요 (0) | 2025.03.07 |
---|---|
[Interview] Stack과 Heap에 대해서 설명해주세요 (0) | 2025.03.06 |
[Interview] 데이터베이스 인덱스의 자료구조를 설명해주세요 (0) | 2025.03.04 |
[Interview] TDD 란 무엇인가요 (0) | 2025.03.03 |
[Interview] 트랜잭션이란 무엇인가요 (0) | 2025.02.28 |