Lock이란?

멀티 쓰레드 환경에서 여러 스레드가 공유 자원(힙,데이터)에 안전하게 접근 할 수 있도록 동기화를 제공하는 메커니즘이다.  

 

사용방법

  1. Lock 획득 : 임계 영역에 진입하기 전에 Lock을 획득한다. 이과정에서 다른 스레드가 동일한 자원에 접근하지 못하게 된다.
  2. 임계영역 실행 : Lock을 획득한 스레드는 임계 영역에서 작업을 수행한다. 이 때 다른 스레드는 Lock을 획득하기 위해 대기 상태에 있다.
  3. Lock 해제 : 임계 영역에서의 작업이 완료되면 Lock을 해제한다. 이과정에서 다른 스레드들이 Lock을 얻어서 진입할 수 있게 된다.

Lock의 장점

  • 동기화 : 여러 스레드 간의 공유 자원에 대한 동시 접근을 제어하여 데이터의 일관성을 유지할 수 있다.
  • 데드락 방지 : 잘못된 Lock 사용은 데드락(Deadlock)을 유발할 수 있지만 재대로 사용할 경우 데드락을 방지할 수  있다.
  • 자원 공유 : 공유 자원의 안전한 공유를 가능하게 한다.

Lock의 단점

  • 성능 저하 : Lock을 사용할 경우, Lock을 기다리는 스레드가 많아질수록 성능 저하가 발생할 수 있다.
  • 데드락 : 데드락은 두개 이상의 스레드가 서로가 가진 Lock을 기다리는 상황
  • 복잡성 ; Lock을 사용하는 코드는 복잡성이 증가할 수 있다. Lock의 범위와 획득 순서 등을 신중하게 관리해야한다.

 

 

Deadlock 발생 조건 (4가지중 하나라도 충족하지 않으면 발생하지않는다.)

  1. 상호 배제(Mutual exclusion) : 자원은 한번에 한 스레드만 사용할 수 있다.
  2. 점유 대기(Hold and waitt) : 최소한 하나의 자원을 점유하고 있으면서 다른 스레드에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 스레드가 있어야 한다.
  3. 비선점(No preemption) : 다른 스레드에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
  4. 순환 대기(Circular wait) : 대기 스레드의 집합이 순환 형태로 자원을 대기하고 있어야 한다.

 

Lock의 종류

 

키워드 사용용도 성능 재진입성 스레드 비친화적
lock 단순한 동기화가 필요할때 사용 대기 중인 스레드가 많을 경우, 비교적 높은 성능을 보인다. 동일한 스레드에서 여러 번 진입 가능하다. 대기 중인 스레드가 cpu 자원을 소모하지 않도록 자동으로 관리
SpinLock 매우 짧은 시간 동안 잠금이 필요하고, 컨텍스트 스위칭 오버헤드를 피하고 싶을 경우 잠금이 짧은 시간 유지될때 높은 성능을 보인다. 재진입을 허용하지 않음 바쁘게 대기하므로 CPU 자원 소모
ReaderWriterLock 다중 스레드에서 읽기 작업이 번번하고, 쓰기 작업이 상대적으로 드문 경우 읽기 작업이 많을 떄 높은 성능을 제공 동일한 스레드에서 여러 번 진입가능 대기 중인 스레드가 cpu 자원을 소모하지 않도록 자동으로 관리

 

'프로그래밍 > MultiThread Programing' 카테고리의 다른 글

3. 메모리 베리어  (0) 2024.07.11
2. 캐시 이론  (0) 2024.07.10
1. 멀티쓰레드 개론  (0) 2024.07.10