KR20030065308A - 불필요 정보 정리 - Google Patents

불필요 정보 정리 Download PDF

Info

Publication number
KR20030065308A
KR20030065308A KR1020027012891A KR20027012891A KR20030065308A KR 20030065308 A KR20030065308 A KR 20030065308A KR 1020027012891 A KR1020027012891 A KR 1020027012891A KR 20027012891 A KR20027012891 A KR 20027012891A KR 20030065308 A KR20030065308 A KR 20030065308A
Authority
KR
South Korea
Prior art keywords
tree
memory allocation
unnecessary information
memory
pointer
Prior art date
Application number
KR1020027012891A
Other languages
English (en)
Inventor
헤이워드앤드류
Original Assignee
타오 그룹 리미티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 타오 그룹 리미티드 filed Critical 타오 그룹 리미티드
Publication of KR20030065308A publication Critical patent/KR20030065308A/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

내부 포인터를 이용한 불필요 정보 정리기는 메모리 할당(a,…,g)을 각각 나타내는 다수의 연결된 노드를 구비한 트리구조를 유지한다. 각 알려진 사용중인 내부 포인터(P)에 대해, 상기 트리는 포인터가 지시하는 상기 메모리 할당(c)을 결정하기 위해 검색되어 진다. 상기 메모리 할당(c)은 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내어 진다. 일단 모든 이용가능한 사용중인 포인터가 검색된 후, 상기 시스템은 해제를 위해 불가피한 것으로 나타나지 않은 메모리 할당을 해제한다. 바람직하게는, 상기 트리는 AVL 트리이다. 상기 방법은 메모리 할당의 크기나 메모리에서의 위치에 어떠한 구속도 받지 않고, 어떤 메모리 할당에 적용될 수 있다. 본 발명은 불필요 정보 정리 방법과 불필요 정보 정리기를 포함하는 운영시스템까지 더 확장된다.

Description

