주의: 이 게시물에는 뇌피셜이 많습니다.
1. 개념
이때까지 consensus에 목매달고 공부했던건 왜인지 다시 생각해보자. multi-core architecture에서 여러 프로세서가 한 자원에 접근할 때 누가 첫 번째로 접근해서 내가 못했는지 아는 것이 parallel programming에 있어서 중요한 요소이다. 이때 hardware가 지원하는 operation으로 최대 몇개의 프로세서가 한 자원에 접근할 때 누가 첫 번째로 접근했는지 알 수 있는지가 consensus number이다.
2. hardware에서 지원하는 atomic operation들의 consensus number
FetchAndIncrement, GetAndSet, ... 은 2이다. 왜냐하면 읽고 써버리기 때문에 세 번째 쓰레드가 첫 번째 쓰레드의 값을 받지 못하기 때문이다. 그렇기 때문에, CompareAndSet로 -1을 비교해서 옳다면 쓰레드 넘버를 기록하고, 다음부터 그 수를 반환하게 하면 consensus number가 무한이 된다. CAS의 구현이 지역마다 다른 것 같은데, 누구는 비교해서 옳았을 때 마지막으로 true를 리턴한다는 사람도 있고, 내가 배운 것은 비교해서 틀리면 마지막으로 이전 값을 리턴하는 것이다. 전자면 다른 쓰레드들이 승자를 모르기 때문에 엄밀히 따지면 잘못 구현한 것이라고 할 수 있지 않을까? 정확히는 모르겠다.
(추가: multiple assignment는 앞 게시물에서 2n-2라고 밝혔다.)
3. lock-free 구현
CAS는 앞으로 많이 사용될 것이므로 기억해두자. CAS는 consensus number가 무한이기 때문에, 어떤 implementation이든 lock을 걸고 하던 시행을 모두 그냥 CAS로 바꿔버리면 lock-free가 된다. 근데, 잘 생각해야할게 꼭 그렇지만은 않다. 한 번씩 CAS를 동시에 두번 수행해야 될때도 있기 때문에, java의 util에는 그런것들이(AtomicMarkableReference 등) 구현되어 있다.
4. wait-free 구현
wait-free는 lock-free로 구현해본 다음, 생각해야 할 것이다. 쉽게 생각하면 aging의 구현을 추가하는 것인데, aging해서 모든 쓰레드가 finite step안에 끝나는 것을 보장하도록 구현해야한다. 나중에 concurrent structure를 여럿 배워도 wait-free 구현은 안나온다... 아마 구현해야될 양도 많아지고 빡치니까 그렇지 않을까...
'분산시스템 (멀티코어 contention) - 수업' 카테고리의 다른 글
Linked Lists (for concurrent set) (0) | 2017.05.23 |
---|---|
spin locks and contention (0) | 2017.05.22 |
consensus (0) | 2017.04.12 |
linearizability / sequential consistency (1) | 2017.04.12 |
from safe register to atomic register (0) | 2017.04.12 |