본문 바로가기

Network Programing/Network 개념

쓰레드 동기화 기법

1. 동기화의 두 가지 관점

 - 실행 순서의 동기화 

  ㆍ쓰레드들이 정해진 특정 순서로 실행되어야 할때 필요


 - 메모리 접근의 동기화

  ㆍ멀티 쓰레드 기반시 메모리에 접근 할떄 사용

  ㆍ크리티컬섹션(Critical Section), 뮤텍스(Mutex), 세마포어(Semaphore) 등이 있따.


2. 동기화 주체로 나누어 본 두 가지 방법

 2.1 유저 모드 동기화

   - 커널의 힘을 빌리지 않는 동기화 기법이지만 커널의 전환이 불필요해서 성능상 이점이 있지만 그만큼 기능상의 제한이 있다.

   - 종류로는

     ㆍInterlockedXXX 계열 함수, Critical Section, SpinLock 


 2.2 커널 모드 동기화

  - 커널에서 제공하는 동기화 기능을 활용하는 방법

  - 커널 오브젝트를 생성하고 이를 조작하는 함수 호출로 동기호를 진행 

  - 커널 오브젝트 조작 함수가 호출될 떄마다 커널 모드로의 전환이 발생하므로 성능 저하가 있다.

  - 그러나 유저 모드 동기화에 비해 강력한 기능들을 제공한다.

  - 종류로는

    ㆍMutex, Semaphore, Event


3. 동기화 기법의 종류들

 3.1임계 영역(Critical Section)

  - 유저모드 동기화 객체

  - 유저 레벨의 동기화 방법 이며 동일한 프로세스 내에서만 사용이 가능하다.

  - 해당 코드에 접근하기 위해선 접근에 대한 Key가 필요하며 현재 접근한 쓰레드가 Key를 반환 하기 전까지 다른 코드의 접근을 불허한다.

  - 예)

    ㆍ화장실에 들어가기 위해선 Key가 필요하다.

    ㆍA가 화장실에 들어갈 때 Key를 가지고 들어간다. 이때 B는 화장실 Key가 없기 때문에 화장실에 들어갈수 없다

    ㆍ볼일을 다본 A가 Key를 제자리에 가져다 놓으면 B는 Key를 가지고 화장실에 들어간다.

       ※ 핵심 : 열쇠를 가진 사람만이 화장실에 들어갈수 있따.


 3.2 뮤텍스(Mutex)

  - 커널 모드 동기화 객체

  - 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 모든스레드에서 사용될 수 있는동기화 객체

  - 뮤텍스는 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.

  - ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른스레드들이 접근 가능하다.


3.3 세마포어(Semaphore)

  - 커널모드 동기화 객체

  - 뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.

  - 세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트 값은 3이다.

  - 객체 내부적으로 카운트를 관리하며 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다. 

  - 그래서 내부 카운트가 0이 되면 비신호 상태로 바뀐다. 

  - 세마포어를 사용하고 있는 스레드들중 ReleaseSemaphore 하면 세머포어 내부 카운트는 다시 1증가하며 신호 상태로 바뀌어 다른 스레드들이 사용가능하게 된다.