프로세스 동기화

프로세스와 스레드들은 내부에서 스레드끼리 자원을 공유하며, 이 과정에서 자원의 순서와 같은 일관성을 보장해야 하기위해 동기화가 되어야합니다.

즉, 프로세스들 사이의 실행순서를 조정하는 방법입니다.

공유된 자원에 대한 멀티 프로세스 및 멀티 스레드 환경에서 동시접근에 대한 일관성을 보장하기위해 다양한 방법들이 있으며 그중 임계영역(Critical Section), 뮤텍스(Mutex), 세마포어(Semaphore)에 대해 알아보겠습니다.

 

임계영역(Critical Section)

멀티프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 데이터 및 코드들의 영역입니다.

임계영역에 동시에 접근하는것을 방지하여 자원의 일관성 및 원자성을 지키기 위해 한번에 하나의 프로세스 또는 스레드만 실행할 수 있도록 보호하는 영역입니다.

  • 임계 영역에 접근하기 위해 동기화 메커니즘(세마포어, 뮤텍스 등)이 필요하다.
  • 여러 스레드가 동시에 진입하면 데이터의 무결성(일관성)이 지켜지지 않는다.
  • 동기화 메커니즘이 없는 경우, 레이스 컨디션(Race Condition)이 발생할 수 있다.
    • 임계구역에 동시에 접근하여 자원의 일관성이 깨지는 경우

 

이러한 임계영역의 사용 및 원자성과 일관성을 보호하기위한 방법은 세가지 원칙을 가지고 있습니다.

  1. 상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스 또는 스레드만 임계영역에 진입하도록 보장하는 원칙
  2. 진행 (Progress) : 임계 영역에 접근하려는 프로세스 또는 스레드가 있을 때, 접근한 프로세스 중 하나가 반드시 선택되어야한다.
  3. 한정된 대기 (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)할 수있다.
    • 세마포어의 경우 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.
  • 세마포어 : 자원의 수량을 제어한다.
  • 뮤텍스 : 자원의 단일 접근을 보장한다.

 

 

 

'OS , 네트워크' 카테고리의 다른 글

동기, 비동기, 블로킹, 논블로킹  (1) 2025.03.11
OSI 7계층  (0) 2025.03.10
TCP/IP 4계층  (0) 2025.02.06
TCP 와 UDP의 특징 및 차이점  (0) 2025.01.06

+ Recent posts