이번 포스팅은 동시성 관련으로 프로그래밍을 하다보면 피할수 없는 이슈 Lock의 개념들에 대해 설명하는 포스팅입니다
임계 구역(critical section) 또는 공유변수 영역은 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다.
출처:위키피디아_임계구역
모든 Lock은 임계구역에 진입시점을 관리하기위함입니다.
SpinLock은 쓰레드(or 프로세스)를 반납하지 않고 계속 lock점유를 시도합니다.
이 과정을 Busy Wating이라 합니다
바쁜 대기(영어: busy waiting 또는 spinning)란 어떠한 특정 공유자원에 대하여 두 개 이상의 프로세스나 스레드가 그 이용 권한을 획득하고자 하는 동기화 상황에서 그 권한 획득을 위한 과정에서 일어나는 현상이다.
출처:위키피디아_바쁜대기
쓰레드가 Context Switching을 하지 않기 때문에 lock을 빠르게 잡을 수만 있다면 효율이 굉장히 좋습니다
반대로 임계구역의 작업이 수행시간이 길어서 Lock의 시간이 높다면 굉장히 비효율적인 Lock입니다.
즉 작업이 아주 작은단위라면 효율적 일 수 있습니다.
Mutex는 Lock을 점유하지 못하면 쓰레드를 반납하고 대기 후 점유를 시도합니다.
Mutex는 임계구역에 딱 한개의 쓰레드만이 접근이 가능합니다.
또 다른 특이사항이라면 Mutex의 경후 락을 잡은 자신만이 해당 임계구역에 진입이 가능하기 때문에 필수적으로 Lock을 해제하여야 합니다.
Java의 synchronized 키워드와 ReentrantLock의 경우 Mutex로 동작합니다.
Semaphore는 Mutex와 다르게 n개의 쓰레드가 임계영역에 진입 할 수 있습니다.
Lock을 걸지 않은 쓰레드에서 Semaphore의 Lock의 해제가 가능합니다.
간단 요약하면 다음과 같습니다
그런데 위 설명들은 다 쓰레드에서 접근을 기준으로 설명하고있습니다.
하지만 DB같은 외부서비스를 임계구역으로 지정해서 관리해야할수도있습니다.
더구나 여러 프로세스의 접근까지 같이 관리되어야할때는 어떻게 해야할까요?
내부에서야 synchronized 키워드와 Lock을 이용하면 되지만 외부 프로세스는 해당 부분으로 관리 할수없습니다.
그럴때 사용하는 Lock의 종류가 분산락입니다.
간단히 요약하자면
redis나 DB처럼 애플리케이션 외부의 구역에 대한 접근을 관리해야할때 사용되는 락입니다.