잠금이없는 지속적인 업데이트 시간 동시 트리 데이터 구조?


20

나는 최근에 약간의 문헌을 읽었으며 다소 흥미로운 데이터 구조를 발견했습니다.

업데이트 시간을 최악의 업데이트 시간 [1-7]으로 낮추는 다양한 방법을 연구했습니다 .O(1)

최근에는 효율적인 동시 액세스를 지원하기 위해 잠금없는 데이터 구조를 살펴보기 시작했습니다.

잠금이없는 데이터 구조의 구현 에 이러한 최악의 경우 업데이트 시간 기술이 사용 되었습니까?O(1)

나는 왜 냐고 묻습니다. 나에게 그들은이 "이론적 향상"의 실질적인 확장처럼 보인다.


  1. Tarjan, Robert Endre. “O (1) 회전에서 균형 검색 트리 업데이트.”정보 처리 서신 16, no. 5 (1983) : 253 – 257.

  2. Driscoll, JR, N Sarnak, DD Sleator 및 RE Tarjan. “데이터 구조가 지속적으로 유지됩니다.”컴퓨터 이론에 관한 연례 ACM 심포지엄 진행, 109–121. STOC '86. 미국 뉴욕, 뉴욕 : 1986 년 ACM.

  3. Levcopoulos, C. 및 Mark H. Overmars. “O (1) 최악의 경우 업데이트 시간을 갖는 균형 검색 트리.”Acta Inf. 26 번 3 (1988 년 11 월) : 269–277.

  4. 플라이셔, 루돌프 O (1) 최악의 경우 업데이트 시간을 갖는 간단한 균형 검색 트리

  5. Dietz, Paul F 및 Rajeev Raman. “지속적인 업데이트 시간 핑거 검색 트리.”정보 처리 문자 52, no. 3 (1994) : 147 – 154.

  6. Lagogiannis, George, Christos Makris, Yannis Panagis, Spyros Sioutas 및 Kostas Tsichlas. “최악의 지속적인 업데이트 시간을 가진 새로운 동적 균형 검색 트리.”J. Autom. 랭 빗. 8 번 4 (2003 년 7 월) : 607–632.

  7. Brodal, Gerth Stølting, George Lagogiannis, Christos Makris, Athanasios Tsakalidis 및 Kostas Tsichlas. "포인터 머신의 최적의 손가락 검색 트리."J. Comput. 시스. 공상 과학 67 번 2 (2003 년 9 월) : 381–418.


2
문제를 조사하고자하는 사람들을 위해 논문에 대한 링크를 추가해보십시오.
라파엘

3
좋아, 각 기사에 대한 링크에 추가되었습니다.
AT

1
유용한 답변을 얻지 못하면 cstheory.SE에 다시 게시하는 것이 좋습니다 .
JeffE

1
제안 해 주셔서 감사합니다. 나는 다시 게시했습니다 : 잠금이없는 지속적인 업데이트 시간 동시 트리 데이터 구조?
AT

내가 사용하는 실제 잠금 무료 데이터 구조의 전에 라이브러리를. 잠금없는 트리 데이터 구조를 지원합니다. 아마도 당신이 찾고있는 것을 가지고있을 것입니다.
레자

답변:


4

자체로는 도움이되지 않습니다. 잠금이없는 데이터 구조에는 데이터 구조가 변경 될 때 단일 원자 인스턴스가 있어야합니다. 모든표현 불변량은 그 원자 순간 직전과 직후에 효력을 발휘할 필요가있다.O(1)

즉, 데이터 구조를 수정하는 경우 중요한 특징은 개인 데이터 구조에 대해 모든 모드를 수행 한 다음 단일 원자 명령어로 수정을 교체 할 수 있다는 것입니다.

