경쟁상태(Race Condition)란?
- 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어 졌는지에 따라 그 실행 결과가 달라지는 상황을 말한다.
Race의 뜻 그대로, 간단히 말하면 경쟁하는 상태, 즉 두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 말한다.
경쟁상태가 발생하는 경우
- 커널 작업을 수행하는 중에 인터럽트 발생
- 문제점 : 커널모드에서 데이터를 로드하여 작업을 수행하다가 인터럽트가 발생하여 같은 데이터를 조작하는 경우
- 해결법 : 커널모드에서 작업을 수행하는 동안, 인터럽트를 disable시켜 CPU제어권을 가져가지 못하도록 한다.
- 프로세스가 'System call'을 하여 커널모드로 진입하여 작업을 수행하는 도중 문맥교환이 발생할 때
- 문제점 : 프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU제어권이 프로세스2로 넘어가서 같은 데이터를 조작하는 경우 ( 프로세스2가 작업에 반영되지 않음 )
- 해결법 : 프로세스가 커널모드에서 작업을 하는 경우 시간이 초과되어도 CPU제어권이 다른 프로세스에게 넘어가지 않도록 한다.
- 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
- 문제점 : 멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
- 해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 한다.
임계 영역(Critical Section)이란?
- 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그램 코드
- 프로세스 간에 공유 자원을 접근하는 것에 있어 문제가 발생하지 않도록 공유 자원의 독점을 보장해줘야 하는 영역이다.
임계 영역 문제를 해결하기 위해서는 아래의 3가지 조건을 충족해야 한다.
- Mutual Exclusion (상호 배제) : 한 프로세스가 자신의 임계 영역이면, 다른 프로세스들은 임계 영역에 진입할 수 없다.
- Progress (진행) : 아무도 임계 영역에 있지 않다면, 진입하고자 하는 프로세스를 진입하게 해줘야한다. 즉 임계 영역에 아무도 진입하지 못하고 있으 안되며, 다음에 어떤 프로세스가 임계 영역에 진입해야 하는지 일정 시간 내에 결정되야 한다.
- Bounded Waiting (유한 대기) : 프로세스가 임계 영역에 진입하기 위해 무한정으로 기다리는 현상(Starvation)이 발생해서는 안된다.
임계 영역 해결방법
1. 유저모드의 동기화
- 커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법 (ex.피터슨 알고리즘)
2. 커널모드의 동기화
- 커널에서 제공하는 동기화 기능을 활용하는 방법
커널 모드로의 변경이 필요하므로 성능 저하가 있지만 다양한 기능 활용이 가능하다.
각 프로세스들 안의 스레드들끼리의 동기화도 가능하다. 세마포, 뮤텍스, 모니터 등의 방법이 있다.
출처
https://velog.io/@yh_lee/Race-Condition%EA%B2%BD%EC%9F%81%EC%83%81%ED%83%9C
https://gyoogle.dev/blog/computer-science/operating-system/Race%20Condition.html
'운영체제' 카테고리의 다른 글
Docker & 가상화 (0) | 2024.09.13 |
---|---|
Sync/Async & Blocking/Non-Blocking (0) | 2024.09.01 |
상호 배제 / 동기화 (Mutex, Semaphore, Monitor) (0) | 2024.09.01 |
교착상태 / 기아상태 (0) | 2024.08.17 |
프로세스(Process) vs 스레드(Thread) (0) | 2024.08.16 |