Race Condition (경합 상태)
정의
- 공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태
동시 접근 시 자료의 일관성을 해치는 결과가 나타남
방생하는 경우
-
커널 작업을 수행하는 중에 인터럽트 발생
- 문제점 : 커널모드에서 데이터를 로드하여 작업을 수행하다가 인터럽트가 발생하여 같은 데이터를 조작하는 경우
- 해결법 : 커널모드에서 작업을 수행하는 동안, 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하도록 한다.
-
프로세스가 'System Call'을 하여 커널 모드로 진입하여 작업을 수행하는 도중 문맥 교환 발생
- 문제점 : 프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우 (프로세스2가 작업에 반영되지 않음)
- 해결법 : 프로세스가 커널모드에서 작업을 하는 경우 시간이 초과되어도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 함
-
멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
- 문제점 : 멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
- 해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법
Critical Section (임계 영역)
정의
- 한번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역
- 프로세스간에 공유자원을 접근하는데 있어서 문제가 발생하지 않도록 하기 위해서
경우
-
Preemptive
- 선점 방식
- 커널 모드에서 문맥전환이 가능 → race condition 가능 → critical section 문제를 다뤄야 함
-
Non-Preemptive
- 비선점 방식
- 다른 프로세스들로부터 interrupt 될 수 없음
- 문맥전환 불가능 → race condition으로부터 자유로움
해결하기 위해서 아래의 3가지 조건을 충족해야 한다.
-
Mutual Exclusion (상호 배제)
- 하나의 프로세스가 임계 영역에 들어가 있다면, 다른 프로세스는 들어갈 수 없어야 한다.
-
Progress (진행)
- 임계 영역에 들어와 있는 프로세스가 없는 상태에서,
- 들어가려 하는 프로세스가 여러개라면 어느 것이 들어갈지 결정해주어야 한다.
- 임계 영역에 들어가는 순서는 무한정 연기 될 수 없다.
-
Bounded Waiting (한정 대기)
- 한 프로세스가 임계 영역에 진입하고자 요청을 한 후부터 이 요청이 허용될 때까지,
- 다른 프로세스가 그들의 임계 영역에 진입할 수 있는 횟수가 제한되어야 한다.
Petersons's Solution
- Flag를 이용
- 이론적으로 좋은 해결책 이지만, 현대 구조에 적합하지 않다.
- 성능 향상을 위해 프로세서 and/or 컴파일러에 의해서 Operation 들이 재정렬 된다.
- Single thread : 재정렬 전・후 결과가 같음
- Multi thread : 재정렬 전・후 결과가 다름 / 예상치 못한 결과
임계 영역의 동시 접근을 해결하기 위한 방법
- lock(락), semaphore(세마포어), monitor(모니터) 등이 있다.