Synchronization(동기화)

동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고 받는데, 협력하여 실행하는 프로세스들의 실행 순서와 자원 일관성을 보장하기 위해 동기화가 필요하다. 동기화는 프로세스들 사이의 수행 시기를 맞추는 것을 의미하는데, 정확히는 아래 두 가지를 의미한다.

  • 실행 순서 제어: 프로세스를 올바른 순서대로 실행

  • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하도록 제한

여기서 프로세스뿐만 아니라 스레드도 동기화 대상이 될 수 있다.(실행의 흐름을 갖는 모든 것은 동기화의 대상)

공유 자원과 임계 구역

여러 프로세스가 공유하는 자원을 공유 자원이라고 하며, 동시에 실행하면 문제가 발생할 수 있는 코드 영역을 임계 구역이라고 한다. 임계 구역을 동시 다발적으로 실행하면 문제가 발생하는데, 이를 레이스 컨디션이라고 한다.

레이스 컨디션이 발생하면 데이터 일관성 문제가 발생하기 때문에, 이런 문제를 해결하기 위해 세 가지 원칙하에 임계 구역을 문제를 해결하고 있다.

  • 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에서 실행되면 다른 프로세스는 임계 구역에서 실행될 수 없다.

  • 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면, 임계 구역이 진입하고자 하는 프로세스는 진입할 수 있어야 한다.

  • 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면, 그 프로세스는 언젠가는 진입할 수 있어야 한다.

동기화 기법

운영체제는 프로세스 동기화를 위해서 뮤텍스 락 / 세마포 등의 동기화 기법을 제공한다.

  • 뮤텍스 락

    • 설명

      • 뮤텍스(Mutex)는 Mutual Exclusion의 약자로, 자원에 대한 상호 배제를 보장하는 동기화 기법

      • 뮤텍스 락은 하나의 스레드 또는 프로세스가 공유 자원에 접근하는 동안 다른 스레드나 프로세스가 그 자원에 접근하지 못하도록 차단

      • 오직 하나의 스레드만 자원을 사용하도록 보장하여 데이터의 일관성과 무결성을 유지

    • 동작 방법

      1. 잠금(Lock): 스레드가 자원에 접근하려고 하면, 뮤텍스 락 획득(잠긴 경우 대기)

      2. 자원 사용: 뮤텍스를 성공적으로 잠근 스레드는 자원에 접근하여 작업을 수행

      3. 잠금 해제(Unlock): 자원의 사용이 끝나면, 뮤텍스 락을 해제하고, 대기 중인 다른 스레드 중 하나가 자원에 접근할 수 있도록 함

  • 세마포(Semaphore)

    • 설명

      • 세마포는 자원의 접근을 계수로 제어하는 동기화 기법

      • 세마포는 일반적으로 정수 값을 가지고 있으며, 이 값을 통해 여러 스레드나 프로세스가 제한된 수의 자원에 접근할 수 있도록 관리

      • 세마포는 뮤텍스와 달리 다수의 자원에 대한 접근을 관리할 수 있으며, 카운팅 세마포와 바이너리 세마포로 구분

    • 동작 방법

      1. P(Wait): 스레드가 자원에 접근하려고 할 때, 세마포 값을 확인하여 0보다 크면 값을 1 감소시키고 자원에 접근(0인 경우 대기)

      2. V(Signal): 스레드가 자원의 사용을 마치면 세마포 값을 1 증가 시킴

뮤텍스와 세마포의 차이점

특징뮤텍스(Mutex)세마포(Semaphore)

자원 관리

단일 자원 관리

다수의 자원 관리 가능

값의 범위

0과 1 (바이너리)

0 이상 (카운팅 세마포)

사용 목적

상호 배제가 필요한 경우

다수의 자원에 대한 접근 제어

소유권

락을 획득한 스레드만 락 해제 가능

락 해제는 특정 소유권 없음

동작 방식

하나의 스레드만 자원에 접근 허용

다수의 스레드가 제한된 자원 수만큼 접근 가능

유형

바이너리 락

바이너리 및 카운팅 세마포

대기 상태

자원이 잠겨 있을 때 스레드 대기

자원이 부족할 때 스레드 대기

참고자료

Last updated