쓰레드는 비동기적으로 동작한다.
비동기적이다라는 것은 여러 쓰레드들이 각자의 일에 순서 없이 실행된다.
여러 개의 쓰레드가 동시에 수행되는 경우 자원에 대한 충동/오류나 데이터의 무결성을 깨뜨릴 수도 있다.
이런 충돌/오류는 시스템이 정상적으로 돌아갈 수 못하게 할 수 있는데 Deadlock을 발생시킬 수도 있다.

이를 예방하기 위해 쓰레드 동기화 처리를 한다.
동기화 방식에서는 프로그래밍을 통해 동시에 동작하는 쓰레드들이 특정 자원에 대해서 접근을 순서대로 하도록 해준다.

쓰레드가 2개 이상 수행되는 경우 쓰레드 동기화가 필요하다.
서로의 처리내용이 관련성이 없다면 동기화할 필요가 없지만, 관련성이 있다면 동기화가 필요하다.

동기화를 통해 공유자원에 대한 접근을 제어해야 한다. 
공유자원이란 처리 중에 필요한 메모리, 파일, 디스크 등이다.
공유자원에 쓰레드들이 동시에 접근해서 값을 읽거나 쓰려고 하면 무결성을 깨뜨리고, 해당 데이터에 대한 신뢰도가 사라진다.

상호 배재 (Mutual Exclusion)
- 특정 프로세스가 공유자원을 사용하고 있는 경우 다른 프로세스가 사용하지 못하도록 제어한다.
- 동시에 공유자원을 사용하려 할 때 각 프로세스가 번갈아 가며 공유자원을 사용하도록 임계 구역을 유지한다.

임계 영역 (Critical Section)
- 공유자원을 사용하는 부분)에 한 번에 하나의 프로세스만 진입이 가능하도록 한다.
- 임계영역은 하나의 프로세스가 독점할 수 없다.

상호 배재를 달성하기 위한 기법으로 세마포어, 뮤텍스를 사용한다.
세마포어(Semaphore), 뮤텍스(mutex)는 여러 프로세스나 쓰레드가 공유자원에 접근하는 것을 제어하기 위한 방법이다.

세마포어(Semaphore)
- 세마포어 변수, 대기큐, P연산, V연산으로 구성
- 세마포어는 정수값을 가지는 변수이며, 그 정수 값이 임계 영역에 접근시킬 수 있는 최대 허용치이다. (화장실이 5개면 최대 5명만 이용 가능)
- 임계영역에 들어갈 때 세마포어 값을 감소, 값이 음수라면 다른 프로세스/쓰레드가 임계 영역 진입 불가
- 임계영역에서 나올 때 세마포어 값을 증가

뮤텍스(mutex)
- 임계영역에 들어갈 때 LOCK을 걸어 다른 프로세스/쓰레드가 접근하지 못하도록 하고, 임계 영역을 나올 때 UNLOCK 한다.
- 값을 0과 1만 가지는 이진 세마포어와 유사함

'기타' 카테고리의 다른 글

넷백업 (Netbackup)과 장애  (0) 2021.02.26
AWS EC2 RabbitMQ설치  (2) 2019.05.14