CS/운영체제
공유자원과 경쟁상태 그리고 임계영역
프론트엔드코린이
2025. 5. 29. 18:40
✅ 공유 자원 (Shared Resource)
여러 스레드나 프로세스가 동시에 사용하려는 자원
- 예: 전역 변수, 파일, 프린터, 메모리 공간 등
- 한 번에 하나만 안전하게 사용해야 함
🧠 비유: 한 식당에 포스기(POS기계)가 하나밖에 없다면,
직원 여러 명이 그걸 동시에 쓰려고 하면 충돌이 날 수 있어 → 이게 공유 자원이야.
✅ 경쟁 상태 (Race Condition)
여러 스레드가 동시에 공유 자원에 접근해서, 실행 순서에 따라 결과가 달라지는 문제
- 공유 자원을 제대로 통제하지 않으면 발생
- 결과가 예측 불가, 버그 발생 가능성 ↑
🧠 예시:
변수 count = 0
- 스레드 A: count++
- 스레드 B: count++
→ 동시에 실행되면 결과가 1이 될 수도 있고, 2가 될 수도 있어 → 이게 경쟁 상태야.
✅ 임계 영역 (Critical Section)
공유 자원에 접근하는 코드 영역
→ 동시에 하나의 스레드만 접근할 수 있도록 보호해야 해
- 경쟁 상태를 막기 위해 사용
- 보통 lock, synchronized, mutex 같은 기법으로 보호
🧠 비유:
은행 ATM 1대를 사용할 때 한 명씩만 쓰도록 줄을 세우는 것 → 이 줄 선 영역이 임계 영역이야.
🔁 한 줄 요약
용어정의
공유 자원 | 여러 스레드/프로세스가 같이 쓰는 자원 |
경쟁 상태 | 동시에 접근해서 예상 못 한 결과가 생기는 상황 |
임계 영역 | 경쟁 상태를 초래하는 코드 |
✅ 경쟁 상태 관리의 중요성
* 여러 스레드나 프로세스가 동시에 공유 자원에 접근할 때, 실행 순서에 따라 예기치 못한 결과가 발생하는 걸 방지하기 위해서야.
- 경쟁 상태를 방치하면 → 프로그램 동작이 불안정해짐
- 데이터가 손상되거나, 꼬이거나, 예측할 수 없는 결과가 나옴
- 특히 금융, 예약 시스템 등에서는 치명적인 오류 발생 가능
🧠 예시:
// 공유 자원 int balance = 10000; // 동시에 실행 Thread A: balance -= 1000; // 출금 Thread B: balance -= 2000; // 출금
- 순서가 꼬이면 balance가 잘못 계산될 수 있음
- 예: A, B가 동시에 실행 → 결과가 9000이 아닌 8000이 될 수도
➡ 그래서 경쟁 상태를 잘 관리해야 데이터가 신뢰할 수 있어!
✅ 데이터 정합성 (Data Consistency)
- 데이터가 논리적으로 맞고, 서로 모순되지 않는 상태
- "전체적으로 봤을 때 데이터가 일관되고 맞는가?"
- 예를 들어, 은행 잔고에서 입금한 금액 = 전체 계좌 증가분이어야 함
🧠 예시:
- A가 B에게 1000원 송금했는데
A의 잔고는 줄었고, B의 잔고는 그대로면? → ❌ 정합성 깨짐!
✅ 데이터 무결성 (Data Integrity)
데이터가 손상되지 않고, 올바르게 유지되는 성질
- 저장된 데이터가 변조되지 않고, 유효한 값만 저장되었는가에 집중
- 규칙 위반, 이상한 값 방지 (예: 나이 = -3 ❌)
🧠 예시:
- 주민번호 형식은 반드시 13자리여야 한다
- 이메일에는 @가 있어야 한다
→ 이런 규칙이 지켜지는 상태가 무결성이 있는 상태야
🔁 세 개의 개념 비교 요약
개념정의초점
경쟁 상태 관리 | 동시에 공유 자원 접근 시 오류 방지 | 순서/접근 관리 |
데이터 정합성 | 데이터들 간 논리적 일치 | 데이터 관계 |
데이터 무결성 | 유효한 형식, 값의 정확성 | 값 자체의 정확성 |