동기화
동기화 기법
셀프 Q&A
Q1. DB에서 구현되는 트랜잭션. 얘도 원자성 보장인데.. 이건 CSP를 어떻게 해결하고 있을까?
→ 뮤텍스와 유사한 lock 사용
- 공유 락 (Shared Lock, S-Lock): 읽기. 읽기는 동시에 해도 괜찮기 때문에.
- 배타 락 (Exclusive Lock, X-Lock): 쓰기. 쓰기는 동시에 하면 문제가 생길 수 있기 때문에 뮤텍스와 동일하게 락 건다.
또는 현대적(MySQL, PostgreSQL 등)으로는
MVCC (Multi-Version Concurrency Control): "락 없이 해결하자"
- 읽으려는 사람에게는 수정 전의 과거 버전(Snapshot)을 보여줌 → 읽기 작업과 쓰기 작업이 서로를 방해하지 X
- 대신 쓰기에서는 여전히 락 걸어야…
Q2. 피터슨 알고리즘 완벽해 보이는데 왜 뮤텍스/세마포어/모니터 쓸까?
- 하드웨어 최적화와의 충돌: 현대 CPU는 성능 향상을 위해 명령어 순서를 바꿉니다(Out-of-order execution). 피터슨 알고리즘은 변수 업데이트 순서가 엄격하게 지켜져야 작동하는데, CPU가 자기 마음대로 순서를 바꾸면 논리가 깨져버립니다.
- 바쁜 대기 (Busy Waiting): 피터슨 알고리즘은 차례를 기다릴 때
while 루프를 무한히 돌며 CPU 자원을 계속 소모합니다.
- 확장성 문제: 피터슨은 기본적으로 2개의 프로세스를 가정합니다. N개의 프로세스로 확장하려면 코드가 훨씬 복잡해지고 관리하기가 불가능에 가까워집니다.
Q3. Spinlock은 왜 멀티코어에서만 컨텍스트 스위칭 아낀다는거지?
- 작업 1, 2가 동일한 임계 영역에 접근해야 한다고 하자.
- 코어A - 작업1 진행중. 즉 락걸림
- 코어B - 작업2 진행중 but 락때문에 while문 걸려서 공회전. 그러나 프로세스에서 내려온 상태는 아니기 때문에 락이 풀리는 즉시 실행가능
Q4. 모니터는 세마포어보다 쉽게 자동으로 동기화 문제 해결해준다면서 왜 또 wait() signal() 나오는거지? 결국 똑같은거 아닌가?