lock cost

락 구현 선택

인터럽트 비활성화, 원자 명령어, 스핀락, 뮤텍스, futex는 임계 영역 길이와 경합 정도에 따라 비용이 달라집니다.

disable단일 코어의 짧은 보호
CAS원자적 비교와 교체
spin짧은 경합은 바쁜 대기
sleep긴 대기는 커널 큐
인터럽트 비활성화

단일 코어에서는 중간에 선점되지 않게 하지만 멀티코어의 다른 CPU 실행은 막지 못합니다.

원자 명령어

Test-and-Set과 CAS는 읽기와 쓰기를 끊기지 않는 하나의 하드웨어 동작으로 묶습니다.

스핀락

임계 영역이 아주 짧으면 잠들고 깨우는 비용보다 잠깐 반복 확인하는 편이 낫습니다.

뮤텍스

대기가 길어질 수 있으면 CPU를 낭비하지 않도록 스레드를 잠들게 하는 방식이 유리합니다.

futex 빠른 경로

경합이 없으면 사용자 공간 CAS로 끝나고, 경합이 있을 때만 커널 futex 대기 큐로 내려갑니다.

임계 영역 길이

임계 영역 길이, 선점 가능성, 코어 수, 락 경합 빈도를 함께 봐야 올바른 도구를 고릅니다.