본문 바로가기

Operating System

[OS] 스레드의 동기화 기법 - 유저 모드 동기화/커널 모드 동기화

스레드는 메모리의 구조 중 스택 영역을 제외한 코드/데이터/힙 영역을 공유한다.

이 때 여러 스레드가 동시에 같은 자원에 접근하는 것을 막기 위해 동기화 기법을 취해야 한다.

 

스레드의 동기화 기법

  1. 실행 순서의 동기화
    1. 스레드의 실행 순서 정의, 이 순서에 반드시 따르도록 하는 것
    2. 한 순간에 하나의 스레드만 접근
  2. 메모리 접근에 대한 동기화
    1. 메모리 접근에 있어서 동시 접근 막는 것
    2. 실행 순서가 중요한 상황이 아닌 경우, 한 순간에 하나의 스레드에만 접근하면 되는 상황

동기화 기법의 두 가지 구분

  1. 유저 모드 동기화
    1. 커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법
    2. 성능상의 이점, 기능상의 제한(라이브러리를 이용)
    3. 종류
      1. 크리티컬 섹션 기반 동기화
        - 메모리 접근 동기화에 사용. 임계영역 객체(Key)를 만들고 초기화해야 함(반드시 거쳐야 하는 과정)
      2. 인터락 함수 기반 동기화
        - 메모리 접근 동기화에 사용. 함수 내부적으로 한 순간에 하나의 스레드에 의해서만 실행되도록 동기화. 전역으로 선언된 변수 하나의 접근 방식을 동기화하는 것이 목적일 경우 사용
  2. 커널 모드 동기화
    1. 커널에서 제공하는 동기화 기능을 활용하는 방법
    2. 커널 모드로의 변경이 필요하므로 성능 저하, 다양한 기능 활용 가능
    3. 기능상 우수, 속도 떨어짐
    4. 각 프로세스들 안의 스레드들끼리의 동기화도 가능
    5. 종류
      1. 뮤텍스 기반의 동기화
        - 메모리 접근 동기화에 사용. 키의 취득과 반납이 이루어짐
      2. 세마포어 기반의 동기화
        - 메모리 접근 동기화에 사용. 카운트를 셈
      3. 이름 있는 뮤텍스 기반의 동기화
        - 프로세스간 동기화에 사용. 프로세스 동기화를 하기 위해서 뮤텍스를 동기화해야 하는데 커널 오브젝트는 각각 프로세스에 독립적이므로 뮤텍스에 이름 붙여서 접근
      4. 이벤트 기반의 동기화
        - 실행순서 동기화에 사용

 

마지막으로 중요한 용어니까 한 번 더 상기하고 가자.

임계영역(Critical Section)

  • 공유 자원으로, 문제 원인이 될 수 있는 코드 블록
  • 배타적 접근(한 순간에 하나의 스레드만 접근)이 요구되는 리소스에 접근하는 코드 블록