OS , 네트워크
프로세스 동기화 - 세마포어, 뮤텍스, 임계영역
KimGeon-U
2025. 1. 3. 20:36
프로세스 동기화
프로세스와 스레드들은 내부에서 스레드끼리 자원을 공유하며, 이 과정에서 자원의 순서와 같은 일관성을 보장해야 하기위해 동기화가 되어야합니다.
즉, 프로세스들 사이의 실행순서를 조정하는 방법입니다.
공유된 자원에 대한 멀티 프로세스 및 멀티 스레드 환경에서 동시접근에 대한 일관성을 보장하기위해 다양한 방법들이 있으며 그중 임계영역(Critical Section), 뮤텍스(Mutex), 세마포어(Semaphore)에 대해 알아보겠습니다.
임계영역(Critical Section)
멀티프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 데이터 및 코드들의 영역입니다.
임계영역에 동시에 접근하는것을 방지하여 자원의 일관성 및 원자성을 지키기 위해 한번에 하나의 프로세스 또는 스레드만 실행할 수 있도록 보호하는 영역입니다.
- 임계 영역에 접근하기 위해 동기화 메커니즘(세마포어, 뮤텍스 등)이 필요하다.
- 여러 스레드가 동시에 진입하면 데이터의 무결성(일관성)이 지켜지지 않는다.
- 동기화 메커니즘이 없는 경우, 레이스 컨디션(Race Condition)이 발생할 수 있다.
- 임계구역에 동시에 접근하여 자원의 일관성이 깨지는 경우
이러한 임계영역의 사용 및 원자성과 일관성을 보호하기위한 방법은 세가지 원칙을 가지고 있습니다.
- 상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스 또는 스레드만 임계영역에 진입하도록 보장하는 원칙
- 진행 (Progress) : 임계 영역에 접근하려는 프로세스 또는 스레드가 있을 때, 접근한 프로세스 중 하나가 반드시 선택되어야한다.
- 한정된 대기 (Bounded Waiting) : 프로세스가 임계영역에 접근하기 위해 대기할 떄 그 대기시간이 한정되있어야한다.
뮤텍스 (MUTual EXclusion)
MUTual EXclusion, 상호배제입니다. 멀티 프로세스 및 멀티 스레드 환경에서 임계영역을 가진 스레드들의 공유 불가능한 자원의 동시 사용을 막기위해 사용되는 알고리즘으로, 임계구역에서 구현됩니다.
멀티 프로세스들의 공유 자원에 대한 접근을 제한하기위해 Lock과 Unlock를 사용합니다.
- 멀티 프로세스 및 멀티스레드 환경에서 공유자원의 동시 사용을 방지해 원자성을 유지한다.
- lock 과 Unlock을 사용하여 스레드들을 제어한다.
- lock을 가진 스레드만이 해당 임계구역에 접근할 수있다.
- 작업이 끝난 스레드는 Unlock을 사용하여 lock상태를 해제한다.
- 단일 자원 보호에 최적화되어있으며, 사용이 간단하고 직관적이다. / 동기화 대상 자원(스레드)은 하나이다.
- 특정 스레드가 소유권을 가지고 있는것을 확인할 수 있어 상태 관리가 명확하다.
std::mutex mtx; // 뮤텍스 선언
int sharedCounter = 0; // 공유 자원
void incrementCounter() {
for (int i = 0; i < 5; ++i) {
mtx.lock(); // 임계 영역 시작
// ...
mtx.unlock(); // 임계 영역 종료
}
}
세마포어 (Semaphore)
카운터(Counter)를 사용하여 공유하는 자원에 대한 동시 접근을 제한하는 방법입니다.
- 사용 가능한 자원의 개수는 0개 이상의 정수(S)로 표현한다.
- P(Wait) : 세마포어 값을 감소시키며, 값이 음수일 경우 해당 프로세스는 대기한다.
- V(Signal) : 세마포어 값을 증가시키며, 대기중인 프로세스를 꺠울 수 있다.
- S가 1일 경우 뮤텍스가 될 수 있다.
- 변수값을 수정하는 연산은 원자성(Atomicity
- 여러 자원에 대한 동시 접근을 제어 할 수 있다.
- 설계가 복잡하며, 교착상태(Dead Lock)이 발생할 수 있다.
void accessResource() {
sem.acquire(); // 세마포어 획득
{
// 임계 영역
// ... 공유자원에 대한 접근 및 사용
// 임계 영역
}
sem.release(); // 세마포어 해제
}
뮤텍스 VS 세마포어
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
- 세마포어 S의 값이 1일 경우, 뮤텍스가 될 수 있다.
- 세마포어는 소유가 아닌 대여 형태이며, 뮤텍스는 소유권을 가지고 있다.
- 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 해당 뮤텍스를 해제(Unlock)할 수있다.
- 세마포어의 경우 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.
- 세마포어 : 자원의 수량을 제어한다.
- 뮤텍스 : 자원의 단일 접근을 보장한다.