불필요 정보 정리{Garbage Collection}
용어 "불필요 정보 정리"는 실행되어지는 프로그램에 대해 메모리가 더 이상 필요 없을 때, 주로 운영시스템에 의한 컴퓨터 메모리의 자동재생에 관한 것이다. C 또는 C++등의 일부 언어에서, 메모리 할당자유(memory allocation freeing)는 프로그래머에 의해 명백히 행해져야만 한다. (썬 마이크로시스템사(Sun Microsystems, Inc.)의 상표) 자바등의 많은 다른 언어에서, 프로그래머는 배경으로 운영되는 불필요 정보 정리에 의해 메모리 할당의 해제에 대해 걱정할 필요가 없다. 이러한 불필요 정보 정리는 자바가상머신(Java Virtual Machine, JVM)의 부분이다. 프로그래머에 의해 생성된 객체는 상기 객체에 대한 더 이상의 어떠한 참조가 있지 않을 때(그리고 이에 따라 상기 객체가 실행 프로그램에 의해 다시 접근될 수 없을 때) JVM의 일부인 불필요 정보 정리에 의해 자동적으로 제거된다.
객체에 대한 참조는 객체(O1)가 한 포인터(pointer)를 포함하거나 또 다른 객체(O2)를 처리할 때 만들어질 수 있어서, 객체(O1)는 필드와 객체(O2)의 콜 메쏘드(call method)에 접근할 수 있다. 객체에 대한 참조는 또한 정적(글로벌데이터,global data) 및 프로세서 스택(processor stack)에 나타날 수 있다. 개념적으로, 자바에서, 이들 참조는 전체 객체를 지시하며 객체의 어떠한 단일부분을 지시하지 않는다.
자바코드가 원시코드로 컴파일될 때, 이들 참조는 데이터 구조사이에 포인터(직접 포인터이거나 간접 포인터)가 될 수 있다. 전형적으로, 이들 포인터는 객체를 나타내는 데이터 구조의 시작(즉, 가장 아래의 메모리 어드레스(memory address))을 지시한다.
원시코드를 생성할 때 최적화로서, 또 다른 데이터 구조의 시작을 지시하는 것보다는 내부를 지시하는 포인터를 생성하는 것이 유용할 수 있다. 만일 불필요 정보 정리기가 참조로서 이들 내부 포인터를 인식할 수 있다면, 원시코드는 최초 포인터를 데이터 구조의 시작에 저장해야하지 않아도 되며; 그렇지 않으면, 최초 포인터는 저장되어야 할 필요가 있으며, 더 큰 코드를 초래한다.
내부 포인터에 대한 효율적인 검색을 위한 메카니즘들이 존재하지만, 이들은 특정 메모리 배치(memory layout)의 집속에 따르며; 유사한 크기의 할당은 페이지 경계(page boundary) 또는 알려진 메모리 위치에서 시작하는 동일 메모리 영역으로부터 모두 만들어진다. 전형적으로, 각각의 상기 영역에 대한 시작 메모리 할당은 일정하고, 모두가 인자 2의 배수이다. 이러한 배열로, 할당 크기와 시작 메모리는 인자 2의 역으로 내부 포인터를 마스킹(masking)함으로써 결정될 수 있다: 이는 포인터를 메모리 영역의 시작에 옮긴다.
내부 포인터의 불필요 정보 정리에 대한 이와 같은 종래 기술적 접근은, 심지어 작은 객체조차도, 메모리의 큰 블록이 상기 메모리 블록이 (예를 들어 페이지 경계에)적절히 정렬되어지도록 보장하기 위해 할당되어질 필요가 있으므로, 메모리 낭비적이다. 이러한 형태의 비효율적인 메모리 할당은 프로그램이 휴대용 컴퓨터 또는 이동전화등의 내장된 환경에서 운영되어 질 때 특히 손상될 수 있다.
종래 불필요 정보 정리 시스템이 갖는 또 다른 어려움은 사용중에 있는 특정 메모리 할당 구성의 세부사항에 전형적으로 따른다는 것이다. 이는 상기 메모리 할당이 불필요 정보 정리를 실행하는 운영시스템의 제어하에 있을 때 종종 그렇듯이 편리할 수도 있으나, 상기 불필요 정보 정리기를 포함하는 운영시스템이 메모리 할당을 제어하는 또 다른 내재된 운영시스템에 "주(host)"가 되는 "주" 시스템에서는 훨씬 편리하지 않다. 다른 내재된 운영시스템이 다른 메모리 할당 구성을 이용할 수 있다는 사실은 다른 불필요 정보 정리기가 각 경우에 제공될 필요가 있다는 것을 의미한다. 이는 프로그래밍 노력의 낭비일 뿐만 아니라 불필요 정보 정리 능력을 포함하여, 다양한 다른 내재된 운영시스템에 대한 변경없이 주가될 수 있는 조밀하고 효율적인 운영시스템을 제공하는 것이 사실상 불가능하게 하므로 또한 불편하다.
본 발명은 불필요 정보 정리에 관한 것으로, 특히 비록 배타적이지는 않지만 객체지향 환경내의 불필요 정보 정리에 관한 것이다.
도 1은 최적화된 원시코드에서 내부 포인터의 사용을 도시한 개략도이다.
도 2는 내부 포인터를 따라 메모리 블록중 하나에 할당된 메모리 블록을 도시하고 있다.
도 3은 본 발명의 바람직한 실시예에 따른 도 2의 메모리 할당에 대한 AVL 트리 구조이다.
도 4a는 트리의 노드중 하나를 형성하는 일례의 메모리 할당 또는 "청크(chunk)"를 도시하고 있다.
도 4b는 단일 "청크"가 여러 개의 개개의 불필요 정보 정리 가능한 할당에 사용될 때 이용하기 위한 다른 방안의 메모리 할당을 도시하고 있다.
본 발명의 목적은 종래 기술의 문제를 최소로 경감하는 것이다.
본 발명의 제 1 양태에 따른 (a) 메모리 할당을 각각 나타내는 다수의 연결된 노드(node)를 구비한 동적 트리구조를 유지하는 단계와; (b) 사용중인 포인터에 대해, 포인터가 지시하는 메모리 할당을 결정하도록 트리를 검색하는 단계와; (c)상기 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 단계를 포함하는 불필요 정보 정리 방법을 제공하고 있다.
이용불가능한 메모리 할당의 표시는 (만일 아직 표시되지 않았다면) 메모리 할당 또는 트리구조상에 대응하는 노드를 마킹하는 것을 포함할 수 있다. 본 발명의 방법은 실재적으로 사용되지 않는 메모리 할당을 해제하는 것에 대한 어떤 편리한 메카니즘과 연관하여 사용될 수 있다: 바람직하게는, 다수의 사용중인 포인터에 대해 단계(b)와 단계(c)를 반복하는 단계와 해제에 이용할 수 없는 것으로 나타나지 않은 메모리 할당을 해제하는 단계를 포함한다. 바람직하게는 단계(b)와 단계(c)는 모든 사용중인 포인터에 대해, 또는 시스템에 알려진 적어도 모든 이러한 포인터에 대해 반복되어 진다.
바람직하게는, 상기 트리는 2진 트리이며, 표준 2진 순회(standard bianry traverse)를 이용하여 상부로부터 검색된다. 한가지 특히 편리한 실시예에서, 상기 트리는 AVL 균형트리(AVL balanced tree)이다. 표준 AVL 알고리즘은 언제 새로운 노드가 새로운 메모리 할당에 대응하여 추가되거나 언제 노드가 재사용을 위해 해제된 메모리 할당에 대응하여 제거되든지 간에 트리의 균형된 형태를 유지하게 상기 트리를 재구성하도록 사용될 수 있다.
상기 트리는 2진 트리일 필요는 없으며, 본 발명은 어떤 N 방향트리 뿐만 아니라 어떤 N 방향(N-way)균형트리에 적용될 수 있다.
각 메모리 할당은 인접한 메모리 블록을 나타낼 수 있으며, 객체지향 시스템에서, 개개의 객체를 나타낼 수 있다. 본 발명의 한 형태에서, 상기 객체는 자바객체의 컴파일된 형태일 수 있다.
각 노드는 블록 시작위치와 블록 끝위치에; 또는 상기 위치중 어느 하나와 블록 길이에, 노드와 관련된, 정보를 가질 수 있다. 상기 노드는 또한 선택적으로 다른 메모리 할당 관련된 정보, 예를 들면, 블록 식별자(block identifier)를 포함할 수도 있다. 트리구조를 효율적으로 정의하기 위해서, 각 노드는 바람직하게 (설령 있다면) 상기 노드의 부모노드(parent nodes)와 (설령 있다면) 상기 노드의 자식노드(child nodes)의 어드레스(address)를 또한 포함한다.
상기 트리구조는 내부 포인터를 포함한 어떤 형태의 포인터를 검색하는데 사용될 수도 있다.
본 발명의 또 다른 양태에 따른 (a) 개개의 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 트리구조를 유지하는 수단과; (b) 사용중인 포인터에 대해, 포인터가 지시하는 메모리 할당을 결정하기 위해 트리를 검색하는 수단과; (c) 상기 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 수단을 포함하는 불필요 정보 정리기를 제공하고 있다.
본 발명의 또 다른 양태에 따른 (a) 하나 이상의 불필요 정보 정리 가능한 메모리 할당을 포함하는 시스템 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 트리구조를 유지하는 단계와; (b) 사용중인 포인터에 대해, 포인터가 지시하는 불필요 정보 정리 가능한 메모리 할당을 결정하기 위해 상기 트리를 검색하는 단계와; (c) 상기 불필요 정보 정리 가능한 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 단계를 포함하는 불필요 정보 정리 방법을제공하고 있다.
본 발명의 또 다른 양태에 따른 (a) 하나 이상의 불필요 정보 정리 가능한 메모리 할당을 포함하는 시스템 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 트리구조를 유지하는 수단과; (b) 사용중인 포인터에 대해, 포인터가 지시하는 불필요 정보 정리 가능한 메모리 할당을 결정하기 위해 상기 트리를 검색하는 수단과; (c) 상기 불필요 정보 정리 가능한 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 수단을 포함하는 불필요 정보 정리기를 제공하고 있다.
본 발명은 운영시스템과 정의한 바와 같이 불필요 정보 정리기를 포함한 JVM(자바가상머신)으로 더 확장된다.
일 실시예에서, 상기 운영시스템은 메모리 할당수단을 포함하고 있어 메모리 할당의 메모리에서 위치에 인위적인 제약을 도입할 필요없이 메모리 할당이 가능한 한 효율적으로 제어될 수 있다. 다른 방안으로, 상기 운영시스템은 상기 불필요 정보 정리기가 외장된 메모리 할당과 작동하게 배열되어 있어, 어떠한 메모리 할당 수단도 포함하지 않을 수 있다. 이러한 일례는 본 발명의 운영시스템이 제 2 의, 내재한 운영시스템에 대해 주가되며; 이런 경우에, 외장된 메모리 할당이 상기 내재한 운영시스템의 메모리 할당 수단으로써 제공된다. 상기 내재한 운영시스템에 의해 적용되어진 상기 메모리 할당 구성에 무관하게, 상기 불필요 정보 정리기는 외장된 메모리 할당수단을 여전히 이용할 수 있다. 상기 외장 메모리 할당수단을 이용할 수 있는 불필요 정보 정리기를 가진 운영시스템의 특별한 잇점은 상기 내재한 시스템에 의해 사용된 메모리 할당 구성에 대해 걱정할 필요없이 이러한 운영시스템이 다양한 다른 내재한 시스템에 대해 주가될 수 있다는 것이다. 만일 상기 내재한 시스템 할당 구성이 효율적이라면, 상기 운영시스템은 잇점을 가질 것이다.
본 발명은 기술한 바와 같이 방법을 수행하는 컴퓨터 프로그램과 이러한 컴퓨터 프로그램을 수행하는 데이터 운반체(data carrier)와, 이러한 컴퓨터 프로그램을 나타내는 데이터 스트림(data stream)으로 더 확장된다. 기술한 바와 같이 운영시스템을 수행하는 데이터 운반체와 이러한 운영시스템을 나타내는 데이터 스트림으로 또한 확장된다.
본 발명은 여러가지 방식으로 구현될 수 있으며, 예로써, 한 특정 실시예가 첨부 도면에 대해 기술될 것이다:
도 1은 최적화된 원시코드의 일부에 레지스터 및 메모리 사용의 세부사항을 개략적으로 예시하고 있다. 데이터 구조(10,12,14)는 개개의 객체를 나타내고 메모리에 보유되어 있다. 부가적으로, 머신 레지스터(machine register)(16)는 부가적인 값, 전형적으로 메모리에 보유된 객체에 대해 또는 이들 객체내부의 위치에 대해 포인터를 가진다. 도 1에 나타낸 바와 같이, 레지스터(1)는 객체(10)내 특정 위치를 지시하는 포인터(18)(내부 포인터)를 보유한다. 마찬가지로, 레지스터(2,3)는 객체(14)내 다른 위치에 내부 포인터(20,22)를 보유한다.
포인터들은 포인터(24)에 의해 도시된 바와 같이 메모리에 또한 보유될 수 있다. 이는 객체(12)내 내부 위치를 지시하는 객체(10)내 내부 포인터이다.
모든 포인터가 내부에 있을 필요는 없다. 예를 들면, 포인터(26)는 객체(12)를 나타내는 데이터 구조의 시작을 지시한다.
도 1은 개개의 객체가 자바와 같은 최초언어에서 또 다른 객체를 참조하는 방식과 정확히 일치할 필요가 없고, 일반적으로 일치하지 않는, 최적화된 원시코드를 나타냄을 주목해야 한다. 자바 그 자체는 내부 포인터의 개념, 또는 더 엄밀히 말하면, 포인터의 개념을 전혀 가지고있지 않다. 대신에, 각 객체는 또 다른 객체를 "참조"할 수 있으며, 상기 참조는 전체로서 객체에 대한 것이지 객체의 어떤 개개의 부분에 대한 것은 아니다. 자바 코드가 컴파일 될 때, 이들 참조는 원시코드로 객체에 대응하는 데이터 구조의 시작을 지시하는 포인터로 변환될 수 있으며 때때로 변환된다. 그러나 이러한 포인터만을 이용한 원시코드는 비효율적이며, 필요에 따라 내부 포인터를 생성하는 것이 본 발명에 따라 바람직하다. 적소에 내부 포인터를 가짐으로써, 객체 데이터 구조의 시작만을 지시하는 최초 자바 포인터가 사라질 수 있다. 도 1에 도시된 바와 같이, 데이터 구조의 시작을 지시하는 포인터(26)와 같은 포인터는 만일 코드가 특히 어드레스를 나타내는 참조에 실재적으로 필요할 때에만 보유되어 진다.
도 2는 본 발명의 바람직한 실시예에 따른 메모리에서 데이터 구조의 저장공간(storage)을 나타낸다. 도 2는 도면의 오른쪽으로 이동함에 따라 메모리 위치 어드레스가 증가하는 메모리 블록(a,b,c…,)을 도시하고 있다. 블록(a)는 메모리 위치(A)에서 시작하고 메모리 위치(A')에서 끝난다; 블록(b)는 메모리 위치(B)에서 시작하고 메모리 위치(B')에서 끝난다; 그리고 나머지 블록에 대해서도 유사하다. 블록 사이의 공간은 명확함을 위해 도시되어 있으며, 필수적으로 존재할 필요는 없다.
새로운 메모리 블록이 할당될 필요가 있을 때, 할당되지 않은 메모리 블록(30)에 또는, 만일 어떠한 블록도 이용가능하지 않는다면, 최종 블록(g)후의, 편리한 메모리 위치에 할당되어 진다. 할당된 메모리는 어떤 크기로 될 수 있으며 어드레스 가능한 메모리 공간내 어떤 위치에 있을 수 있다. 종래 기술에서와 같이, 특정 크기의 또는 특정한 기정의된 위치에 메모리 블록을 할당해야하는 것에 대한 제약이 없다.
실행시 불필요 정보 정리기(garbage collector)의 역할은 애플리케이션에 의해 여전히 요구되는지(또는, 균등하게, 메모리 블록을 지시하는 사용중인 내부 포인터가 있는지)를 알기 위해 각각의 할당된 메모리 블록을 검사하는 것이다. 목적을 달성하기 위해, 새로운 메모리 블록이 할당될 때마다 상기 메모리 블록에 대한 참조가 2진 트리(binary tree)에 추가되고 메모리에 보유된다.
도 4a는 트리상의 단일 노드에 대응하는 개별 메모리 블록을 보다 상세하게 도시하고 있다. 블록 또는 "청크(chunk)"는 헤더(header)(100)와 데이터부 또는 "페이로드(payload)"(102)로 구성되어 있다. 헤더(100)는 이러한 특정 할당이 연관된 트리의 노드를 정의하는 부분(104)과, 할당이 "크거나" "작은"지를 나타내는 부분(106)과, 항목 크기를 정의하는 부분(108)과, 시작위치를 지정하는 부분(110)과 끝 위치를 지정하는 부분(112)을 포함한다. 도 4a 예에서, 상기 부분(106)은 항상 "크다": "작은" 선택(option)은 도 4b에 대해 하기에 더 상세히 논의될 것이다. 상기 페이로드(102)는 헤드부(114)와 데이터부(116)를 포함한다.
도 3은 도 2에 도시된 메모리 할당을 나타내는 전형적인 2진 트리를 도시하고 있다. 트리의 각 노드는 개별 할당을 나타내고, 상기 노드는, 하기에 더 상세히 기술한 바와 같이, 효율적인 검색을 고려하여 연결되어 있다. 각 노드에 저장된 정보는 블록 식별자(노드(40)를 나타내는 d)와, 블록의 시작 어드레스(D)와 끝 어드레스(D')로 구성되어 있다. 다른 방안으로는, D 및 D' 대신에, 길이(D'-D)를 따라, 블록(D)의 시작이나 블록(D')의 끝에 저장할 수 있다.
각 노드는 또한 트리내 노드의 위치를 확립하기 위해 연결정보(linking information)와 또한 연관있다. 예를 들면, 노드(40)는 2개의 자식노드(children node), 즉 노드(42,44)에 연결되어 있다는 정보를 포함할 것이다. 노드(44)는 부모노드(parent node)(40)와, 2개의 자식노드(50,52)를 가진다는 정보를 포함한다. 상기 노드(52)는 어떠한 자식노드를 가지고 있지는 않지만 단일의 부모노드(44)를 가지고 있다. 각 노드와 연관된 연결정보는 왼쪽의 자식노드가 오른쪽의 노드와 구별될 수 있도록 라벨되거나 정해진다.
예제는 트리가 미지의 내부 포인터가 지시하고 있는 메모리 할당 블록을 식별하기 위해 검색될 수 있는 방식으로 주어질 것이다. 이 예에서, 미지의 포인터는 도 2에 도시된 포인터(P)가 된다. 트리의 상부에 진입하면, 노드(40)에서, P의 값이 D보다 작은지를 알기 위해 테스트가 먼저 행해진다. P가 D보다 작으므로, 블록(b)을 나타내는 왼쪽의 자식노드(42)로 이제 이동한다. 먼저, P가 B보다 작은지를 검사한다. B보다 작지 않으면, P가 B'보다 큰지를 검사하기 위해 진행한다. P가 B보다 크므로, 오른쪽의 자식노드(48)로 이동한다. 다음, P가 C보다 작은지를 검사하고, 그렇지 않다면 C'보다 큰지를 검사한다. P가 C보다 작지도 C'보다 크지도 않으므로, P가 블록 C내에 해당함을 결론지을 수 있으며, 이에 따라 검색은 노드(48)에서 종료된다.
불필요 정보 정리는 모든 현존하는 포인트를 시스템적으로 검사하고, 포인터가 해당되는 메모리 블록을 결정하기 위해 트리를 이용함으로써 실행되어 진다. 이 목적을 위해 어떤 구별도 내부 및 다른 포인터 사이에 만들어질 필요가 없다: 모두가 동일한 방식으로 트리상에 간단히 검색되어 진다. 시작을 위해, 레지스터가 포인터(또는 스택기반의 시스템에서 스택)에 대해 검사되고, 포인터가 지시하는 대응하는 할당된 메모리 블록이 트리로부터 결정된다. 그리고 나서 이들 메모리 블록각각은 또 다른 포인터에 대해 (트리기반의 찾아보기(lookup) 또는 다른 메카니즘을 이용하여)검사되고, 이러한 프로세스가 반복된다. 상기 프로세스가 계속됨에 따라, 사용되고 있는(즉, 메모리 블록내에 지시되고 있는 포인터를 가지는) 것이 발견된 어떤 메모리 블록은 트리의 대응하는 노드에 대하여 "사용중" 플래그(flag)를 저장함으로써 표시된다. 그런 후 사용되지 않고 있는 메모리 블록은 시스템에 의해 해제될 수 있고 그들의 대응노드는 트리로부터 제거될 수 있다. 그런 후 트리는 기본 2진형태로 재연결된다.
상기 논의에서, 단일 메모리 할당은 트리의 단일 노드에 대응한다고 가정하고 있다. 그러나, 어떤 상황에서, 트리상의 단일 노드를 여러 개의 작은 불필요 정보 정리 가능한 할당과 연합하는 것이 더욱 효율적일 수 있다. 이러한 접근은 실행 애플리케이션이 어떠한 제어도 가지지 않으면서 내재된 운영시스템으로부터 메모리가 할당되어진다는 점에서 특히 편리하다. 시스템 메모리 할당자(allocator)는 전형적으로 ("청크"로서 공지된) 시스템 할당을 제공하며, 시스템 할당의 타이밍(timing)과 크기는 애플리케이션의 제어하에 있지 않을 수 있다.
도 4b에 도시된 바와 같이, 단일 시스템 할당 또는 "청크"는 예에서 참조부호(120,122,124)로 나타낸 많은 수의 다른 불필요 정보 정리 가능한 할당에 이용될 수 있다. 이들 유닛 각각은, 전체 청크 페이로드(102)내에, 유닛 자신의 헤더(114)와 데이터부(116)를 포함한다. 이해를 쉽게하기 위해, 도 4b에 사용된 참조부호는 도 4a에 대해 이미 상술한 참조부호와 일치한다.
바람직한 실시예에서, 도 4b의 접근은 만일 애플리케이션이 1k보다 작은 메모리 할당을 필요로한다면 사용된다: 가능한 개개의 할당은, 예를 들면, 32, 64, 128, 256, 512 및 1024 바이트이다. 애플리케이션이 1k보다 큰 할당을 필요로 하는 곳에는, 도 4a의 접근이 사용된다.
바람직한 실시예에서, 트리의 노드는 도 4a이거나 4b에, 또는 둘 다에 도시된 바와 같이, 개개의 시스템 할당을 나타낸다. 헤더(114) 및 데이터부(116)는 각각 단일의 높은 수준의 불필요 정보 정리 가능한 할당, 예를 들면, 자바 할당에 대응한다.
만일 애플리케이션이 작은 할당(예를 들면, 바람직한 실시예에서 1k보다 작은)을 필요로 한다면, 전체 시스템 블록이 동시에 저장되고 트리상에 두어진다. 그런 후 애플리케이션은 자체적으로 언제 및 어떤 상황하에서 사용되지 않은 작은 할당이 접근될 수 있게 제어하며, 만일 적합하다면, 트리상에 어떤 영향을 끼치지 않고도 자신의 권한으로 불필요 정보 정리될 수 있다. 단지 모든 트리의 노드와 연관된 모든 개별 할당이 더 이상 사용되지 않을 때에는 불필요 정보 정리에 이용가능한 노드와 대응 시스템 블록 그 자체이다.
물론, 도 4b의 접근이 사용될 때, 개개의 불필요 정보 정리 가능한 할당의 시작을 지시하는 포인터가, 전체 시스템 블록에 관한 한, 자체적으로, "내부 포인터"일 것임이 이해될 것이다. 따라서 미지의 내부 포인터가 지시하고 있는 메모리 할당을 발견하는 것에 대한 상기 언급한 방법이 여전히 적용된다. 헤더의 항목크기부(108)를 참조함으로써, 시스템은, 시스템 할당내에, 내부 포인터가 지시하는 정확한 불필요 정보 정리 가능한 할당을 결정할 수 있다.
메모리의 새로운 블록이 할당될 때, 트리에서 새로운 노드가 삽입되어 지는 곳과, 하나 이상의 노드가 대응 블록이 불필요 정보 정리기에 의해 해제되어 질 때 "스닙아웃(snipped-out)"되는 트리를 재연결하는 방법을 결정하기 위해 유지된다. 이는 행해질 수 있는 많은 방법이 있으나, 한가지 특별히 편리한 접근은 AVL 로드 균형 트리(AVL load-balancing tree)를 이용하는 것이다. 이는 노드를 추가하고 삭제할 때 모두 적절한 트리 재구성 알고리즘을 이용함으로써 대략 좌/우 균형을 유지하는 2진 트리 형태이다. 더 상세한 내용은, 예를 들면, 도날드 이. 크누스(Donald E. Knuth), The Art of Computer Programming, Volume 3. Addison-Wesley, Reading, Massachusetts, U.S.A, 1969에 제시되어 있다. 또한 아델손-벨스키, 지.엠. (Adelson-Velskii, G.M) 및 이.엠. 랜디스(E.M. Landis), "An Algorithm for the Oraganization of Information", Soviet Math. Doclady 3, 1692, pp.1259-1263; 및 칼톤, 피.엘.(Karlton, P.L), 에스.에이치. 풀러(S.H. Fuller), 알.이. 스크로그(R.E. Scroggs)와 이.비. 카에흘러(E.B. Kaehler), "Performance of Height-Balanced Trees", Communications of the ACM 19, 1976, pp.23-28을 참조하라. 이들 모든 문헌은 참조로 본 명세서에 포함되어 있다.
AVL 트리를 이용한 바람직한 알고리즘이 상세히 기술될 것이다. 먼저, 약간의 배경설명이 있다. 균형 2진 트리(balanced binary tree)는 효율적인 일반 목적형 데이터 구조이다. 2진 트리는 각 노드가 많아야 2개의 발신엣지를 가진 트리 그래프이다. 균형 2진 트리는 어떤 노드에서 2개의 서브트리 사이에 크기에서의 불균형이 제한되어지게 구성되어 있다. (상기 시스템을 고안한 아델손-벨스키와 랜디스의 이름을 딴) AVL 트리는 어떤 노드의 2개의 서브트리가 항상 많아야 1레벨 정도 차이가 나는 깊이를 가지는 균형 2진 트리 형태이다.
AVL 트리의 한 노드에서 균형을 위한 기준은 2개의 서브트리의 높이에서 차이가 결코 1보다 크지 않다는 것이다. 트리의 높이와 깊이는 다음과 같이 정의되어 있다:
·어떤 요소도 가지지 않는 트리의 높이는 0이다.
·하나의 요소를 가진 트리의 높이는 1이다. 어떤 트리의 루트노드의 깊이는 1이다.
·하나 이상의 요소를 가진 트리의 높이는 가장 큰 서브트리 + 1의 높이이다. 이러한 트리에서 노드의 깊이는 그 부모트리의 깊이 + 1이다.
AVL 트리의 '균형' 속성은 점점 더 효율적인(즉, 트리의 크기에서 단지 시간 로그를 취하는) 방식으로 유지되고 있다. 노드가 삽입되거나 제거될 때마다, 하나 이상의 재균형 변환(rebalancing transformations)이 트리에 적용된다.
요구되는 3가지 기본 작동은: 트리내 요소에 대해 검색하고, 요소를 트리에 삽입하고 요소를 트리로부터 제거하는 것이다. 복사된 키 값은 허용되지 않으나, 이는 필요한 곳에, 부가적인 인자가 유일한 키를 생성하기 위해 저장되는 데이터와 결합될 수 있으므로 어떠한 보편성의 상실도 야기하지 않음을 주목하라.
용어 및 주석
알고리즘은 '노드','링크' 및 '키'로 기술된다. 노드는 단순히 트리의 정점이다. 각 노드는 '왼쪽 링크' 및 '오른쪽 링크'라고 부르는 2개의 연관된 링크를가지고 있으며, 링크의 각각은 서브트리를 지시하거나 (옆에 서브트리가 없음을 의미하는) 널(NULL)값을 가진다. '왼쪽(N)' 및 '오른쪽(N)'을 사용하여 노드(N)의 왼쪽 링크 및 오른쪽 링크를 각각 나타낸다. 루트를 제외한 모든 노드는 지시하는 링크 중 하나의 노드인 유일한 '부모'노드를 가진다. 각 노드는 또한 연관된 키를 가진다. 키(N)를 써서 노드(N)와 연관된 키를 나타낸다. 키는 단순히 노드와 연관된 데이터이다. 키에 전체 순서(ordering)가 있다고 가정하고, 심볼'<'을 이용하여 나타낼 것이다. 예를 들면, ('<'의 일반적인 의미를 가지는) 정수 값이 적합한 키를 만들 것이다. '방향'에 대한 설명을 또한 필요로 한다. 방향은 '왼쪽', '오른쪽' 또는 '균형'중 하나이다. 모든 노드는 또한 연관된 방향을 가지며, 상기 연관된 방향에 대해 Dir(N)이라고 나타내며 여기서 N은 질문에서의 노드이다. 편리한 생략표시로 '링크(d,N)'를 노드로부터의 링크로 의미하게 정의하며, 여기서 N은 노드이고 d는 방향이다. 링크(d,N)은 만일 d가 '왼쪽'이라면 노드(N)의 왼쪽 링크를 가리키고 만일 d가 '오른쪽'이라면 노드(N)의 오른쪽 링크를 가리킨다. 만일 d가 '균형'이라면 링크(d,N)의 값은 정의되지 않으나, 결코 이러한 문맥에서 사용되지 않을 것이다.
만일 d가 어떤 방향이라면, '-d'로써 반대방향을 나타낸다. 명확하게, 만일 d가 '왼쪽'이라면, -d는 '오른쪽'이고 그 역도 마찬가지이다. 만일 d가 '균형'이라면, -d는 정의되지 않으나, 이러한 문맥에서 결코 사용되지 않을 것이다.
알고리즘에 대한 설명에서, 명확성을 위해, 트리의 루트는 널이 아니다-즉, 트리는 공백이 아니다고 가정한다. 명백히, 검색 및 제거는 항상 공백 트리에 작동하지 않으며 삽입은 단순히 삽입된 요소가 루트가 되는 트리를 형성한다.
만일 링크가 노드를 기대하는 문맥에서 참조된다면, 상기 링크에 의해 지시된 노드를 참조하도록 취해져야만 함을 주목하라.
검색 알고리즘
단계 1) 변수를 초기화한다
·노드(P)가 루트노드와 동일하게 최초로 정의한다. 노드(P)는 트리를 순회하도록 사용되는 '유동 포인트(current point)'가 된다.
·K를 찾고자 하는 키이도록 정의한다.
·또한 Q를 이용하여 필요에 따라 정의되는 일시 노드를 표시한다.
단계 2) 비교한다
·만일 K < 키(P)이면 단계 3으로 간다.
·만일 K > 키(P)이면 단계 4로 간다.
·만일 K = 키(P)이면, 찾고 있던 요소를 발견하게 된다. (검색 끝)
단계 3) 왼쪽으로 이동한다
·Q를 왼쪽(P)에 둔다.
·만일 Q가 현재 널이 아니면: P를 Q에 두고 단계 2로 복귀한다.
·나머지 경우 만일 Q가 현재 널이면: 트리는 키(K)를 가진 요소를 포함하지 않았음을 의미하므로, 검색은 종료되고 실패로 복귀한다. (검색 끝)
단계 4) 오른쪽으로 이동한다
·Q를 오른쪽(P)에 둔다.
·만일 Q가 현재 널이 아니면: P를 Q에 두고 단계 2로 복귀한다.
·나머지 경우 만일 Q가 현재 널이면: 트리는 키(K)를 가진 요소를 포함하지 않았음을 의미하므로, 검색은 종료되고 실패로 복귀한다. (검색 끝)
삽입 알고리즘
단계 1) 변수를 초기화한다
· 트리의 일부가 아니라 루트노드의 부모노드가 되게 고려되는 특별한 노드가 되게 '헤드'를 정의한다. 특히, 헤드의 오른쪽 링크는 루트를 지시한다. 이는 상기 루트노드를 어떠한 부모노드도 가지지 않는 특별한 경우로 간주할 필요가 없도록 한다.
·노드(S)와 노드(P)가 루트노드와 동일하게 최초로 정의한다. 노드(P)는 트리를 순회하도록 사용되는 '유동 포인트'가 된다. 노드(S)는 삽입 후 트리를 재균형시키기 위해 시작 포인트로서 사용되어야 하는 서브트리를 추적하는데 사용된다.
·노드(T)를 헤드와 동일하게 정의한다. 항상 T가 S의 부가 되게 업데이트 한다.
·K를 삽입되게 시도하고 있는 키이도록 정의한다.
·또한 필요에 따라 정의되는 Q와 R을 사용하여 노드를 나타낸다.
단계 2) 비교한다
·만일 K < 키(P)이면 단계 3으로 간다.
·만일 K > 키(P)이면 단계 4로 간다.
·만일 K = 키(P)이면, 키의 요소가 트리내에 이미 있어 어떠한 삽입도 필요하지 않다. (검색 끝)
단계 3) 왼쪽으로 이동한다
·Q를 왼쪽(P)에 둔다.
·만일 Q가 현재 널이 아니면: 만일 Dir(Q)가 '균형'이 아니라면, T를 P에 두고 S를 Q에 둔다. 그런 후, Dir(Q)의 값이 무엇이든지 간에, P를 Q에 두고 단계 2로 복귀한다.
·나머지 경우 만일 Q가 현재 널이면: 새로운 요소를 여기에 삽입한다. 이는 Q를 (키(K)를 가지는) 새롭게 생성된 노드에 두고, 왼쪽(P)를 변경하여 Q를 지시하게 하고 그런 후 단계 5로 감을 의미한다.
단계 4) 오른쪽으로 이동한다
·Q를 오른쪽(P)에 설정한다.
·만일 Q가 현재 널이 아니면: 만일 Dir(Q)가 '균형'이 아니라면, T를 P에 두고 S를 Q에 둔다. 그런 후, Dir(Q)의 값이 무엇이든지 간에, P를 Q에 두고 단계 2로 복귀한다.
·나머지 경우 만일 Q가 현재 널이면: 새로운 요소를 여기에 삽입한다. Q를 (키(K)를 가지는) 새롭게 생성된 노드에 두고, 오른쪽(P)를 변경하여 Q를 지시하게 하고 그런 후 단계 5로 간다.
단계 5) 삽입한다
·새로운 노드(Q)의 필드를 초기화한다: 키(Q)를 K에 두고, 왼쪽(Q)과 오른쪽(Q)을 널로 하고, Dir(Q)를 '균형'으로 한다.
·단계 6으로 진행한다.
단계 6) 균형을 조절한다
·새로운 트리 상태를 반영하기 위해 S와 Q 사이 노드에 균형 방향을 설정하는 것이 필요하다. 이는 다음과 같이 행해진다:
·만일 K < 키(S)이다면, d를 '왼쪽'으로 정의하고, 그렇지 않으면, d를 '오른쪽'으로 정의한다.
·P를 링크(d,S)에 두고 P와 동일하게 노드(R)를 초기에 정의한다.
·(0번을 의미하는)P = Q일 때까지 다음을 반복한다.
1. 만일 K < 키(P)이고 Dir(P)를 '왼쪽'에 두면, P를 왼쪽(P)에 둔다.
2. 만일 K > 키(P)이고 Dir(P)를 '오른쪽'에 두면, P를 오른쪽(P)에 둔다.
3. (만일 K = 키(P)이면 P = Q인 경우이므로 진행된다.)
·단계 7로 진행한다.
단계 7) 균형
·3가지 경우중 한 가지가 Dir(S)의 값에 따라 적용된다.
·만일 Dir(S) = '균형'이면 Dir(S)를 d에 둔다. 이 경우, 삽입은 현재 완성되어 있다. (삽입 끝)
·만일 Dir(S)가 d의 반대이면 (즉, -d이면) Dir(S)를 '균형'에 둔다. 이 경우, 삽입은 현재 완성되어 있다. (삽입 끝)
·만일 Dir(S) = d이면 트리는 불균형이된다. (단계 6에서 정의된 바와 같이) 노드(R)을 고려함으로써 진행방법을 결정한다. 만일 Dir(R)이 d의 반대이면 (즉, -d이면) 단계 9로 간다. 만일 Dir(R) = d이면 단계 8로 간다. 이러한 포인트에서 어느 한쪽은 '균형'될 수 없음을 주목해야 한다.
단계 8) 단일 회전
·트리에서의 불균형을 다음과 같이 수정한다:
·P를 R에 둔다.
·링크(s,S)를 링크(-d,R)에 두고 그런 후 링크(-d,R)를 S에 둔다.
·Dir(S)과 Dir(R)을 '균형'에 둔다.
·단계 10으로 간다.
단계 9) 이중 회전
·트리에서의 불균형을 다음과 같이 수정한다:
·P를 링크(-d,R)에 두고, 그런 후 링크(-d,R)를 링크(d,P)에 두며, 그런 후, 링크(d,P)를 R에 둔다.
·링크(d,S)를 링크(-d,P)에 두고 그런 후 링크(-d,P)를 S에 둔다.
·Dir(P)의 값에 따라 다음과 같이 Dir(S)과 Dir(R)을 설정한다:
1. 만일 Dir(P) = d이면 Dir(S)를 -d에 두고 Dir(R)을 '균형'에 둔다.
2. 만일 Dir(P) = -d이면 Dir(S)를 균형에 두고 Dir(R)을 d에 둔다.
3. 만일 Dir(P) = '균형'이면 Dir(S) 및 Dir(R) 둘 다를 또한 '균형'에 둔다.
·단계 10으로 간다.
단계 10) 링크를 수정한다
·현재 트리를 재균형하였다면, 재균형된 서브트리의 부모를 수정 코드에 연결하도록 해야만 한다.
·만일 S = 오른쪽(T)이면 오른쪽(T)를 P에 설정하고, 그렇지 않으면 왼쪽(T)를 P에 설정한다.
·알고리즘을 종료한다. (삽입 끝)
제거 알고리즘
단계 1) 변수를 초기화한다
·트리의 일부가 아니라 루트노드의 부모노드가 되게 고려되는 특별한 노드가 되게 '헤드'를 정의한다. 특히, 헤드의 오른쪽 링크는 루트를 지시한다. 이는 상기 루트노드를 어떠한 부모노드도 가지지 않는 특별한 경우로 간주할 필요가 없도록한다.
·P[]를 노드의 배열이 되게 정의한다. 그래서 P[0], P[1]등을 사용하여 이 배열내의 요소를 나타낸다.
·유사하게, d[]를 방향배열이 되게 정의한다.
·P[0]를 '헤드'에 둔다.
·d[0]를 '왼쪽'에 둔다.
·노드(P)를 정의하고, 초기에 오른쪽(P[0])(즉, 루트노드)에 둔다.
·K를 삽입하기 위에 시도하고 있는 키가 되게 정의한다.
·카운터 변수 c가 정수가 되게 정의하고, 초기에 1로 둔다.
·또한 필요에 따라 정의되는 R과 S를 사용하여 노드를 나타낼 것이며, 또한필요에 따라 정의되는 Q를 사용하여 (노드가 아니라)링크를 나타낼 것이다. Q를 어떤 (노드) 값에 설정한다고 말할 때, 상기 노드에서 링크(Q)를 의미함을 특히 주목해야 한다.
단계 2) 비교한다
·만일 K < 키(P)이면 단계 3으로 간다.
·만일 K > 키(P)이면 단계 4로 간다.
·만일 K = 키(P)이면, 단계 5로 간다.
단계 3) 왼쪽으로 이동한다
·P[c]를 P에 둔다. d[c]를 '왼쪽'둔다.
·1을 c에 더한다.
·P를 왼쪽(P)에 둔다.
·만일 P가 널이면 트리는 키(K)를 가지는 요소를 포함하지 않으므로 여기서 멈춘다. (제거 끝)
·단계 2로 복귀한다.
단계 3) 오른쪽으로 이동한다
·P[c]를 P에 둔다. d[c]를 '오른쪽'둔다.
·1을 c에 더한다.
·P를 오른쪽(P)에 둔다.
·만일 P가 널이면 트리는 키(K)를 가지는 요소를 포함하지 않으므로 여기서 멈춘다. (제거 끝)
·단계 2로 복귀한다.
단계 5) 오른쪽 링크가 널인지를 검사한다.
·Q가 링크(d[c-1],P[c-1])이도록, 즉, P에 도달하기 위에 뒤이은 링크이도록 정의한다.
·만일 오른쪽(P) = 널이면 단계 6으로 진행한다.
·Q를 왼쪽(P)에 둔다.
·왼쪽(P)가 널이 아니면 Dir(Q)를 '균형'에 두고 단계 10으로 간다.
단계 6) 계승자(succession)를 찾는다
·R을 오른쪽(P)에 둔다.
·만일 왼쪽(R)이 널이 아니라면, 단계 7로 간다.
·왼쪽(R)을 왼쪽(P)에 둔다.
·Q를 R에 둔다.
·Dir(R)을 Dir(P)에 둔다.
·d[c]를 '오른쪽'에 두고 P[c]를 R에 둔 뒤, 1을 c에 더한다.
·단계 10으로 간다.
단계 7) 널 왼쪽 링크를 찾기 위한 준비
·S를 왼쪽(R)에 두고 정수 1을 정의하여, 초기에 c에 둔다.
·1을 c에 더한다.
·d[c]를 '왼쪽'에 두고 P[c]를 R에 둔 뒤, 1을 c에 다시 더한다.
·단계 8으로 진행한다.
단계 8) 널 왼쪽 링크를 찾는다
·만일 왼쪽(S)이 널이 아니라면, 단계 9로 간다.
·R을 S에 둔 뒤, S를 왼쪽(R)에 둔다.
·d[c]를 '왼쪽'에 두고 P[c]를 R에 둔 뒤, 1을 c에 더한다.
·시작부터 이 단계를 반복한다(즉 단계 8로 간다).
단계 9) 조정을 한다
·d[1]을 '오른쪽'에 두고 P[1]을 S에 둔다.
·왼쪽(S)를 왼쪽(P)에 두고, 왼쪽(R)를 왼쪽(S)에 두고 오른쪽(S)를 오른쪽(P)에 둔다.
·Dir(S)를 Dir(P)에 둔다.
·Q를 S에 둔다.
단계 10) 균형을 맞춘다
·1을 c로부터 뺀다.
·만일 c가 현재 0이면 여기서 멈춘다. (제거 끝)
·S를 P[c]에 둔 뒤, Dir(S)에 따른 3가지 것 중 하나를 한다:
·만일 Dir(S) = '균형'이면, Dir(S)를 -d[c]에 둔 뒤 멈춘다. (제거 끝)
·만일 Dir(S) = d[c]이면, Dir(S)를 '균형'에 두고 시작부터 이 단계를 반복한다(즉 단계 11로 간다).
·그렇지 않고 Dir(S) = -d[c]이면, 이 단계를 계속한다.
·R을 링크(-d[c],S)에 둔다.
·만일 Dir(R) = '균형'이면, 단계 11로 간다.
·만일 Dir(R) = -d[c]이면, 단계 12로 간다.
·Dir(R) = d[c]를 가져야만 한다. 단계 13으로 간다.
단계 11) 균형 R을 가진 단일 회전
·링크(-d[c],S)를 링크(d[c],R)에 두고나서, 링크(d[c],R)을 S에 둔다.
·Dir(R)을 d[c]에 두고 링크(d[c-1],P[c-1])를 R에 둔다.
·어떤 다른 재균형도 필요하지 않으므로 멈춘다. (제거 끝)
단계 12) 불균형 R을 가진 단일 회전
·링크(-d[c],S)를 링크(d[c],R)에 두고나서, 링크(d[c],R)을 S에 둔다.
·Dir(S)와 Dir(R)를 '균형'에 둔다.
·링크(d[c-1],P[c-1])를 R에 둔다.
·단계 10으로 간다.
단계 13) 이중 회전
·P를 링크(d[c],R)에 두고, 링크(d[c],R)을 링크(-d[c],P)에 둔 뒤, 링크(-d[c],P)를 R에 둔다.
·링크(-d[c],S)를 링크(d[c],P)에 둔뒤 링크(d[c],P)를 S에 둔다.
·Dir(P) 값에 따라 균형방향을 업데이트한다.
·만일 Dir(P) = -d[c]이면, Dir(S) = d[c]이고, Dir(R) = '균형'이다,
·만일 Dir(P) = '균형'이면, Dir(S)와 Dir(R) 둘 다 또한 '균형'에 둔다.
·그렇지 않고 Dir(P) = d[c]이면, Dir(S)를 0에 두고 Dir(R)을 -d[c]에 둔다.
·Dir(P)를 '균형'에 두고 링크(d[c-1],P[c-1])를 P에 둔다.
·단계 10으로 간다.
불필요 정보 정리를 위한 2진 트리의 사용으로 본 발명이 "주" 시스템에 사용되게 하며, 다른 말로, 메모리 할당이 프로그래머의 제어에서 벗어나게 되며 내재한 주 운영시스템에 의해 결정된다. 본 발명의 작동은 내재한 운영시스템에 의해 사용되는 메모리 할당 구성에 본질적으로 무관하므로, 본 발명의 불필요 정보 정리는 자신의 메모리 할당을 수행하는 가상적인 어떤 내재한 운영시스템의 상단에 사용될 수 있다. 물론, 운영시스템이 어느 쪽을 수행하더라도 할당이 도 2에 대해 설명된 블록 크기와 위치 유동성의 이용을 가능하게 될 때만 고효율 메모리 할당이 일반적으로 성취될 것이다.
본 발명은 균형 되거나 균형 되지않는 비-2진 트리(N-way)에 동일하게 적용될 수 있음을 알게 될 것이다. 예를 들면, b-트리에 적용될 수 있다. AVL 트리는 단지 2방향 균형트리의 한 바람직한 실시예이다.
본 발명의 상세한 내용에 포함됨.

