멀티쓰레드 프로그래밍의 어려움
- Data Race: 2를 5천만번 더했는데 1억이 안나옴 -> lock을 사용해 해결
- 성능: 싱글 쓰레드보다 느려짐 -> lock을 쓰지 말자
- 컴파일러: 변수를 참조했는데 무시 -> volatile 키워드 또는 atomic으로 해결
- CPU: 프로그램 실행 순서를 자기 마음대로 변조 -> asm mfence 또는 atomic으로 해결
Lock-Free 알고리즘이란?
여러 개의 쓰레드에서 동시에 호출했을 때에도 정해진 단위 시간마다 적어도 한 개의 호출이 완료되는 알고리즘
호출이 다른 쓰레드와 충돌했을 경우 적어도 하나의 승자가 있어서, 승자는 delay 없이 완료 된다.
LOCK을 사용하지 않는다고 해서 모두가 lock-free 알고리즘은 아니며, LOCK을 사용하면 무조건 lock-free 알고리즘이 아니다.
장점: 성능과 높은 부하에도 안정적
단점: 복잡한 알고리즘, 정확성 증명의 어려움, 새로운 메소드를 추가하기 어려움, 메모리 재사용의 어려움(ABA)
CAS?
lock-free 알고리즘의 핵심
CAS(&A, old, new) => A 메모리를 다른 쓰레드가 먼저 업데이트하면 false, 아니면 new로 갱신
하지만 2개의 변수를 동시에 atomic하게 변경할 순 없다.
멀티쓰레드 프로그래밍 도우미
Intel TBB: 좋은 성능과 유용한 라이브러리, Concurrent 자료 구조
Visual Studio PPL: Intel TBB와 유사
OpenMP: 컴파일러 레벨에서 병렬 프로그램 API를 제공
Transactional Memory
CAS의 개념을 그대로 구현한 것
CAS와 다른점은 생산성. 싱글 쓰레드 프로그램을 그대로 쓸 수 있고 멀티쓰레드에선 Lock-Free하게 실행됨
다른 쓰레드와 충돌이 일어날 수 있는 구간을 transaction으로 선언한다.
How?
1. transaction 구간에서 읽고 쓴 메모리를 다른 쓰레드에서 접근했는지 검사한다. (write는 실제 메모리에 쓰지 않음)
2. 다른 쓰레드에서의 접근이 있었으면 모든 업데이트를 무효화 한 후 다시 시도
3. 다른 쓰레드에서의 접근이 없었다면 transaction 구간에서의 update를 실제 메모리에 update
이 방법을 Software적으로 관리하거나(STM), Hardware적으로 관리함(HTM)
장점: 기존 프로그램을 그대로 사용 가능해 생산성이 높음
단점: STM은 오버헤드로 인한 속도 저하, HTM은 HW가 필요
출처: http://ndcreplay.nexon.com/NDC2014/sessions/NDC2014_0048.html
'NDC > Dev' 카테고리의 다른 글
[NDC 2016] 구형맵에서는 어떻게 길을 찾아야 하나요? (0) | 2023.01.17 |
---|---|
[NDC 2016] 유니티, iOS에서 LINQ 사용하기 (0) | 2023.01.15 |
[NDC 2014] 파이썬과 친구들 (0) | 2021.12.06 |
[NDC2013] 테스트 꾸준히 잘하는 법 (0) | 2021.11.14 |
[NDC2013] 라이브 프로젝트에서 C++로 테스트 주도 개발하기 (0) | 2021.11.13 |