레이스 컨디션
상황을 막기 위해 프로세스/스레드들에 하나의 자원에 대한 처리권한
을 주거나순서
를 조정해주는 기법이다.다중 스레드
환경에 공유되는 자원이 있다면 필수적으로 고려해야한다.- 프로세스의 경우 OS 레벨에서 공유 자원 문제를 처리해주지만 한 프로세스 내에서 실행되는 여러 개의 스레드들은 공유 자원에 대해 동기화 문제를 고려해야한다.
- 스레드 동기화는 모니터(
Monitor
)와 세마포어(Semaphore
)로 구성된다. - 사용하는 시스템이나 언어에서
어느쪽을 지원
하는지에 따라 선택해서 사용한다.- Java는 기본적으로 모니터를 지원한다.
- 스레드 동기화는 공유 자원에 접근하기 위해 자물쇠의 획득과 해제에 비용이 든다. 따라서 라이브러리를 별도로 만드는 편이다.
- ex) Java의
StringBuffer
,StringBuilder
- ex) Java의
- 상호 배제 자물쇠(mutual exclusion lock)로 보호되는 루틴의 집합을 일컬음
- 자물쇠를 획득하기 전까지 모니터에 속하는 루틴을 실행할 수 없다.
- 즉 한 모니터에 한 스레드씩 실행되며, 다른 스레드들은 실행중인 스레드가 자물쇠를 놓아줄 때까지 기다려야한다.
- 모니터에 속하는 스레드가 다른 이벤트 발생을 기다리기 위해 스스로 멈추면 다른 스레드가 모니터로 진입할 수 있다.
- 대기중인 스레드가 이벤트가 발생했다는 연락을 받으면 스레드가 깨어나서 자물쇠를 재획득하게 된다.
- 세마포어는 모니터와 비슷하지만 더 간단하다.
- 공유 자원을 보호하기 위한 자물쇠만 있다.
- 스레드에서 공유자원을 사용하기 위해 자물쇠를 획득해야한다.
- 자물쇠를 쥐고 있는 스레드에서 놓아주기 전까지 그 자원을 획득하려는 스레드는 막히게된다.
- 자물쇠를 놓아주는 순간 자물쇠를 획득하려고 대기하던 스레드가 그 자물쇠를 획득한다.
- 가장 기본적인 방식의 세마포어를 상호 배제(mutual exclusion, 줄여서 뮤텍스 mutex라 부름) 세마포어라 한다.
- 모니터가 자물쇠의 획득과 해제를 모두 자동으로 처리해줘서 쓰기에 간단하다.
- 세마포어는 획득한 자물쇠를 해제하는 작업을 일일이 해줘야한다.
공유 자원
에 여러 프로세스/스레드가 동시에 접근하기 위해경쟁
하는 상태를 뜻한다.- ex) OS에서 CPU 점유율 등
동기화 처리
를 제대로 하지 않으면 의도하지 않은 잘못된 결과가 나올 수 있다.