공유자원 (Shared Resource): 여러 프로세스 또는 스레드가 함께 접근할 수 있는 메모리, 코드, 변수 등의 자원을 의미
경쟁상태 (Race Condition): 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근하여 읽거나 쓰는 현상
→ 순서나 타이밍에 따라 결과 값에 영향을 줄 수 있으며, 예상치 못한 동작을 초래할 수 있으므로 경쟁 상태를 해결해야 한다.
임계구역 (Critical Section): 공유자원에 접근하는 코드 영역 중에서 경쟁 상태가 발생할 수 있는 부분
→ 임계구역에서 race condition이 발생할 수 있으며, 여러 프로세스나 스레드가 동시에 접근하지 못하도록 설계해야 한다.
예시
- 두 개의 프로세스가 {num : 1000} 이라는 Json 파일에 접근해서 -1000원 동작 후 파일을 쓰기
- 파일 쓰기에 3초가 걸린다.
→ 두 개의 프로세스스가 동시에 임계구역에 접근하여 경쟁상태가 발생해서, 결과값으로 1000원이 아닌 0이 나오게 된다.
경쟁 상태 관리의 중요성
- 데이터 정합성: 예상되는 데이터의 값과 실제로 저장된 데이터의 값이 일치해야 함
- 두 개의 프로세스가 동시에 잔고에서 1000원을 인출하려고 시도할 때, 경쟁 상태가 발생하면 두 번째로 접근하는 프로세스는 0이 아닌 1000원을 읽을 수 있으며, 이로 인해 데이터 정합성이 깨질 수 있다.
- 데이터 무결성: 데이터의 규칙을 위반하지 않아야 함
- 프로세스의 접근 타이밍에 따라 0원일 때에도 출금이 가능하다면 데이터 무결성이 위반된다.