경쟁 상태 (Race Condition)
여러 개의 프로세스 또는 스레드가 공유된 자원/데이터에 접근하고 조작할 때, 실행 순서나 타이밍 등에 따라 예상치 못한 결과가 발생하는 상황
경쟁 상태가 발생하는 경우
- 동시성 접근 : 여러 프로세스나 스레드가 공유 변수에 동시에 접근하는 경우
- 두 개의 스레드가 동시에 공유 변수를 증가시키는 연산을 수행한다면, 스레드 간에 연산의 순서가 불확실해지고 일관성 없는 결과가 발생할 수 있다.
- 상호 배제(Mutual Exclusion)를 통해 해결 : 공유 변수에 대한 접근을 동시에 하지 못하도록 잠그는 메커니즘이다. 예를 들어, 임계 영역(Critical Section)을 설정하여 한 번에 하나의 프로세스/스레드만 접근 할 수 있도록 한다.
- 커널 작업을 수행하는 도중에 인터럽트 발생 : 커널 모드에서 데이터를 조작하고 있는 도중에 인터럽트가 발생하여 동일한 데이터를 조작하려는 경우
- 인터럽트 비활성화를 통해 해결 : 커널 모드에서 작업을 수행하는 동안 인터럽트를 비활성화하여 다른 인터럽트가 발생하지 않도록 하는 것이다. 이를 통해 커널 모드에서 동일한 데이터를 조작하는 인터럽트와의 충돌을 방지할 수 있다. 그러나 인터럽트를 비활성화하는 동안에는 다른 중요한 인터럽트나 타이머 등이 무시되므로, 사용 시점과 시간을 고려해야한다.
- 프로세스가 시스템 콜을 호출하여 커널 모드로 진입하는 경우 : 프로세스가 커널 모드에서 데이터를 조작하는 도중에 컨텍스트 스위칭이 발생하여 CPU 제어권이 다른 프로세스로 넘어가는 경우
- 원자성(Atomicity)을 통해 해결 : 컨텍스트 스위칭이 발생할 수 있는 시점에서의 데이터 조작을 원자적으로 수행한다. 즉, 여러 단계로 이루어진 연산을 하나의 불변적인 동작으로 처리해야 한다. 이를 위해 커널은 데이터 조작을 중간에 중단하지 않고 완전히 수행한 뒤에만 제어권을 다른 프로세스로 넘긴다.
임계 영역 (Critical Section)
- 공유 자원에 대한 접근을 제어하는 코드 영역
- 여러 개의 스레드나 프로세스가 동시에 공유자원에 접근하게 되면, 각각의 스레드나 프로세스가 자원을 수정하면서 경쟁 상태가 발생할 수 있다. 이러한 문제를 해결하기 위해 임계영역을 사용한다.
- 임계영역을 정의한 후, 해당 영역에 들어가기 위해서는 상호배제(Mutual Exclution)가 필요하다.
임계 영역 문제를 해결하기 위한 조건 3가지
- 상호 배제(Mutual Exclusion) : 임계영역에 한 번에 하나의 스레드만 접근할 수 있도록 하는 것
- 일반적으로 상호배제를 위해 잠금(Lock)이라는 도구를 사용. 잠금은 공유 자원에 대한 접근을 제어하는 동기화 메커니즘으로, 임계영역에 진입하기 전에 잠금을 획득하고, 임계영역에서 빠져나오면 잠금을 해제한다.
- 잠금 기법
- 뮤텍스: 임계영역에 진입할 때 락을 획득하고, 빠져나올 때 언락을 해제하는 단순한 동기화 메커니즘
- 세마포어: 카운터와 큐를 이용하여 여러 개의 스레드가 동시에 접근할 수 있는 자원의 개수를 제한하는 더 복잡한 동기화 메커니즘
- 진행(Progress) : 아무도 임계 영역에 있지 않을 때, 임계 영역에 들어가려는 프로세스가 무한히 대기하지 않고 언젠가는 들어갈 수 있어야 한다는 조건이다.
- 한정 대기(Bounded Waiting) : 프로세스가 임계 영역에 진입하기 위해 무한정 기다리는 상황(=starvation)이 발생해서는 안된다는 조건이다. 즉, 어떤 프로세스가 임계 영역에 들어가려고 기다리는 횟수에 제한이 있어야 한다.
임계 영역 문제 해결 방법
- 유저모드 동기화(User-Mode Synchronization)
- 임계 영역 문제를 해결하기 위해 운영체제의 커널 기능을 사용하지 않고 사용자 모드에서 구현하는 방법
- 주로 뮤텍스(Mutex)와 같은 동기화 기법을 사용한다.
- 장점 : 커널 모드로의 진입과 종료가 필요하지 않아서 성능이 더 빠를 수 있다.
- 단점 : 사용자 모드에서 실행되기 때문에 특정 커널 기능에 접근할 수 없고, 커널 리소스에 직접 접근할 수 없는 등의 제한이 있다.
- 주로, 단일 프로세스 내에서의 동기화에 사용된다.
- 커널모드 동기화(Kernel-Mode Synchronization)
- 임계 영역 문제를 해결하기 위해 운영체제의 커널 기능을 사용하는 방법
- 커널에 의해 제공되는 동기화 기법(세마포어, 이벤트, 뮤텍스, 조건 변수, 등)들을 사용한다.
- 장점 : 커널 기능을 사용하여 고급 동기화 기법을 구현할 수 있으며, 여러 프로세스 또는 스레드 간의 동기화에 사용할 수 있다.
- 단점 : 커널 모드로의 진입과 종료가 필요하므로 성능이 유저모드 동기화보다 상대적으로 느릴 수 있다.
단일 프로세스의 경우 유저모드 동기화를 사용하여 성능을 향상시키는 것이 좋고, 다중 프로세스 또는 스레드 간의 동기화가 필요한 경우에는 커널모드 동기화를 사용해야한다.
'Computer Science > Operating System' 카테고리의 다른 글
[OS] 페이징 (Paging) & 세그멘테이션 (Segmentation) (0) | 2023.06.10 |
---|---|
[OS] 세마포어 (Semaphore) & 뮤텍스 (Mutex) (0) | 2023.06.10 |
[OS] 데드락 (Deadlock) (0) | 2023.06.03 |
[OS] CPU 스케줄러 (0) | 2023.06.02 |
[OS] IPC (Inter Process Communication) (0) | 2023.05.28 |