블로그는 나의 힘!
[ Programing ]/C++2021. 9. 28. 05:30

알레폰드의 IT, 기계, 전기 이모저모 (tistory.com)

 

C, C++ C# UI Thread, 스레드, 쓰레드 크리티컬 섹션 Event, CriticalSection, Mutex, Semaphore 등등 관련

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 출처: http://pkss...

202psj.tistory.com

 

# 쓰레드
프로세스를 이루는 기본 단위. 일률적인 순서대로 원하는 작업을 수행.
어플리케이션 일부가 비동기적이고 병렬적.

코드의 복사본을 여러개 수행하여 여러가지 클라이언트에게 동일한 서비스 제공.
블록(죽어버릴수 있는)될 가능성이 있는 작업을 수행할 때 방지할 수 있음.
멀티프로세서 시스템을 효과적 사용.



# 동기화
동기화 기법
임계영역(Ciritical Section) : 공유 리소스에 오직 하나의 스레드만 허용.(한 프로세스에 속한 스레드만 사용)
   - 2개 이상의 스레드가 공유 리소스 접근 시 오직 하나의 스레드 접근만 허용해야 하는 경우에 사용.
   - 뮤택스와 다른 점은 단일 프로세서에 한해서만 동작이 가능하다는 것.
뮤택스(mutex) : 공유 리소스에 오직 하나의 스레드만 허용.(서로 다른 프로세스에 속한 스레드도 사용)
이벤트(event) : 틀정 사건 발생을 다른 스레드에 알림.
세마포어(semaphore) : 한정된 개수의 자원을 여러 스레드가 사용할려고 할때 접근 제한.

유저모드 동기화
: 커널 힘을 빌리지 않는 동기화 기법
  동기화 위해 커널로의 전환이 불필요하기에 성능상 이점은 있으나 그만큼 기능상의 제한이 있음.
  종류로는 InterlockedXXX 계열 함수, CriticalSection, SpinLock

커널모드 동기화
: 커널에서 제공하는 동기화 기능을 활용하는 방법
  커널 오브젝트를 생성하고 이를 조작하는 함수 호출로 동기화 진행.
  커널 오브젝트 조작 함수가 호출될 때마다 커널 모드로의 전환이 발생하므로 성능 저하 있음.
  하지만, 유저 모드 동기화 비해 더 많은 기능 제공.
  종류로는 Mutex, Semaphore, Event


# 멀티스레드 모델
Boss/Work Model
스레드가 필요에 따라 작업자 스레드를 만들어 내는 경우 접속받는 부분을 주 스레드(boss)로 설정,
접속 요청이 오면 새로운 스레드(worker)를 만들어 사용자와 연결하는 방법.

Work Crew Model
어떠한 작업을 여러 개의 스레드가 나뉘어 실행.
집 청소 예를 들면 방바닦 닫는 스레드, 창문 닫는 스레드, 먼지 터는 쓰레드
집 청소 하는 작업이 스레드 하나가 되는 것.

Pire Lining Model (파이프 라이닝)
순서대로 실행되어야 할 작업이 여러개가 있다면, 
작업1은 작업2에게 전달하고 작업2는 작업3에게 전달하는 방식.
순차적으로 진행되어야 하지만 최종 결과를 여러개 만들기 위해 동시에 수행될 필요가 있을 경우.
공장을 예로 서로 다른 작업 수행하지만 결국 하나의 결과물을 만들어 내기 위한 과정.

# Cirital Sesction 용어
임계영역. 공유 자원을 접근하는 프로세스 내부의 코드 영역.
동기화 기법과 같은 단어지만 뜻은 다르다.


# 스레드 풀
응용 프로그램 대신하여 비동기 콜백을 효율적으로 실행하는 작업자 스레드 컬렉션.
과도한 스레드 생성을 방지하고, 스레드를 적절한 수만큼 관리해 성능을 높여주는 기능.
스레드를 다 쓰면 Kill 하지 않고 수거해 재활용한다.
단점은 스레드가 계속 생성되어 있는 상태라 낭비가 있다.

# 용어 정리.
Cirital Sesction
임계영역. 공유 자원을 접근하는 프로세스 내부의 코드 영역.
용어로 사용할때는 동기화 기법(임계영역)과 같은 단어지만 뜻은 다르다.

DeadLock
교착 상태. 2개 이상의 프로세스들이 더 이상 진행을 할수 없는 상태.

LiveLock
2개 이상의 프로세스들이 다른 프로세스의 상태 변화에 따라 자신의 상태를 변화시키는 작업만 수행하고 있는 상태.

Race Condition
경쟁상태. 2개 이상의 프로세스가 공유 자원을 동시 접근하려는 상태.

Starvation
기아. 특정 프로세스가 수행 가능한 상태임에도 불구하고 매우 오랜 시간 자원을 사용하지 못하는 상태.

Mutual Exclusion
상호배제. 
한 프로세스가 공유 자원을 접근하는 임계영역 코드를 수행하고 있으면 
다른 프로세스들은 공유 자원을 접근하는 임계영역 코드를 수행할 수 없는 조건.

# Context Switch
CPU가 다른 프로세스로 교환하기 위해 이전의 프로세스 상태를 보관하고, 새로운 프로세스의 상태를 적재하는 작업.
process context switch가 thread context switch 보다 시간이 더 소요.

# Spin Lock
Ciritical section은 multiple-CPU 상에서 사용할 수 없다면, 커널모드의 semaphore를 사용하여 대기중 스레드 관리.
semaphore는 Ciritical section을 다른 스레드에서 사용 중이라면 context-switching을 하여 CPU 소유권을 반납하고, 
다시 자신의 차례가 되면 Ciritical section 를 조사해 사용 중일때 다시 위 동작을 반복하며 대기(busy waiting)

이러한 빈번한 context-switch를 방지 위해 일정 시간 동안 Ciritical section 사용이 끝나기를 기다리는 것이 스핀락.

 

'[ Programing ] > C++' 카테고리의 다른 글

모두의 코드  (0) 2021.10.28
C++ Json Type 대입.  (0) 2021.10.25
C++ JSON 파싱  (0) 2021.09.17
C++ Json Param ParsingBind  (0) 2021.02.03
C++ 시간 차이 -> 남은 시간 계산하기.  (0) 2020.12.23
Posted by Mister_Q