2009-03-16 6 views
3

그래서 여러 스레드가 동시에 읽기 및 쓰기 액세스 권한을 갖고있는 이진 트리에서 순환 할 때 노드를 잠그는이 구성표를 제안했습니다. 회전 당 네 개의 노드를 잠그는 작업이 포함됩니다. 나는 한 가지 더 똑똑한 방법을 생각해 내게 필요한 잠금을 줄이는 방법을 생각해 냈지만, Google이별로 도움이되지 못했다. (아마도 어쨌든 잘못된 용어를 사용하고있을 것이다.)(More) 스레드 바이너리 트리에서 노드를 순환시킬 때 효율적인 잠금

이것은 오렌지와 레드 노드가 회전에 의해 이동되거나 변경되고 잠글 필요가 있으며 녹색 노드는 회전의 영향을 받지만 노드 자체의 영향을받지 않는 노드에 인접합니다.

binary tree rotation

내가이 일을 더 나은 방법이 있어야한다 생각, 내가 가진 하나 개의 아이디어는, 영향을받는 네 개의 노드의 스냅 샷을 스냅 샷에서 그들을 회전 후와 현재의 노드를 대체하는 것입니다 스냅 샷 (회전을하는 동안 아무 것도 변경되지 않았다는 가정하에) - 이것은 내가 이 될 것입니다. 잠금을 해제 할 수 있지만 메모리 오버 헤드가 훨씬 클 것으로 생각됩니다. 3 개의 포인터를 할당)?

필자는이 작업을 효율적으로 수행하는 방법에 대한 지침 (노약 없음)을 찾고 있다고 생각합니다.

+0

이미지 링크가 손상되었습니다. –

답변

4

변경할 수없는 이진 트리를 살펴보십시오. 조금 더 많은 노드 (모든 노드를 루트로)를 변경해야하지만 삽입 방법의 복잡도는 두 가지 모두 변경되지 않습니다 (log n). 실제로 동기화 코드가 필요 없기 때문에 성능을 향상시킬 수도 있습니다.

예를 들어 Eric Lippert는 C#에서 변경할 수없는 avl 트리에 대한 게시물을 작성했습니다. 마지막 하나는 다음과 같습니다 : Immutability in C# Part Nine: Academic? Plus my AVL tree implementation

+0

감사합니다. 확실히 게시물을 체크 아웃 할 것입니다. – thr

0

일반적으로 잠금 자체는 심각한 리소스를 필요로하기 때문에 전체 데이터 구조에 대해 하나의 잠금이 있습니다. 난 당신이 그것을 피하기 위해 노력하고 주어진 것으로 추측하고있어, 이것은 CPU를 많이 사용하는 작업자 스레드가 지속적으로 트리를 업데이트하는 매우 전문화 된 시나리오 여야합니다.

N 노드마다 하나의 잠금을 공유하여 균형을 유지할 수 있습니다. 회전 조작을 입력 할 때 영향을받는 노드가 사용하는 고유 한 잠금 세트를 찾으십시오. 대부분 한 번만 잠금 장치가됩니다.

+0

전체 구조를 잠그는 것은 엄청나게 비효율적입니다. 1 백만 개의 노드와 ~ 10 개의 스레드가 전체 트리를 차단하는 것으로 작업하면 도축 성능이 저하됩니다. – thr

+0

예, 그래서 물었습니다. 하지만 1 백만 개의 잠금 장치가 얼마나 실용적 일지는 잘 모르겠습니다. –

0

최상의 솔루션은 응용 프로그램에 따라 다릅니다. 그러나 메모리가있는 데이터베이스를 가지고 있고 동시 업데이트를 원하고 매우 세밀한 잠금을 원할 경우 이진 트리처럼 노드 회전이 필요없는 B- 트리를 볼 수도 있습니다 . 또한 균형을 유지하기 위해 더 많은 회전이 필요한 이진 트리와 달리 자동으로 균형을 이룹니다 (예 : Splay 또는 AVL 트리).

트리에 트랜잭션 수정을하려면 대신 기능적 B- 트리 (Thomas Danecker가 불변 트리를 호출 함)를 사용할 수 있습니다. 이것들은 일종의 "copy-on-write"바이너리 트리이며, 당신이 잠글 필요가있는 유일한 것은 루트 노드입니다. 따라서 자물쇠가 하나만 있으면됩니다. 기능적 이진 트리의 모든 연산은 O (log n)이고 트리를 내려갈 때마다 동일한 로그 시간을 소비하기 때문에 연산은 실제로 이진 트리와 동일한 복잡성을 갖습니다.

노드 당 하나의 잠금이있는 것이 가장 적절한 해결책 일 수 있습니다.

0

John Valois의 paper은 auxilary 노드를 사용하여 2 진 탐색 트리를 구현하는 접근법을 간략하게 설명합니다. 내 design 동시 LinkedHashMap에 보조 노드 접근 방식을 사용하고 있습니다.아마도 CiteSeerX (귀중한 자원)에서 동시 나무에 관한 다른 많은 논문을 발견 할 수 있습니다. 리 밸런싱으로 인해 동시성이 좋지 않은 경향이 있으므로 진정으로 필요한 경우가 아니라면 동시 데이터 수집으로 트리를 사용하지 않아도됩니다. 목록 건너 뛰기와 같은 실용적인 접근 방식은 더 잘 해결됩니다.

1

자물쇠없는 알고리즘은 참조 카운트가 부족하여 일반적으로 문제가 발생합니다. 요소에 대한 포인터가 유효한지 알 수 없습니다. 아마도 그 요소가 사라 졌을 것입니다.

Valois '는에 유용하지 않은 이국적인 메모리 할당 배열 으로이 문제를 해결합니다.

자물쇠가없는 균형 잡힌 나무를 볼 수있는 유일한 방법은 참조 횟수를 유지할 수 있도록 증가/감소를 수행 할 수있는 수정 된 MCAS를 사용하는 것입니다. 이런 식으로 MCAS를 수정할 수 있는지 살펴 보지 않았습니다.

관련 문제