Spinlock vs Mutex

락을 구현하는 방식은 크게 두 갈래로 나뉩니다. 유저 공간에서 CPU 명령어만으로 도는 Spinlock과, 커널의 도움을 받는 Mutex입니다. 둘 다 결국 상호 배제(mutual exclusion)를 보장한다는 목적은 같지만, 내부 동작 방식이 다르기 때문에 적합한 워크로드도 갈립니다. Spinlock Spinlock은 유저 공간(userspace)에서 구현되는 락입니다. 동작 방식은 단순합니다. CAS(Compare-And-Swap) 연산이 성공할 때까지 무한히 반복합니다. while (!CAS(lock, 0, 1)) 대부분의 CPU는 이런 CAS 연산을 위한 전용 명령어를 갖고 있습니다. x86이라면 LOCK CMPXCHG가 여기에 해당합니다. 문제는 이 CAS 연산이 성공하려면 해당 캐시 라인에 대한 독점적인 쓰기 권한이 필요하다는 점입니다. 이 권한을 얻는 과정에서 CPU 코어 사이에 캐시 일관성 프로토콜이 개입하고, 캐시 라인의 소유권을 주고받는 과정에서 잦은 invalidation, 이른바 캐시 라인 바운싱이 발생합니다. 이 과정은 보통 4~80ns 정도 걸립니다. ...

2025년 12월 12일 · 4 분 · Donghyung Ko

Kotlin Coroutine의 동작 원리

이번 글은 Kotlin Coroutine의 디자인을 제안한 Kotlin Proposals - Coroutines를 참고하여 coroutine의 동작 원리에 대해 다루어 보도록 하겠습니다. Coroutine 원문에서는 coroutine을 한 문장으로 an instance of suspendable computation이라고 설명하고 있습니다. 이처럼, coroutine의 가장 핵심적인 특징은 중단 가능하다는 것입니다. 그렇다면, 중단 가능하다는 것은 정확히 어떤 의미일까요? Suspension 원문에 따르면, 중단 가능하다는 것은 다른 coroutine의 코드를 실행할 수 있도록 coroutine이 현재 thread에서 코드 실행을 잠시 중단하고 thread를 양보할 수 있다는 것을 의미합니다. 뿐만 아니라, 중단된 coroutine이 다른 thread에서 다시 재개될 수 있음을 뜻합니다. ...

2023년 6월 7일 · 8 분 · Donghyung Ko