📖경쟁 상태(Race Condition)
여러 프로세스가 공유 자원에 동시에 접근할 때, 공용 데이터에 대한 실행 순서에 따라 결과값에 영향을 줄 수 있는 상황
- 동시 접근 시 자료의 일관성을 해치는 결과가 나타남
- 임계 영역에 대한 프로세스들의 동시적인 접근을 잘 제어한다면
Race Condition을 해결 가능
Critical Section(임계 영역)
운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그램 코드 부분
📖발생 상황
- 불충분한 동기화 : 여러 스레드 또는 프로세스가 적절한 동기화 없이 공유 자원에 액세스하는 경우
- 비원자적 작업 : 여러 스레드가 공유 자원에서 비원자적 작업을 수행하는 경우
더 이상 쪼갤 수 없는 행위를
원자성을 가진다라고 하며, 이러한 특성을 가진 것을원자적이다라고 함.비원자적인 작업은 여러 단계로 구성되고 단계 사이에서 중단될 수 있는 작업
- 실행 순서에 대한 잘못된 가정 : 프로그래머가 강제하지 않고 특정 실행 순서를 가정할 때, 실제 실행 순서가 다를 경우
📎예시
1. 커널안에 코드를 수행하는 중 인터럽트 발생
- 커널 안에 있는 변수를 증가시키는 중 인터럽트가 발생
- 인터럽트 처리 함수(함수 코드는 커널에 존재)에서는 해당 변수를 감소시켜버림
- 변수 값에 문제가 발생
- 사용자 프로세스는 해당 프로세스에 할당받은 메모리에만 존재할 수 있지만 커널은 서로 다른 프로세스가 공유하기 때문에 발생
해결방법
작업을 할 때 인터럽트 발생하더라도 작업이 완료된 후 인터럽트가 발생하도록 처리순서를 부여
2. 프로세스가 System Call를 호출하여 커널 모드로 수행 중일 때 Context Switch가 발생
- 사용자 프로세스가 System Call를 호출 → 커널 모드로 커널안에 존재하는 변수를 수정 가능
- 할당된 CPU 사용시간이 만료되면 Context Switch가 발생
- 새롭게 CPU를 할당받은 사용자 프로세스가 이전 프로세스와 동일한 System Call를 호출하여 수정하고 있던 변수에 대한 작업을 수행
- 결과적으로 변수 값에 문제가 발생
해결방법
사용자 프로세스가 System Call를 호출하여 커널모드의 작업을 완료한 후 종료될 때 Context Switch가 발생할 수 있게 함. 즉, 커널모드에 있다면 CPU의 제어권을 빼앗지 않음
3. 여러 프로세스의 공유 메모리 내 커널 안 변수에 접근
- CPU가 여러 개인 시스템에서 공유 메모리 속 데이터를 여러 프로세스가 접근할 때 발생
해결방법
커널 안 변수에 접근할 때 lock/unlock을 걸어 매 순간 변수에 접근하는 프로세스는 1개로 한정
📖발생 시 일어나는 문제
1. 데이터 손상
데이터 상태가 일관되지 않거나 잘못될 수 있음
2. 예측할 수 없는 동작
시스템 동작을 예측하거나 재현하기 어려울 수 있음 ( ∵
Race Condition의 비결정적 특성)
3. 보안 취약성
공격자가 무단 액세스 또는 권한을 얻기 위해 악용할 수 있음
📖해결을 위한 충족 조건
Race Condition(임계 영역 문제)을 해결하기 위해 충족해야 하는 조건들
1. Mutual Exclusion(상호 배제)
한 프로세스가 임계 영역을 수행 중이라면 다른 모든 프로세스들은 그 임계 영역에 들어가지 못하게 막는 것
2. Progress(진행)
임계 영역에 들어간 프로세스가 없는 상태에서 임계 영역에 들어가려는 프로세스가 있을 시 들어가게 해줘야 함 즉, 임계 영역에 있는 프로세스 외에는 다른 프로세스가 임계 영역에 진입하는 것을 방해하면 안됨 →
Deadlock Free
3. Bounded Waiting(한정 대기)
Starvation(기아 상태)를 방지하기 위해 프로세스가 임계 영역에 들어가려고 요청한 후부터 다른 프로세스들이 임계 영역에 들어가는 횟수에 한계가 있어야 함 임계 영역에 한 번 들어갔다 나온 프로세스는 다음에 들어갈 때 제한을 둠 →
Starvation Free