잠금없는 컬렉션에 대한 제한이 있습니까?


10

David Rodríguez-dribeas는 StackOverflow에 대해 "모든 컬렉션을 잠금없이 구현할 수있는 것은 아닙니다"라고 언급 했습니다. 이것이 사실인지 확실하지 않으며 어느 쪽의 증거도 찾을 수 없습니다.

이 문장은 매우 정확하지는 않지만 조금 더 공식적인 방식으로 다시 표현해 보도록하겠습니다. 모든 컬렉션 유형마다 동일한 작업 집합을 제공 C하는 잠금없는 컬렉션 유형 CLF 가 있으며 CLF 에서 각 작업이 수행되는 위치 의 해당 작업과 동일한 big-O 복잡성을 갖습니다 C.

그건 그렇고, 나는 변화를 기대하지 않습니다.


1
비전문가로서 "자유없는"을 엄격하게 정의 할 수 있을지 궁금합니다.
Ito Tsuyoshi

1
@Suresh : "데이터 구조"와 동의어일까요?
Ito Tsuyoshi

2
STM (소프트웨어 트랜잭션 메모리)을 잠금없이 구현하고 그 위에 데이터 구조를 구현하면 어떨까요?
Jukka Suomela

5
@ 츠요시 : 잠금없는 공식적인 정의가 없다고 생각합니다. 비공식적으로, 그것은 CPU의 LOCK 명령을 사용하지 않는다는 것을 의미합니다. 이는 느리고 더 빠른 비교 및 ​​스왑을 고수합니다. LOCK은 비교 및 ​​스왑으로 시뮬레이션 할 수 있기 때문에 "잠금 (또는 그 문제에 대한 트랜잭션)을 시뮬레이션하기 위해 여기에서 비교 및 ​​스왑을 사용합니다"와 "오, 이것은 비교와 스왑을 영리하게 사용하며, 우리가 알고있는 더 높은 수준의 작업을 시뮬레이션하는 것처럼 보이지 않습니다. "
Radu GRIGore

1
내가 이해하는 한, lock-free는 여기서 non-blocking과 동의어로 이해됩니다. 이것은 LOCK뮤텍스 / 세마포어 / 등을 통해 CPU의 명령이 아니라 스레드 스케줄러와 관련이 있습니다.
MSalters

답변:


11

나는 다소 혼란 스러웠 기 때문에 질문에서 몇 가지 개념을 명확하게 설명하는 것으로 시작합니다.

수집 . 데이터 구조에서 일반적으로 일어나는 일을 간단히 요청할 수있을 때 "수집"의 의미를 엄격하게 정의하는 데 시간을 할애 할 이유가 없습니다. 데이터 구조는 하나의 메모리를 차지하며 해당 메모리에 액세스 할 수 있고 사용자 가 호출 할 수있는 일부 작업 이 있습니다 . 이러한 사용자는 별개의 프로세서 일 수도 있고 다른 스레드 일 수도 있지만 걱정하지 않아도됩니다. 중요한 것은 작업을 병렬로 실행할 수 있다는 것입니다.

잠금이없는 . Herlihy와 Boss 는 충돌하는 사용자가 데이터 구조의 추가 사용을 막지 않으면 데이터 구조에 잠금이 없다고 말합니다. 예를 들어, 정렬 된 세트에 노드를 삽입하는 도중에 프로세서에 물을 붓는다 고 가정하십시오. 다른 프로세서가 나중에 해당 정렬 세트에 삽입하려고하면 성공해야합니다. ( 편집 : 이 정의에 의하면, 데이터 구조가 사용 잠금 후 잠금 부담하지 않으면 그 경우이지만이다 하지 데이터 구조는 잠금을 사용하지 않는 경우는 로크 무료 인 경우).

이러한 정의를 통해 Herlihy와 Boss는 기본적으로 중요한 지역을 거래로 전환하는 것이라고 대답합니다.

