멀티 쓰레드
Lock 구현 이론
오늘의 주제는 락 구현 연습이다. 멀티쓰레드 프로그래밍의 락의 비중은 6-70%를 차지할 정도로 매우 중요하다. 따라서 락의 동작방식을 이해하는 것은 매우 중요하다. 물론 언어와 프레임워크에 따라 조금씩 다르겠지만, 근본적인 구조와 동작 방법은 유사할 것이다.
오늘도 비유를 이용하여 Lock 구현 이론에 대해서 알아보자. 이전 시간에서 락의 구현은 화장실을 갔다오는 것과 유사하다고 했다. 예를 들어보자. 우리는 화장실에 갔는데 누군가 화장실 안에서 사용하고 있어 문을 잠군 상태이다. 따라서 우리는 안에 사람이 나오기를 기다리고 있는 상황이라고 가정해보자. 즉. 화장실이 급해서 왔는데 문이 잠겨있는 상태인 것이다. 그렇다면 우리는 이 때 어떻게 행동할까?
1. 무작정 기다리는 방법이 있다.
첫번째 방법은 기다리는 방법이다. 기다리다 보면 사람은 나올테이니 사람이 나온다면 바로 사용하면 되는 것이다. 이 때의 단점은 안에 있는 사람이 언제 나올지 모르기 때문에 우리는 우리의 시간을 허망하게 낭비하게 된다.
2. 기다리다가 사용중이면 다시 자리로 돌아갔다가, 몇 분뒤 다시 가보자.
두 번째 방법은 화장실이 사용중이면 일단 자리로 돌아갔다가 일정 시간이 지나고 난 뒤 다시 화장실을 오는 방법이다. 이 방법의 단점은 순서를 보장할 수 없고, 랜덤성이 강하다는 단점이 있다. 예를 들어 운이 나쁘게 내가 자리로 돌아가자마자 화장실에서 사람이 나와서 다른 사람이 화장실을 또 사용할 수 있다는 것이다.
3. 화장실에 직원을 두어 나에게 알려달라고 하자.
마지막 방법은 흔히 말해 갑질 메타를 이용하는 것이다. 우리는 직원을 불러 화장실 앞에 세워두고, 사람이 나오면 나에게 알려달라하고 나는 내 볼일을 보는 것이다. 이 방법의 장/단점은 내가 기다리는 동안 화장실에서 사람이 나오는 것을 신경쓰지 않아도 되는 것이고, 단점으로는 화장실에서 나오는 것을 알려주기 위해 직원 한명을 구해야 한다는 것이다. 만약 한명이 아닌 100여명의 사람이 이런 부탁을 받는 다면 직원 입장에서는 굉장히 짜증나는 일이 되는 것이다.
위 방법은 락을 구현할 때에도 사용하는 방법이다.
1. 기다리는 방법은 흔히 말해 스핀 락(SpinLock)의 개념이 된다. 제자리에서 계속 회전하기 때문에 스핀이라는 말이 붙었다. 이는 컴퓨터 입장에서 기다리는 행위는 스레드를 생성해 대기하는 것이므로 이 또한 절대적으로 가벼운 작업이 아니다. 즉 이렇게 계속 대기하게 되면 CPU 점유율이 상승하게 된다.
2. 자리 갔다가 돌아오는 방법은 컨텍스트 스위치(Context Switching)의 개념이 된다. 이는 즉 소유권을 포기하는 것과 같다. 컴퓨터 입장에서는 CPU는 스레드에게 할당된 코어를 되돌려 받아 다른 쓰레에게 일을 주는 것과 같다.
3. 갑질 메타 방법은 이벤트(event)를 이용하여 역으로 통보를 받는 개념이다. 나의 소유권을 양도하는 것은 2번의 방법과 같지만, 랜덤으로 나에게 연락이 온 것이 아닌 운영체제에게 이벤트를 세팅하여 화장실이 빌 경우 나에게 연락을 줘. 하고 명령을 내리는 것과 같다. 즉 2번과 달리 깨어나는 시점이 다른 것이다.
위 방법들을 구현하면서 락에 대한 이해를 또 늘려보자! 🐱💻
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 4-2-11. 멀티쓰레드 프로그래밍 : 문맥 교환(Context Switching) (0) | 2023.09.16 |
---|---|
Part 4-2-10. 멀티쓰레드 프로그래밍 : SpinLock (0) | 2023.09.13 |
Part 4-2-8. 멀티쓰레드 프로그래밍 : 데드락 (0) | 2023.09.12 |
Part 4-2-7. 멀티쓰레드 프로그래밍 : Lock 기초 (0) | 2023.09.12 |
Part 4-2-6. 멀티쓰레드 프로그래밍 : interlocked (0) | 2023.09.12 |