1. Misconception: Lock free algorithm은 항상 lock-based algorithm 보다 빠른것인가?
- Lock free algorithm은 사실상 cache traffic이 씹창나는 busy waiting 방법이다.
- 만약 간단한 시스템이면 lock free algorithm이 빠르지만, 복잡한 시스템(Job이 여러개 있는 등)에서는 더 느릴 수 있다.
2. Lock free algorithm의 핵심은 무엇인가? lock-based algorithm하고는 무엇이 다른가?
- Lock free algorithm은 busy waiting하는 방법이지만 lock-based algorithm은 contention 발생 시, 자신의 pCPU를 yield 하는 방법이다.
3. Lock-free stack이란?
- Push: top pointer에 CAS를 걸어 top을 업데이트
- Pop: 위와 마찬가지
4. Lock-free queue란?
- Enqueue: 1. tail->next update 2. tail move
- 두 개의 공유 변수 접근이 일어나므로 두번의 CAS가 일어난다. 단, 두 CAS 사이에는 critical section으로 보호되지 않으므로, tail move를 모든 쓰레드에서 일으킨다.
- Dequeue: 1. head := head->next
- 단, Enqueue에서 split CAS가 발생했으므로, 큐 empty시, Enq-1 -> Deq-1 -> Enq2가 발생된다면 세그멘테이션 폴트가 일어난다. 이를 방지하기 위해 tail move 후, 1번을 수행한다.
5. Lock-free list란?
- insert: 1. new node -> next := next node 2. CAS with previous node
- delete: 1. mark deleted node 2. CAS(check deleted) with next node
6. ABA problem
- 메모리 재사용되는 상황에서 나타나는 문제로, stack: top->A->B->C 에서 A 딜리트 후, top->B->C로 만드려고 하는데, 만들기 직전에 pop B/push A로 top->A->C로 만들어도 ptr가 변하지 않았기 때문에 의도와 잘못된 결과(top->A->B, where B is invalid)를 내는 상황이다.
- Workaround: 메모리 주소 하위 비트에 레퍼런스 카운터를 넣는다.
결론: 복잡한 시스템 (멀티 프로듀서/컨슈머 or + async jobs)에서는 lock-free가 적합하지 않다. 적은 수의 프로듀서/컨슈머에서는 잘 동작한다.
나 이거 하나도 모르긴한데 2번에서 꼭 busy waiting 하지 않더라도 thread별 큐에 집어넣고 모두 처리한담에 모아서 처리하는 방식도 있지 않음?
busy waiting이 lock-free의 핵심인뎅 ㅇㅅㅇ 만약 contention을 줄이기 위해 thread group별로 나누어서 토너먼트 형태로 contention을 줄일 수는 이 ㅆ음
busy waiting이 뭐야 spinlock 같은건가
이응
방법론이고 busy waiting의 한 방법이 spinlock
thread group별로 나눠서 처리하는것도 busy waiting에 포함되는가? 아니라면 이는 lock-free하지 않은가? 이거 두개가 아니라면 Lock free algorithm은 꼭 busy waiting한 방법이라 할수 있나 싶어서
나도 이런거 잘하고 싶다
https://on-demand.gputechconf.com/gtc/2013/presentations/S3101-Atomic-Memory-Operations.pdf
24p
해당 댓글은 삭제되었습니다.
1. 스택오버플로 + 내 경험 2. volatile이면 memory ordering 필요 없쪙 단순히 3개 파라미터 단위의 atomic이라.. 굳이 한다면 acquire?
CAS의 memory ordering이 머야
아 생각해보니 CAS 메모리 오더링 전혀 필요 없넹. volatile이면 충분하겠당 우짜피 lock 거니까 캐시 스눕 프로토콜에서 다 처리할듯
메모리 오더링은 내가 어느 시점에 코드를 실행했을 때, 다른 공유 변수의 visibility를 확보하기 위해 힌트? 같은거 줄 수 있엉
어렵노 이기
니들은 머하는데 이런걸 다 알고있노
구냥 학생때 공부한거 리마인드
멋있노..