2013-04-30 2 views
31

뮤텍스에 대한 atomics를 사용하는 주된 이유는 뮤텍스가 비싸지 만 atomics의 기본 메모리 모델이 memory_order_seq_cst 인 것과 마찬가지로 비싸지 않은가?`std :: mutex`와 'std :: atomic (memory_order_seq_cst)`보다 느리게 동기화됩니까?

질문 : 잠금을 사용하는 동시 프로그램은 동시 잠금없는 프로그램만큼 빠를 수 있습니까?

원자력에 memory_order_acq_rel을 사용하고 싶지 않으면 노력하지 않을 수도 있습니다.


편집 : 각 잠금도 전체 메모리 장벽을해야하기 때문에 내가 잠금 기반 캔트하지만 뭔가를 누락 될 수 있습니다하면 잠금이없는 것보다 빠릅니다. 그러나 자물쇠가 없으므로 메모리 장벽에 덜 제한적인 기술을 사용할 수 있습니다.

그래서 내 질문으로 돌아 가면 잠금 장치가 기본 잠금보다 새로운 C++ 11 표준을 기반으로합니다. memory_model?

"lock-free> = 성능 측정시 잠금 기반"이 true입니까? 2 개의 하드웨어 스레드를 가정 해 봅시다.


편집 2 : 내 질문이 진행 보장에 대한 아니며, 어쩌면 내가 맥락에서 "잠금없는"사용하고 있습니다.

기본적으로 공유 메모리가있는 2 개의 스레드가 있고 필요한 유일한 보증은 하나의 스레드가 쓰고 다른 스레드가 읽거나 쓸 수 없다면 내 가정은 간단한 원자 compare_and_swap 작업이 많다는 것입니다 뮤텍스를 잠그는 것보다 빠릅니다.

하나의 스레드가 공유 메모리에 절대 닿지 않으면 아무런 이유없이 반복적으로 잠금과 잠금 해제가 끝나게됩니다. 그러나 원자 적 조작에서는 매번 1 CPU 주기만 사용합니다.

스핀 잠금과 뮤텍스 잠금은 경합이 거의 없을 때 매우 다릅니다.

+0

자물쇠, 잠금 장치가없는 코드 및 대기 코드가 서로 다른 진행 보증이 있습니다. –

+8

[필수 읽기] (http://www.1024cores.net/home/lock-free-algorithms). –

+1

시계 : https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

답변

53

Lockfree 프로그래밍에 대한 진행 보장입니다 : 강한에서 약한로, 사람들은 대기 무료, 잠금이없는, 무료 장애물 및 차단이다.

보증은 비싸고 가격이 붙습니다. 더 많은 보장을할수록 더 많이 지불하게됩니다. 일반적으로 블록킹 알고리즘이나 데이터 구조 (뮤텍스와 함께 말하자면)는 가장 큰 자유를 가지므로 잠재적으로 가장 빠릅니다. 다른 익스트림에서 wait-free 알고리즘은 매 단계마다 원자 연산을 사용해야하므로 훨씬 느릴 수 있습니다.

자물쇠를 구하는 것은 실제로 저렴하기 때문에 피사체에 대한 깊은 이해 없이는 걱정할 필요가 없습니다. 또한 뮤텍스를 사용하는 알고리즘을 차단하는 것은 입니다. 읽기 쉽고 쓰기가 쉽습니다. 대조적으로, 가장 단순한 잠금없는 데이터 구조조차도 하나 이상의 PhD만큼 가치가있는 긴 집중 연구의 결과입니다.

간단히 말해서 잠금 또는 대기없는 알고리즘은 평균 대기 시간 및 처리량에있어 최악의 대기 시간을 나타냅니다. 모든 것이 느려지지만 아무 것도 없습니다. 매우입니다.이것은 아주 특별한 특성으로, 매우 특정한 상황 (예 : 실시간 시스템)에서만 유용합니다.

+0

ok -하지만 공유 데이터가있는 2 개의 스레드 ... 당신은 스핀 록 차단 잠금보다 빠릅니까? – jaybny

+0

예를 들어 2 스레드의 2 거래에서 틱을 수신하는 거래 응용 프로그램. 스핀 락이 뮤텍스보다 빠를까요? – jaybny

+4

@ jaybny : 아니, 왜. 또한 스핀 록은 잠금 장치입니다. 기본적인 보증은 변경되지 않습니다. 즐거운 놀라움을위한 pthread 뮤텍스의 구현을 살펴보십시오. –

2

잠금은 간단한 원자 연산보다 많은 작업을 요구하는 경향이 있습니다. 가장 간단한 경우 memory_order_seq_cst는 잠금보다 약 두 배 빠릅니다. 잠금은 구현시 최소 두 개의 원자 연산 (하나는 잠금, 하나는 잠금 해제)이 필요하기 때문입니다. 많은 경우, 그 이상이 소요됩니다. 그러나 메모리 주문을 활용하기 시작하면 동기화를 적게 받아 들일 수 있기 때문에 훨씬 더 빠를 수 있습니다.

또한 "잠금 알고리즘은 항상 잠금없는 알고리즘만큼 빠릅니다."라는 메시지가 자주 나타납니다. 이것은 다소 사실입니다. 기본 개념은 가장 빠른 알고리즘이 잠금이없는 경우 잠금없는 부모 노드없이 가장 빠른 알고리즘이 동일한 알고리즘이라는 것입니다. 그러나, 가장 빠른 알고리즘이 잠금을 필요로한다면, lockfree 보장을 요구하는 사람들은 더 느린 알고리즘을 찾아야 만합니다.

일반적으로 특수 opcode 활용의 성능이 도움이되는 몇 가지 저수준 알고리즘에서 lockfree 알고리즘을 볼 수 있습니다. 거의 모든 다른 코드에서 잠금은 만족스러운 성능 이상이며 읽기가 훨씬 쉽습니다.

+0

"잠금 알고리즘은 항상 잠금없는 알고리즘만큼 빠릅니다." - 나는 이걸 얻지 못해. 공유 메모리를 가진 쓰레드 안전 루프는 간단한 compare_exchange와 lock (mutex) unlock (뮤텍스)를 사용하는 것이 훨씬 빠릅니다. 특히 다른 스레드로부터의 경합이없는 경우. – jaybny

관련 문제