여러 스레드가 동작하는 환경에서 데이터의 안정성을 보장하는 방법으로 락을 사용하는 대신 저수준의 하드웨어에서 제공하는 CAS (compare-and-swap) 명령을 사용하는 넌블로킹 알고리즘을 다룬다.
배타적인 락 방법은 보수적인 동기화 기법으로, 일단 값을 변경하고 다른 스레드의 간섭 없이 값이 제대로 변경하는 방법이 훨씬 효율적으로 동작할 수 있는 낙관적인 방법이다.
이 방법에서 충돌 검출 (collision detection) 방법을 사용해 값을 변경하는 동안 다른 스레드에서 간섭이 있었는지 확인할 수 있으며, 간섭이 있다면 해당 연산이 실패하게 되고 재시도하거나 재시도조차 하지 않는다.
→ “허락을 받기보다는 나중에 용서를 구하는 편이 더 쉽다 더 효율적이다”
프로세서는 공유된 변수를 놓고 동시에 여러 작업을 해야하는 상황을 간단하게 관리할 수 있는 명령어를 제공한다.
초기의 프로세서는 아래의 단일 연산을 하드웨어적으로 제공했다.
▶️ test-and-set ▶️ fetch-and-increment ▶️ swap
현재의 프로세서는 read-modify-write 연산을 하드웨어적으로 제공한다.
▶️ CAS (compare-and-swap) ▶️ LL/SC (load-linked/store-conditional)
CAS 연산에는 3개의 인자를 넘겨주는데, V 위치에 있는 값이 A 와 같은 경우에 B 로 변경하는 단일 연산이다.
- 작업할 대상 메모리의 위치인 V
만약 이전 값이 A 와 달랐다면 아무런 동작도 하지 않고, 성공/실패 시에 상관없이 현재 V 의 값을 리턴한다.
<aside> 💡 풀어서 이야기하면 V 에 들어 있는 값이 A 라고 생각되며,
</aside>