Claims (30)

  1. (a) 메모리 할당의 생성에 관해, 개개의 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 동적 트리구조에 대해 상기 할당에 참조를 추가하는 단계와;
    (b) 사용중인 포인터에 대해, 포인터가 지시하는 메모리 할당을 결정하도록 트리를 검색하는 단계와;
    (c) 상기 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 단계를 포함하는 불필요 정보 정리 방법.
  2. 제 1 항에 있어서,
    다수의 사용중인 포인터에 대한 단계(b)와 단계(c)를 반복하는 단계와, 해제에 이용할 수 없는 것으로 나타나지 않은 메모리 할당을 해제하는 단계를 포함하는 불필요 정보 정리 방법.
  3. 제 1 항 또는 제 2 항에 있어서,
    트리는 2진 트리인 불필요 정보 정리 방법.
  4. 제 1 항 또는 제 2 항에 있어서,
    트리는 AVL 트리인 불필요 정보 정리 방법.
  5. 제 1 항 내지 제 4 항 중 어느 한 항에 있어서,
    각 메모리 할당은 메모리 블록인 불필요 정보 정리 방법.
  6. 제 5 항에 있어서,
    각 노드는 블록 시작위치와 블록 끝위치에; 또는 상기 위치들 중 하나와 블록 길이에, 노드와 관련된, 정보를 갖는 불필요 정보 정리 방법.
  7. 제 1 항 내지 제 6 항 중 어느 한 항에 있어서,
    상기 사용중인 포인터는 내부 포인터인 불필요 정보 정리 방법.
  8. 제 1 항 내지 제 7 항 중 어느 한 항에 있어서,
    상기 메모리 할당이 필수적으로 정렬될 필요가 없는 불필요 정보 정리 방법.
  9. (a) 메모리 할당을 생성하고, 개개의 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 동적 트리구조에 대해 각각의 할당에 참조를 추가하기 위한 수단과;
    (b) 사용중인 포인터에 대해, 포인터가 지시하는 메모리 할당을 결정하기 위해 트리를 검색하는 수단과;
    (c) 상기 메모리 할당을 불필요 정보 정리 해제에 이용할 수 없는 것으로 나타내는 수단을 포함하는 불필요 정보 정리기.
  10. 제 9 항에 있어서,
    다수의 사용중인 포인터에 대해 검색하고 메모리 할당을 나타내며, 해제에 이용할 수 없는 것으로 나타나지 않은 메모리 할당을 해제하기 위한 수단을 포함하는 불필요 정보 정리기.
  11. 제 9 항 또는 제 10 항에 있어서,
    상기 트리는 2진 트리인 불필요 정보 정리기.
  12. 제 9 항 또는 제 10 항에 있어서,
    상기 트리는 AVL 트리인 불필요 정보 정리기.
  13. 제 9 항 내지 제 12 항 중 어느 한 항에 있어서,
    각 메모리 할당은 메모리 블록인 불필요 정보 정리기.
  14. 제 13 항에 있어서,
    각 노드는 블록 시작위치와 블록 끝위치에; 또는 상기 위치들 중 하나와 블록 길이에, 노드와 관련된, 정보를 가지는 불필요 정보 정리기.
  15. 제 9 항 내지 제 14 항 중 어느 한 항에 있어서,
    상기 사용중인 포인터는 내부 포인터인 불필요 정보 정리기.
  16. 제 9 항 내지 제 15 항 중 어느 한 항에 있어서,
    상기 메모리 할당이 필수적으로 정렬될 필요가 없는 불필요 정보 정리기.
  17. 제 9 항 내지 제 16 항 중 어느 한 항에서 청구된 불필요 정보 정리기를 포함하는 운영시스템.
  18. 제 17 항에 있어서,
    메모리 할당 수단을 포함하는 운영시스템.
  19. 제 17 항에 있어서,
    메모리 할당 수단을 포함하지 않고, 상기 불필요 정보 정리기가 외장된 메모리 할당과 작동하게 배열되어 있는 운영시스템.
  20. 제 19 항에 있어서,
    내재하는 운영시스템에 주(host)가 되고, 외장된 메모리 할당이 내재하는 운영시스템의 메모리 할당 수단에 의해 제공되는 운영시스템.
  21. 제 1 항 내지 제 8 항 중 어느 한 항에서 청구된 불필요 정보 정리 방법을 수행하기에 적합한 컴퓨터 프로그램.
  22. 제 21 항에서 청구된 컴퓨터 프로그램을 수행하는 데이터 운반체.
  23. 제 21 항에서 청구된 컴퓨터 프로그램을 나타내는 데이터 스트림.
  24. 제 17 항 내지 제 20 항 중 어느 한 항에서 청구된 운영시스템을 수행하는 데이터 운반체.
  25. 제 17 항 내지 제 20 항 중 어느 한 항에서 청구된 운영시스템을 나타내는 데이터 스트림.
  26. 메모리 할당은 객체지향 시스템내의 객체를 나타내는 제 1 항에서 청구된 불필요 정보 정리 방법 또는 제 9 항에서 청구된 불필요 정보 정리기.
  27. 제 26 항에 있어서,
    상기 객체는 자바 객체의 컴파일된 형태인 불필요 정보 정리 방법 또는 불필요 정보 정리기.
  28. (a) 하나 이상의 불필요 정보 정리 가능한 메모리 할당을 포함하는 시스템 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 트리 구조를 유지하는 단계와;
    (b) 사용중인 포인터에 대해, 포인터가 지시하는 불필요 정보 정리 가능한 메모리 할당을 결정하기 위해 트리를 검색하는 단계와;
    (c) 상기 불필요 정보 정리 가능한 메모리 할당을 불필요 정보 정리 해제에 불가피한 것으로 나타내는 단계를 포함하는 불필요 정보 정리방법.
  29. (a) 하나 이상의 불필요 정보 정리 가능한 메모리 할당을 포함하는 시스템 메모리 할당을 각각 나타내는 다수의 연결된 노드를 구비한 트리 구조를 유지하는 수단과;
    (b) 사용중인 포인터에 대해, 포인터가 지시하는 불필요 정보 정리 가능한 메모리 할당을 결정하기 위해 트리를 검색하는 수단과;
    (c) 상기 불필요 정보 정리 가능한 메모리 할당을 불필요 정보 정리 해제에 불가피한 것으로 나타내는 수단을 포함하는 불필요 정보 정리기.
  30. 제 9 항 내지 제 16 항 중 어느 한 항 또는 제 29 항에서 청구된 불필요 정보 정리기를 포함하는 자바가상머신.
