Race Condition
- 경쟁 상태
- 여러 스레드가 공유된 자원에 동시에 접근하여 그 순서와 타이밍에 따라 결과가 달라지는 상황을 말한다.
- 이런 경우, 실행할 때마다 다른 결과를 얻는다.
- 컴퓨터의 작동에서 일반적으로 발생하는 결정적 결과와 달리, 결과가 어떠할지 알지 못하거나 실행할 때마다 결과가 다른 경우를 비결정적(Indeterminate)인 결과라고 부른다.
Critical Section
- 임계 영역
- 멀티스레드가 같은 코드를 실행할 때 "경쟁 상태"이 발생하기 때문에, 이러한 코드 부분은 임계 영역(Critical Section)이라고 부른다.
- 공유 자원에 접근하지만, 동시에 여러 스레드에서 실행되면 안 되는 코드 부분이다.
Mutual Exclusion
- 상호 배제
- 동기화 기법의 하나
- 락이나 세마포어 등을 사용하여 구현할 수 있다.
- 동시에 실행되는 여러 개의 스레드나 프로세스가 공유된 자원에 접근할 때, 한 번에 하나의 스레드 또는 프로세스만이 접근할 수 있도록 제한하는 개념이다.
- 즉, 상호 배제를 통해 여러 스레드가 동시에 같은 자원을 수정하거나 접근하는 것을 방지하여 데이터의 일관성과 정확성을 보장한다.
- 이를 통해 동시성 문제인 Race Condition을 방지하고, 안전하게 공유 자원을 사용할 수 있다.
- 상호 배제를 구현할 때는 데드락이 발생할 수 있으므로, 이를 고려하여 설계하고 검증해야 한다.
상호 배제 기법
데이터 일관성을 유지하고, 경쟁 상태를 방지하기 위한 상호 배제 기법들이 존재한다.
- 락(Lock)과 세마포어(Semaphore): 락과 세마포어는 가장 일반적인 상호 배제 메커니즘이다. 락은 단일 스레드만이 특정 자원에 접근할 수 있도록 하는 동기화 객체이다. 세마포어는 동시에 접근 가능한 스레드 수를 제어하여 상호 배제를 달성한다.
- 뮤텍스(Mutex): 뮤텍스는 락의 한 유형으로, 상호 배제를 위해 사용된다. 뮤텍스는 한 번에 하나의 스레드만이 잠금(lock)을 획득하고 접근할 수 있도록 보장한다.
- 원자적 연산(Atomic Operations): 원자적 연산은 하나의 연산으로 인식되어 동시에 접근되는 상황에서 데이터의 일관성과 상호 배제를 보장한다. 원자적 연산은 스레드 간의 경쟁 상태(Race Condition)를 피하는 데 도움이 된다.
- 조건 변수(Condition Variable): 조건 변수는 스레드의 실행 흐름을 제어하고 상호 배제를 구현하는 데 사용된다. 스레드는 조건 변수를 사용하여 특정 조건을 기다리거나 신호를 보내는 방식으로 상호 배제를 달성할 수 있다.
'IT > CS' 카테고리의 다른 글
[네트워크] 웹소켓(WebSocket) (0) | 2023.07.07 |
---|---|
백엔드 Node.js를 쓰는 이점 (0) | 2023.07.05 |
[OS] 멀티스레딩(Multi-Threading) (0) | 2023.05.29 |
[OS] 운영체제 개요 (0) | 2023.05.28 |
[OS] 동시성과 병렬성 (0) | 2023.05.26 |