여러가지 동기화 도구 (피터슨 알고리즘, 하드웨어 지원, 뮤텍스, 세마포어)를 언제 어떻게 써야 할지에 대한 전략을 보자.
하드웨어 지원
- 굉장히 낮은 수준
- 다른 동기화 도구를 구성하기 위한 기초.
- 그러나, 최근에는 오버헤드 없이 경쟁 조건으로부터 보호하는 lock-free 알고리즘 구현을 위해 CAS 명령을 사용하는데 중점을 두고 있음.
- lock-free 솔루션은 오버헤드가 낮고, 확장성이 있다.
- 그러나 알고리즘 자체가 개발 및 테스트가 어려움.
CAS 기반 접근
- 낙관적인 접근법
- 낙관적으로 변수를 갱신 후 충돌 감지를 사용해 다른 쓰레드가 변수를 병행하게 갱신 중인지 확인
- 갱신 중이면, 충돌 없이 성공적으로 갱신될 때까지 연산 반복해 다시 시도
반대로, 상호 배제 locking은 비관적 전략으로 간주.
- 다른 쓰레드가 변수를 갱신 중이라고 가정
- 갱신하기 전 락을 획득.
CAS 기반 vs 기존 동기화
둘의 성능 차이와 관련된 규칙을 보자.
- 경합 없음 : 모두 빠르지만, CAS가 좀 더 빠름
- 적당한 경합 : CAS가 훨씬 더 빠름.
- 심한 경합 : 경합이 치열할 때는 기존 동기화가 더 빠름.
특히 적당한 경합이 있는 경우…
- CAS : 성공하기까지 루프를 계속 반복.
- 상호 배제 락 : 경합 중인 락을 획득하려는 어떠한 시도도 더 복잡하고 시간이 많이 소요되는 코드 경로를 따르게 됨.
- 이 경로를 따라 수행하면 쓰레드를 일시 중지하고 대기 큐에 넣은 다음 다른 쓰레드로 문맥 교환해야 함.
동기화 기법과 성능
이러한 기법들은 시스템 성능에도 영향을 끼침.
- 원자적 정수는 기존 락보다 훨씬 가벼움
- 공유 변수에 대한 단일 업데이트에 적합.
- mutex 락
- 세마포어보다 간단하고, 오버헤드가 적음
- 임계구역에 대한 접근을 제어하는 것과 같은 용도로 이진 세마포어보다 더 선호.
- 그러나 한정된 자원에 대한 접근은 카운트 세마포어가 더 적절.
- 일부 경우에는 reader-writer lock이 mutex보다 더 선호.
- 전자가 후자보다 더 높은 병행성을 허용하기 때문
- 모니터와 조건변수
- 단순하고, 편하다
- 그러나, 상당한 오버헤드가 있을 수 있다.
- 확장성 역시 좋지 않을 가능성이 높다.
이외에도 다양한 도구가 개발되고 있다.