Lock이란?
멀티 쓰레드 환경에서 여러 스레드가 공유 자원(힙,데이터)에 안전하게 접근 할 수 있도록 동기화를 제공하는 메커니즘이다.
사용방법
- Lock 획득 : 임계 영역에 진입하기 전에 Lock을 획득한다. 이과정에서 다른 스레드가 동일한 자원에 접근하지 못하게 된다.
- 임계영역 실행 : Lock을 획득한 스레드는 임계 영역에서 작업을 수행한다. 이 때 다른 스레드는 Lock을 획득하기 위해 대기 상태에 있다.
- Lock 해제 : 임계 영역에서의 작업이 완료되면 Lock을 해제한다. 이과정에서 다른 스레드들이 Lock을 얻어서 진입할 수 있게 된다.
Lock의 장점
- 동기화 : 여러 스레드 간의 공유 자원에 대한 동시 접근을 제어하여 데이터의 일관성을 유지할 수 있다.
- 데드락 방지 : 잘못된 Lock 사용은 데드락(Deadlock)을 유발할 수 있지만 재대로 사용할 경우 데드락을 방지할 수 있다.
- 자원 공유 : 공유 자원의 안전한 공유를 가능하게 한다.
Lock의 단점
- 성능 저하 : Lock을 사용할 경우, Lock을 기다리는 스레드가 많아질수록 성능 저하가 발생할 수 있다.
- 데드락 : 데드락은 두개 이상의 스레드가 서로가 가진 Lock을 기다리는 상황
- 복잡성 ; Lock을 사용하는 코드는 복잡성이 증가할 수 있다. Lock의 범위와 획득 순서 등을 신중하게 관리해야한다.
Deadlock 발생 조건 (4가지중 하나라도 충족하지 않으면 발생하지않는다.)
- 상호 배제(Mutual exclusion) : 자원은 한번에 한 스레드만 사용할 수 있다.
- 점유 대기(Hold and waitt) : 최소한 하나의 자원을 점유하고 있으면서 다른 스레드에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 스레드가 있어야 한다.
- 비선점(No preemption) : 다른 스레드에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
- 순환 대기(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 |