그러나 당신은 이것이 복잡할까요? 나는 그 질문이 의미가 있는지 확신하지 못한다. 고려하십시오 push(x) { lock(); stack[size++] = x; unlock(); }. 이것이 일정한 시간 작동입니까? 잠금 작업을 무시하고 다른 사용자가 있으면 예라고 대답 할 수 있습니다. 다른 사용자를 무시하지 않으려면 푸시 가 일정한 시간에 실행 될지 여부를 실제로 말할 방법이 없습니다 . 한 수준 위로 올라가 특정 알고리즘에서 스택이 어떻게 사용되는지 볼 경우 푸시 는 항상 일정한 시간이 걸린다고 말할 수 있습니다 (병렬 알고리즘의 입력으로 발생하는 모든 측면에서 측정 됨). 그러나 이것은 실제로 알고리즘의 속성이므로 푸시 일정한 시간 작업 이라고 말하는 것은 합리적이지 않습니다 .

요약하면, 작업을 실행하는 사용자가 다른 사용자를 기다리는 정도를 무시하면 중요 지역 대신 트랜잭션을 사용하여 질문에 긍정적으로 대답합니다. 대기 시간을 무시하지 않으면 데이터 구조가 어떻게 사용되는지 살펴 봐야합니다.


push위에서 설명한 작업이 일정한 시간 작업이 아니라고 실제로 생각할 수 있는지 여부는 확실 하지 않습니다. 고정 된 수의 프로세서와 그 구현이 lock굶주림을 보장하지 않는 경우 위의 작업 (최악의 경우 주어진 프로세서의 경우 N_proc * O (1)이 필요합니다. 이는 순진하게 O (1) ( 숨겨진 상수로 처리되는 프로세서 수)
David Rodríguez-dribeas

에프()에프

글쎄, 메모리 액세스는 일반적인 경우입니다. 대부분의 알고리즘 분석은 메모리 액세스가 사용 된 메모리와 독립적으로 O (1)이라고 가정합니다. 실제 메모리 아키텍처 (캐시 등)는 O가 사용하는 메모리 인 O (log N)에 의해 더 근사합니다.
MSalters

프로세서의 수가 일정하다는 가정은 상당히 실용적이지만 피할 것입니다. 문제는 문제의 크기가 입력의 크기와 프로세서의 수 모두에서 직교하는 크기로 커질 수밖에 없기 때문에 복잡성을 일차원적인 방식으로 분석 할 수 없다는 것입니다. C ++ 표준 라이브러리의 특정 컨테이너 (어려운 것을 고르고 있습니다)를 가정 할 때 요구 사항 중 하나는 모든 요소가 인접한 메모리 블록에 있어야한다는 것입니다.
David Rodríguez-dribeas

이제 벡터에 요소를 추가하는 것은 상각 된 상수 시간 연산입니다 (이전에 할당 된 블록에 맞지 않으면 호출은 컨테이너의 요소 수에 선형 시간이 걸리지 만 예약 된 메모리 블록이 지수 순서에 따라 획득하면 상각 비용은 일정합니다. 스레드 안전 컨테이너를 구현하면 잠금을 수행 한 다음 변경을 수행하면 작업 비용은 잠금 비용에 비례합니다. 실제로 알지 못하지만 첫 번째 근사에서는 대부분 고려할 수 있습니다 상수
David Rodríguez-dribeas

3

"COLLECTIONS"는 "큐, 스택, 링크 된 목록, 트리 등"을 의미한다고 생각합니다.

에서 http://www.cl.cam.ac.uk/research/srg/netos/lock-free/

신중한 설계 및 구현을 통해 잠금 또는 블록 스레드를 관리 할 필요없이 동시 사용에 안전한 데이터 구조를 구축 할 수 있습니다. 이러한 비 차단 데이터 구조는 추가 동시성을 허용하여 성능을 향상시키고 로컬 설정의 우선 순위 반전으로 인한 일부 문제 나 분산 시스템의 시스템 및 링크 오류로 인한 견고성을 개선함으로써 견고성을 향상시킬 수 있습니다.

우리의 비 차단 알고리즘에 대한 가장 좋은 소개는 현재 제출중인 잠금없는 종이 동시 프로그래밍 (Concurrent programming)입니다.

"lock-free"가 "오퍼레이팅 시스템의 세마포어, 뮤텍스, 모니터 등을 사용하지 않음"을 의미 하는 경우 모든 읽기가 원자 적 읽기-쓰기- 하드웨어가 지원해야하는 기본 요소를 수정하십시오.

영형()

주제에 대한 포괄적 인 문서는 온라인에서 찾을 수 있습니다.

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(... 및 각 문서 끝에 추가 참조 사항)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.