KR1020027012891A 2000-03-28 2001-03-28 불필요 정보 정리 KR20030065308A (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GBGB0007493.0A GB0007493D0 (en) 2000-03-28 2000-03-28 Garbage collection
GB0007493.0 2000-03-28

Publications (1)

Publication Number Publication Date
KR20030065308A true KR20030065308A (ko) 2003-08-06

Family

ID=9888571

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020027012891A KR20030065308A (ko) 2000-03-28 2001-03-28 불필요 정보 정리

Country Status (8)

Country Link
US (1) US20030187888A1 (ko)
EP (1) EP1292891A1 (ko)
JP (1) JP2003529149A (ko)
KR (1) KR20030065308A (ko)
AU (1) AU780140B2 (ko)
CA (1) CA2407041A1 (ko)
GB (1) GB0007493D0 (ko)
WO (1) WO2001073556A1 (ko)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1308845A1 (en) * 2001-10-23 2003-05-07 Sun Microsystems, Inc. Method and apparatus for scoped memory
US7127709B2 (en) * 2002-09-25 2006-10-24 Microsoft Corporation System and method for jointly managing dynamically generated code and data
US20040107227A1 (en) * 2002-12-03 2004-06-03 International Business Machines Corporation Method for efficient implementation of dynamic lock-free data structures with safe memory reclamation
KR100626368B1 (ko) * 2003-08-25 2006-09-20 삼성전자주식회사 가비지 콜렉션 벤치마킹 방법
US7263532B2 (en) * 2003-09-23 2007-08-28 Microsoft Corporation Region-based memory management for object-oriented programs
JP2005234687A (ja) * 2004-02-17 2005-09-02 Sony Corp メモリ管理方法、画像処理装置およびメモリ管理プログラム
US7251671B2 (en) * 2004-03-26 2007-07-31 Intel Corporation Method and system for garbage collection wherein resetting the mark/allocation bit, and switching the mark/allocation bit to the mark bit to perform marking and scanning of objects using the identified object as a root object and providing mark/allocation bit information being displayed at the client
US7853628B1 (en) * 2004-04-09 2010-12-14 Oracle America, Inc. Selective promotion policy for generational garbage collectors
KR100631782B1 (ko) 2004-07-27 2006-10-11 삼성전자주식회사 객체지향 어플리케이션에서의 효율적인 메모리 관리 방법및 장치
US7539833B2 (en) * 2004-12-06 2009-05-26 International Business Machines Corporation Locating wasted memory in software by identifying unused portions of memory blocks allocated to a program
US7526754B2 (en) * 2005-02-28 2009-04-28 Sap Portals Israel Ltd. Memory debugging tool
US7624246B2 (en) * 2005-10-20 2009-11-24 Cray Inc. Method and system for memory allocation in a multiprocessing environment
KR100772871B1 (ko) 2006-02-24 2007-11-02 삼성전자주식회사 자바 환경에서 자원을 관리하는 장치 및 방법
US7853591B1 (en) * 2006-06-30 2010-12-14 Juniper Networks, Inc. Protection of database operations
US10019503B2 (en) * 2010-12-22 2018-07-10 Microsoft Technology Licensing, Llc Database transfers using constraint free data
US9208080B2 (en) 2013-05-30 2015-12-08 Hewlett Packard Enterprise Development Lp Persistent memory garbage collection
WO2020215223A1 (zh) * 2019-04-23 2020-10-29 华为技术有限公司 分布式存储系统和分布式存储系统中垃圾回收方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6138202A (en) * 1994-01-04 2000-10-24 Iowa State University Research Foundation, Inc. Object space manager circuit for obtaining addresses of object headers
ES2176214T3 (es) * 1994-09-19 2002-12-01 Siemens Ag Sistema de administracion de memoria de un sistema de ordenador.
US5930827A (en) * 1996-12-02 1999-07-27 Intel Corporation Method and apparatus for dynamic memory management by association of free memory blocks using a binary tree organized in an address and size dependent manner
US6510504B2 (en) * 1998-06-29 2003-01-21 Oracle Corporation Methods and apparatus for memory allocation for object instances in an object-oriented software environment
US7409694B2 (en) * 1998-09-09 2008-08-05 Microsoft Corporation Highly componentized system architecture with loadable virtual memory manager

Also Published As

Publication number Publication date
GB0007493D0 (en) 2000-05-17
CA2407041A1 (en) 2001-10-04
US20030187888A1 (en) 2003-10-02
AU4261101A (en) 2001-10-08
WO2001073556A1 (en) 2001-10-04
EP1292891A1 (en) 2003-03-19
AU780140B2 (en) 2005-03-03
JP2003529149A (ja) 2003-09-30

Similar Documents

Publication Publication Date Title
KR20030065308A (ko) 불필요 정보 정리
Aoe An efficient digital search algorithm by using a double-array structure
US5619693A (en) Method for sorting and storing data employing dynamic sort tree reconfiguration in volatile memory
US6223342B1 (en) Object-oriented sequencing using hierarachical configuration streams
Driesen Selector table indexing & sparse arrays
JP2003114816A (ja) コンピュータメモリにインデックスを記憶するデータ構造
Dadvand A framework for developing finite element codes for multi-disciplinary applications.
Deshpande et al. C & Data Structures
Katajainen et al. Navigation piles with applications to sorting, priority queues, and priority deques
US8775453B2 (en) System and method for reducing memory usage of tree-based data structures
Torosyan et al. Runtime and compiler support for HAMTs
Weidl The standard template library tutorial
Jensen et al. Pointer Types
Sibley et al. Preliminary discussion of a general data-to-storage structure mapping language
Higham et al. PRAM memory allocation and initialization
Uy A network data base management system
Chan et al. Communication of Complex Data Structures
Lindstrom Algorithms for list structure condensation
Hunt et al. Data Structures
Vermeir et al. Generic Programming Using the STL
Lins et al. The Unbounded AVL Tree
Claybrook A file definition facility for file structures
Heaney Shortcuts: A critical look
Lam et al. On set equality-testing
Robson et al. Sequence Containers

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application