잠금 해제는 일반적으로 데이터 구조가 변경 불가능한 경우 ( 순전히 기능적 ) 가장 쉽습니다 . 데이터 구조의 현재 버전에 대한 전역 포인터를 유지하기 만하면됩니다. 독자는 아무것도 잠글 필요가 없습니다. 데이터 구조에 대한 수정은 전역 포인터를 하나의 불변 데이터 구조로 바꾸고 다른 것으로 바꿈으로써 수행됩니다.

예를 들어, 순전히 기능적인 트리 밸런스 트리가 있다면 :

  1. 트리의 루트에 대한 현재 전역 포인터를 기록하십시오.
  2. 노드를 삽입하거나 삭제하는 새 트리를 작성하십시오. (이것은 현재 트리에있는 노드 수의 시간과 공간에서 로그이며 수정 점에서 루트까지 새 노드를 작성하고 이전 버전의 데이터 구조의 이전 부분에서 모든 것을 가리키는 것입니다. )
  3. 원자 포인터를 루트와 원자 적으로 비교하고 교체하십시오. (이전 루트 포인터를 기록한 시간과 지금 사이에 다른 수정이 발생한 경우에는 실패 할 수 있습니다.이 경우 1 단계로 돌아가서 다시 시도하십시오. 소위 "낙관적 동시성 제어"입니다.)

가장 중요한 부분은 표현 불변성을 유지해야 할 필요에 대해 위에서 말한 것입니다. 일반적으로 트리 중간에서 원자 적으로 변경하는 알고리즘을 갖는 것만으로는 충분하지 않습니다. 왜? 예를 들어, 트리의 사전 순서 순회를 수행하는 리더 스레드가있을 수 있습니다. 현재 읽고있는 노드의 조상 인 노드를 수정하면 강제로 생각한 전제 조건을 무효화합니다. 독자는 변경하기 전과 똑같이 또는 변경 후와 동일한 방식으로 데이터 구조를 처리 할 수 ​​있어야합니다. 사이에 뭔가가 없습니다.

O(log(N))O(N)


예를 들어 비교 및 ​​스왑 등의 활성 대기 기술은 일반적으로 "자유 잠금"이라고하며 변경 가능한 설정에서도 몇 가지 방법이 있습니다.
Raphael

적극적 대기 라는 용어에 익숙하지 않습니다 (Google이 도와주지 않습니다). (Kogan과 Petrank의 작업에 대해 이야기하고 있다면, 잠금없는 알고리즘을 대기없는 것으로 바꾸는 방법을 보여줍니다.) 일반적으로 잠금 해제에 대한 가변성을 처리하는 방법에 대한 편집을 추가했습니다.
방황 논리

"활성 대기"에 의해 나는 같은 것을 의미하는 while ( !P ) { noOp(); } doWork();경우 noOp수 있습니다 sleep또는 유사한.
Raphael

에서 편집 부분, 당신은 변경 가능한 데이터 구조 잠금이없는 만들기위한 기술을 언급했다. 표시된대로 전체 데이터 구조를 복사하고 사본을 수정 한 다음 CAS 기본 요소를 사용합니다. 그러나 Copy단계를 원 자성 으로 만드는 방법은 무엇입니까? 의 또 다른 어려운 문제인 것 같습니다 atomic snapshot.
hengxin

@hengxin : CAS 기본 요소를 "게시"연산자로 생각하십시오. 데이터 구조가 게시되기 전에 수정 작업을 수행하는 스레드 만 액세스 할 수 있습니다. 데이터 구조가 게시 된 후에는 변경할 수 없습니다. 스레드가 복사 할 수있는 유일한 것은 게시 된 버전이므로 변경할 수 없으므로 복사 단계는 원자 성일 필요가 없습니다. 두 스레드가 동시에 변경하려고하면 둘 다 동일한 불변 데이터 구조를 복사하고 로컬 사본을 수정 한 다음 CAS 조작 중 하나가 성공하고 다른 하나는 실패합니다. 실패한 것은 다시 복사하고 업데이트해야합니다.
방황 논리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.