KR100576904B1 - 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법 - Google Patents

가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법 Download PDF

Info

Publication number
KR100576904B1
KR100576904B1 KR1019980710967A KR19980710967A KR100576904B1 KR 100576904 B1 KR100576904 B1 KR 100576904B1 KR 1019980710967 A KR1019980710967 A KR 1019980710967A KR 19980710967 A KR19980710967 A KR 19980710967A KR 100576904 B1 KR100576904 B1 KR 100576904B1
Authority
KR
South Korea
Prior art keywords
pointer
garbage collection
storage
instruction
collection page
Prior art date
Application number
KR1019980710967A
Other languages
English (en)
Other versions
KR20000022522A (ko
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 선 마이크로시스템즈 인코포레이티드
Priority to KR1019980710967A priority Critical patent/KR100576904B1/ko
Publication of KR20000022522A publication Critical patent/KR20000022522A/ko
Application granted granted Critical
Publication of KR100576904B1 publication Critical patent/KR100576904B1/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
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems
    • G06F12/0276Generational garbage collection

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)

Abstract

본 발명은 가베지 수집, 특히 가베지 수집내의 세대를 분리하는 시스템 및 방법에 관한 것으로서, 본원의 아키텍처 지원은 포인터 저장에 교차하는 가베지 수집 페이지의 트래핑을 위해 제공되고, 포인터 저장을 경계 교차로 식별하는 것은 프로그램가능하게 인코드되어 가베지 수집 페이지 크기를 정의하는 가베지 수집 페이지 마스크에 응답하여 저장 배리어에 의해 수행되고, 상기 쓰기 배리어 및 가베지 수집 페이지 마스크는 가베지 수집 페이지 크기의 프로그램가능하게 유연한 정의를 제공하고, 세대 감지 수집 방법의 다양한 변형을 위한 지원으로 가베지 수집 구현을 공급하고, 트레인 알고리즘 타입 방법이 포함되어 있어서 세대로 수집된 메모리 공간의 주요부를 관리하며, 포인터 특정 저장 명령을 대체하여 포인터 저장뿐만 아니라 특히 프로그램가능하게 정의된 가베지 수집 페이지 경계에 교차하는 포인터 저장으로 정확한 배리어를 제공하는 구현을 할 수 있는 것을 특징으로 한다.

Description

가베지 수집 페이지 경계 횡단 포인터 저장을 트랩하기 위한 쓰기 배리어{WRITE BARRIER SYSTEM AND METHOD FOR TRAPPING GARBAGE COLLECTION PAGE BOUNDARY CROSSING POINTER STORES}
본 발명은 가베지 수집(garbage collection)에 관한 것으로, 특히 가베지 수집기(garbage collector)내의 세대들(generations)를 분리하는 방법 및 시스템에 관한 것이다.
종래, 대부분의 프로그래밍 언어는 메모리의 동적 할당 및 할당 해제의 책임을 프로그래머에게 지우고 있다. 예를 들면, C 프로그래밍 언어에 있어서, 메모리는 히프(heap)로부터 멀록(malloc) 절차(또는 그 변형)에 의해 할당된다. 포인터 변수 p가 주어지면, p=malloc(sizeof(SomeStruct)) 구문에 대응하는 기계 명령어의 실행은 포인터 변수 p가 SomeStruct 데이터 구조를 나타내기 위해 필요한 크기의 메모리 오브젝트(memory object)를 위해 새롭게 할당된 기억장치를 가리키도록 한다. 사용 후, 포인터 변수 p에 의해 규정된 상기 메모리 오브젝트는 free(p)를 호출함으로써 할당 해제되거나 자유롭게 된다. 파스칼 및 C++ 언어는 메모리의 명시적 할당 및 할당 해제를 위한 유사한 기능을 제공한다.
불행하게도, 동적으로 할당된 기억장치는 기억장치에 대한 참조 또는 포인터가 주어진 계산을 위한 루트 참조 위치들(root reference locations)의 세트 내에 잔류하고 있지 않으면 도달 불가능하게 된다. 더 이상 도달 불가능하지만 자유롭게 되지 않은 메모리 오브젝트는 가베지(garbage)라고 불린다. 마찬가지로, 메모리 오브젝트와 관련된 기억장치는 참조된 채로 할당 해제될 수 있다. 이 경우, 댕글링 참조(dangling reference)가 생성된다. 일반적으로, 동적 메모리를 정확하게 관리하는 것이 어려울 수 있다. 대부분의 프로그래밍 언어에 있어서, 히프 할당(heap allocation)은 데이터 구조를 생성한 과정 후에도 남을 수 있는 데이터 구조를 위해 필요하다. 이들 데이터 구조가 다른 과정으로 통과되면, 프로그래머나 컴파일러가 이들을 안전하게 할당 해제할 수 있는 지점을 결정하는 것이 불가능하거나 어렵다.
이러한 어려움 때문에, 가베지 수집, 즉 프로그램에 의해 최종 사용된 후 히프 할당된 기억장치의 자동 되찾기(automatic reclamation)는 동적 메모리 관리의 다른 흥미 있는 모델이다. 가베지 수집은, 데이터 공유, 지연 실행 그리고 일반적으로 상기 절차적 언어보다 실행 순서의 더 적은 예측 가능성을 보여주는 자바(JAVA™) 언어(JAVA는 선 마이크로 시스템사의 상표임), 프롤로그(Prolog), 리스프(Lisp), 스몰토크(Smaltalk), 스킴(Scheme), 에이펠(Eiffel), 다일란(Dylan), 엠엘(ML), 하스켈(Haskell), 미란다(Miranda), 오베론(Oberon) 등과 같은 기능적 언어에 대해서 특히 효과적이다. 가베지 수집 및 이를 위한 종래 알고리즘의 논의를 위해서는 Jones & Lins, Garbage Collection: Algorithms for Automatic Dynamic Memory Management, pp 1-41, Wiley(1996)을 참조할 수 있다.
세 가지 종래의 가베지 수집 방법으로는 참조 카운팅(reference counting), 마크-스윕(mark-sweep), 및 복사 기억장치 되찾기(copying storage reclamation)이 있다. 첫 번째 참조 카운팅은 능동 메모리 오브젝트 또는 루트 참조 로케이션(root reference location)의 각각의 메모리 오브젝트에 대한, 예를 들면 포인터와 같은 참조의 수를 계속하여 카운트하는 것에 기초한다. 새로운 메모리 오브젝트가 할당되고 그에 포인터가 지정될 때, 상기 메모리 오브젝트의 참조 카운트는 1로 설정된다. 그 다음, 포인터가 상기 메모리 오브젝트를 참조하도록 설정될 때마다, 상기 메모리 오브젝트의 참조 카운트는 증가된다. 상기 메모리 오브젝트에 대한 참조가 삭제되거나 덮여 쓰여지면, 상기 참조 카운트는 감소한다. 참조 카운트 '0' 을 갖는 메모리 오브젝트는 도달 불가능하여 가베지로서 수집된다. 참조 카운팅 가베지 수집기의 구현은 전형적으로 각 메모리 오브젝트 내에 부가필드, 참조 카운트를 포함하고, 새로운 오브젝트의 일부로서 삭제 오브젝트 및 갱신 포인터 기능을 증가시키고 감소시키는 지원을 포함한다.
이에 비해, 트레이싱 수집기(tracing collector) 방법은 유효한(live) 즉, 참조 가능한 메모리 오브젝트를 식별하기 위해 메모리에 대해서 참조 체인이 운행(traversal)하는 것을 포함한다. 이러한 트레이싱 수집기 방법의 하나가 유효한 메모리 오브젝트를 식별하고 마크하기 위해서 메모리에 대해서 참조 체인이 운행되는 상기한 마크-스윕 방법이다. 마크되지 않은 메모리 오브젝트는 가베지이며 수집되어 분리된 스윕 단계 동안에 프리 풀(free pool)로 반환된다. 마크-스윕 가베지 수집기의 구현은 전형적으로 각 메모리 오브젝트 내에 부가필드, 예를 들어 마크 비트(mark bit)를 포함한다. 마크-컴팩트(mark-compact) 수집기는 종래 마크-스윕 방법에 압축(compaction)을 추가한다. 압축은 단편화(fragmentation)에 있어서 유익한 감소를 달성하기 위해서 유효한 오브젝트를 재배치한다. 참조 카운트 방법도 압축을 채용할 수 있다.
또 다른 트레이싱 방법인, 복사 수집은 메모리를 두 개의 반쪽 영역(semi-space)으로 나누며, 한쪽은 현재 데이터를 포함하고, 다른 쪽은 과거 데이터를 포함한다. 복사 가베지 수집은 상기 두 개의 반쪽 영역의 역할을 역전시키는 것으로써 시작한다. 그 다음 상기 복사 수집기는 새로운 반쪽 영역 'ToSpace'로 도달 가능한 오브젝트를 복사하면서 상기 늙은 반쪽 영역 ' FromSpace' 내의 유효한 오브젝트를 운행한다. FromSpace내의 유효한 오브젝트가 모두 운행되어 복사된 후에, 상기 데이터구조의 복제본이 ToSpace에 존재한다. 본질적으로, 복사 수집기는 상기 가베지 중에서 유효한 오브젝트를 수집한다. 복사 수집기의 유익한 부수적 이점은 유효한 오브젝트가 ToSpace로 압축되어 그에 의해서 단편화를 감소시키는 것이다.
세대 접근법(generational approaches)은 (1) 메모리 오브젝트는 전형적으로 젊어서 소멸하고 (2) 트레이싱 방법은 비교적 오래된 오브젝트를 운행, 복사 또는 재배치하는데 상당한 자원을 소비한다는 관찰에 기초한 것이다. 세대 가베지 수집 기법은 상기 히프를 두 개 이상의 세대로 나누고, 오브젝트를 나이에 의해서 분리하고, 수집노력(또는 적어도 더욱 왕성한 수집노력)을 젊은 세대(들)에 집중한다.
가장 젊은 세대는 작을 수 있기 때문에, 정지 시간과 관련된 가베지 수집은 평균적으로 짧게 유지될 수 있다. 한 세대 내의 가베지 수집은 복사, 마크-스윕, 또는 다른 가베지 수집 방법일 수 있다. 세대 수집기를 구현하기 위해서는, 변형기 프로세스(mutator process), 가베지 수집기 또는 이들 두 개의 임의의 조합이 세대간 포인터를 규정하여 이들이 상기 가베지 수집기에 의해 루트 세트의 일부로 취급될 수 있도록 하는 것이 중요한 문제이다. 변형기는 컴퓨터 시스템에서 가베지 수집을 제외한 유용한 작업을 수행하는 프로세스에서 메모리를 경유하는 참조 체인의 그래프를 변경시키는 프로세스이다.
세대간 포인터는 전형적으로 변형기 프로세스 포인터 저장을 통해서나 포인터를 포함하는 오브젝트의 승급을 통해서 발생한다. 승급된 세대간 포인터는 승급시 수집기 프로세스에 의해 쉽게 발견될 수 있다. 그러나 젊은 세대로의 포인터를 위해 늙은 세대를 조사 - 고비용 프로세스임 - 하는 것이 부족하기 때문에 포인터 저장들은 세대간 포인터 저장들을 탐색하기 위해서 트랩되고 기록되어야 한다. 배리어(barrier)는 잘 알려져 있고, 하드웨어, 소프트웨어적으로 또는 운영체제의(전형적으로 페이징 시스템)의 지원으로 구현되어 왔다. Jones & Lins, Garbage Collection: Algorithims for Automatic Dynamic Memory Management, pp 165-174, Wiley(1996)(세대간 포인터, 쓰기 배리어, 엔트리 테이블, 기억 세트(remembered sets), 순차 저장 버퍼, 하드웨어 지원에 의한 페이지 마킹, 버츄얼 메모리 지원에 의한 페이지 마킹, 및 카드 마킹 등에 대하여 논의함)을 참조할 수 있다.
포인터 저장 검사(pointer store checking)를 위한 인라인(in-line) 코드 등의 소프트웨어 기술이 사용되면, 실행시간 및 인라인 코드 오버헤드가 아주 클 수가 있다. 소프트웨어 쓰기 배리어(write barrier)의 한 예는 Ungar에 의해 제안된 것(David M. Ungar, Generation Scavening: A Non-disturbing High Performance Storage Reclamation Algorithm, ACM SIGPLAN Notice, 19(5), pp.157-167(1984) 참조)으로, 그것은 (1) 포인터가 저장되고 있는지와 (2) 상기 포인터가 젊은 세대 오브젝트에 대한 것이고 늙은 세대 오브젝트에 저장되고 있는지를 체크하기 위해서 방해한다. 그렇다면, 상기 늙은 세대 오브젝트의 어드레스는 기억된 세트(remembered set)에 추가된다. 소프트웨어 배리어는 그들이 적용되는 동작에 많은 양의 오버헤드를 부과할 수 있다. 예를 들면, 인-라인 코드에 의해 제공된 소프트웨어 저장 배리어는 예를 들어 포인터가 저장되고 있는지, 그리고 상기 포인터가 세대간이지 체크하는 부가적인 명령 대기시간(instruction latency)을 추가하고 코드의 전체 부피를 증가시킨다. 그러한 코드 증가는 캐시 성능에 나쁜 영향을 준다.
상기 소프트웨어 배리어의 대안은 보호된 페이지의 액세스를 트랩하기 위해서 운영체제의 가상 메모리 보호 메커니즘을 사용하거나 엑세스를 트랩하여 페이지를 보호하거나 갱신된 세대간 포인터 필드를 갖는 오브젝트를 잠재적으로 포함하는 페이지 맵으로 페이지 변경 더티 비트(page modification dirty bits)를 사용하는 것이다. 그런 기술은 전형적으로 모든 저장들로부터 포인터 저장, 더욱 구체적으로는 세대간 포인터 저장의 식별을 수집 시간까지 연기시킨다. 그러나 가상 메모리 페이지 크기는 일반적으로 가베지 수집 서비스에 잘 맞지 않는다. 예를 들면, 페이지는 오브젝트에 비해 큰 경향이 있고 버츄얼 메모리 더티 비트는 단순히 포인터 저장이 아닌 관련 페이지에 임의의 변경을 기록한다. 그 결과, 세대간 포인터에 대한 페이지 탐색의 비용이 높아질 수 있다.
인라인 코드 소프트웨어 쓰기 배리어의 또 다른 대안은 하드웨어 배리어(hardware barrier)의 지원이다. 많은 쓰기 배리어 구현예가 포인터와 비-포인터 저장간에 구별을 두지 않고, 대신에 수집시간까지 세대간 포인터 체크를 연기하면서 모든 쓰기를 기록하지만, 심볼릭 3600에서 가베지 수집을 위한 하드웨어 지원의 광범위한 사용은 페이지 마킹 기법을 효율적으로 구현하게 했다. 상기 심볼릭 3600의 세 가지 특성이 이를 실행 가능하게 한다. 첫째로, 하드웨어 쓰기 배리어는 세대 데이터에 대한 포인터가 아닌 모든 워드를 무시했다. 세대 메모리에 대한 참조가 페이지에 저장될 때마다, 상기 쓰기 배리어 하드웨어는 가베지 수집 페이지 해당 비트를 세트시킨다. 둘째로, 포인터 워드는 항상 비포인터 워드로부터 태그를 사용하여 구별될 수 있기 때문에 태그된 아키텍처(tagged architecture)는 세대간 포인터를 위한 수집시간 체크를 수행하면서 오브젝트 경계를 고려할 필요를 제거했다. 상기 심볼릭 3600은 2-비트 메이저 데이터 타입 태그, 4-비트 마이너 태그 및 28-비트 어드레스를 하나의 36-비트 워드 내에 수용한다. 마지막으로, 페이지는 256 워드로 전형적인 가상 메모리 페이지보다 작으므로, 페이지는 수집시간에 신속하게 탐색될 수 있다. Jones & Lins, Garbage Collection: Algorithms for Automatic Dynamic Memory Management, pp. 169-170, Wiley(1996)(심볼릭 3600상에서 하드웨어에 의한 페이지 마킹을 논의함)과, Moon저, Architecture of the Symbolics 3600, In Proceedings of the 12th Annual International Symposium on Computer Architecture, pp.76-83(1985)(오브젝트의 저장된 표현을 논의함)을 참조하라.
세대간 포인터를 확인하는 프로세스는 중요한 수집시간 탐색을 요구한다. 한가지 개선사항은 수집된 메모리 공간(예를 들면, 히프)을 카드(card)로 불리는 작은 영역으로 나누는 것이다. 카드 마킹(card marking)은 상기 카드가 올바른 크기를 가지면 몇 가지 이점을 제공한다. 그것들은 가상 메모리 페이지보다 작기 때문에, 수집시간 탐색의 양은 감소될 수 있다. 한편, 카드 테이블에 의해 점유된 공간은 양은 워드단위 마킹 기법에 필요한 것보다 적다. 일반적으로, 상기 카드내의 워드가 변경될 때마다 비트는 무조건 세트된다. 카드 마킹 수집기는 수집시간에 세대간 포인터를 위해 더티 카드((durty card)를 탐색해야 한다. 카드를 탐색하는 비용은 복제가 일어나지 않기 때문에 실행된 저장 수보다는 마크된 카드의 크기와 수에 비례한다. Wilson and Moher저, Design of the Opportunistic Garbage Collector, ACM SIGPLAN Notices, 24(10), pp.23-35(1985)를 참조하라.
세대 접근법이 전체 가베지 수집 시간을 줄이는데 매우 효과적이고 대부분의 수집 기법이 파괴적이지 않을 수 있지만, 늙은 세대의 수집은 파괴적일 수 있다. 이들 늙은 세대 오브젝트를 파괴적이지 않은 방식으로 수집하기 위해, Hudson과 Moss는 각 수집에서 성숙한 오브젝트 공간의 한정된 크기의 영역을 처리하는 알고리즘을 제안했다. 상기 알고리즘은 사실상 증가하며, 어떤 가베지든지 궁극적인 수집을 보증한다. Hudson과 Moss는 상기 문제점에 대한 해결책을 설명하기 위해서 한정된 크기의 영역을 나타내는 캐리지(carriage)와 링크구조를 유지하는 캐리지의 그룹을 나타내는 트레인(train)을 갖는 트레인 유추법을 사용한다. 상기 시스템은 특별한 하드웨어 또는 가상 메모리 메커니즘에 의존하지 않는다는 점에서 효율적이다. Hudson and Moss 저, Incremental Collection of Mature Objects, Proceedings of International Workshop on Memory Management, St. Malo France(16-18 September, 1992)를 참조하라.
지금부터 첨부된 도면을 참고한 설명을 통해 본원의 특징 및 장점 들을 보다 잘 이해할 수 있을 것이다.
도 1은 본 발명에 따른 가베지 수집 분리를 위한 지원을 포함하는 가상 머신 하드웨어 프로세서의 실시예를 나타내는 블록도이고,
도 2는 하드웨어 프로세서(도 1) 및 JAVA 가상 머신 실행의 소프트웨어 성분을 포함하는 JAVA 적용 환경의 하드웨어 성분과 소프트웨어간의 관계를 나타내는 도면이며,
도 3은 도 1의 하드웨어 프로세서에 대하여 몇 가지 가능한 애드-온(add-ons)을 나타내는 도면이고,
도 4는 본 발명의 실시예에 따라 제공된 도 1의 하드웨어 프로세서 상에서 실행되는 변형기 처리에 의해 만들어진 세대간 및 카드 크로싱 포인터 저장을 트랩하기 위한 쓰기 배리어를 나타내는 도면이며,
도 5는 본 발명의 실시예에 따른 객체 참조(objectref) 포맷을 나타내는 도면이고,
도 6A는 본 발명의 한 실시예에 따른 오브젝트 포맷을 나타내는 도면이며,
도 6B는 본 발명의 한 실시예에 따른 대안적인 조정된 오브젝트 포맷을 나타내는 도면이고,
도 7은 세대간 카드 경계 교차 포인터 저장의 트래핑(trapping)이 용이하도록 포인터 비특정 저장 바이트코드를 포인터 특정 바이트코드로 동적으로 대체하기 위해 본 발명에 따라 사용된 바이트코드 대체 캐시의 한 실시예를 나타내는 도면이며,
도 8은 본 발명에 따른 가베지(garbage) 수집기에 대한 구조적인 지원에 의해 지원될 수 있는 세대 수집기 방식에 근거한 예시적으로 몇 부분으로 이루어진 세트를 나타내는 도면이다.
서로 다른 도면에서 동일한 인용 부호를 사용한 것은 이들이 유사하거나 동일한 항목임을 나타낸다.
본 발명은 가베지 수집기의 실행을 용이하게 하는 시스템, 방법 및 장치를 구현하는 시스템, 방법, 장치 및 컴퓨터 프로그램을 제공한다. 특히, 본 발명은, 가베지 수집 페이지 경계 횡단 포인터 저장의 트래핑을 위한 구조적 지원을 제공한다. 경계 횡단으로서의 포인터의 확인은 가베지 수집 페이지 크기를 결정하기 위해 프로그램으로 인코딩되는 가베지 수집 페이지에 응답하는 저장 배리어(store barrier)에 의해 실행된다. 쓰기 배리어 및 가베지 수집 페이지 마스크는 가베지 수집 페이지 크기의 프로그램-유연 결정을 제공하며 따라서 경계 횡단 포인터 저장은 트랩되어, 다양한 세대의 가베지 수집 방법을 위한 가베지 수집기 실행기를 제공하고, 세대 수집된 메모리 공간의 성숙한 부분을 관리하기 위한 트레인 알고리즘 형태의 방법을 포함한다.
포인터 특정 저장 명령 교체는 본 발명에 따른 실행을 허용하여 포인터 저장뿐만 아니라 프로그램으로 결정된 가베지 수집 페이지 경계에 대해 정확한 배리어를 제공한다. 여기서 포인터 저장의 정확한 식별은 수집된 메모리 공간을 구비한 인코딩된 인라인 태그를 필요로 하지 않으며, 그러한 태그를 지원하기 위한 비표준 워드 사이즈를 필요로 하지 않는다. 그럼에도 불구하고, 가베지 수집 페이지 마스크의 다른 저장 또는 인코딩과 가베지 수집 트랙 트리거링 방정식의 펌웨어 또는 마이크로코드 구현 또한 적합하다. 또한, 일반적 또는 특별한 객체의 소프트웨어 형태도 적합하고, 특히 하드웨어 프로세서상의 실행을 위한 소프트웨어 가상 머신 명령 프로세서 실행에서 적합하다. 포인터 비특정 명령의 실행시간을 포인터 특정 명령으로의 교체는 비포인터 저장 명령이 세대간의 포인터 저장 트랩 체크를 무시하도록 하지만, 일부 형태는 이러한 이점이 있는 특징이 없을 수 있다. 이들 및 다른 변형은 다음의 청구범위에 속한다.
본 발명에 따른 한 실시예에 있어서, 장치는 거기에 형성된 오브젝트가 각각의 오브젝트 참조를 통해 접근 가능한, 동적으로 할당 가능한 기억장치와, 프로그램 가능하게 정의된 가베지 수집 페이지 마스크와, 가베지 수집 페이지 경계 횡단 포인터 저장에 대한 쓰기 배리어를 포함한다. 쓰기 배리어는 관련된 첫 번째 및 두 번째 포인터의 각 선택된 부분이 서로 다르면 저장 명령을 트랩한다. 저장 명령의 타깃 오브젝트를 참조하는 첫 번째 포인터와 두 번째 포인터는 저장 내부에 객체 참조 데이터화 되어있다. 각각의 선택된 부분은 프로그램으로 결정된 가베지 수집 페이지 마스크의 내용에 의해 결정된다. 다른 실시예에 있어서, 프로그램 가능하게 정의된 가베지 수집 페이지 마스크는 가베지 수집 페이지 크기를 결정한다.
또 다른 실시예에 있어서, 쓰기 배리어는 마스크와 가베지 수집 페이지 마스크를 인코딩하는 가베지 수집 페이지 레지스터 필드에 응답하는 비교 로직을 포함한다. 또 다른 실시예에 있어서, 장치는 프로그램으로 결정되는 가베지 수집 페이지 마스크의 출현을 포함하는 가상 머신 명령 프로세서를 포함한다. 쓰기 배리어는 가상 머신 명령 프로세서에서 실행 가능한 포인터 특정 저장 명령 코드를 포함한다. 포인터 특정 저장 명령 코드의 실행은 타깃 오브젝트 참조 각각의 마스크된 부분 및 오브젝트 참조 데이터의 비트와이즈 비교에 기초하여, 포인터 특정 저장 명령의 어느 하나의 특별한 실행이 가베지 수집 페이지 경계 횡단 포인터를 저장할지를 결정하고 만약 그렇다면 가베지 수집 폴트 처리기에 트랩한다.
여러 다른 실시예에 있어서, 가상 머신 명령 프로세서는 하드웨어 프로세서 및 직접 실행 가능한 가상 머신 명령의 최소한의 부분, 또는 하드웨어 프로세서 상에서 실행 가능한 해석된 실행, 또는 하드웨어 프로세서 상에서 실행 가능한 적기 컴파일러(Just-In-Time compiler)(또는 JIT 컴파일러) 실행을 포함한다. 해석 및 적기 컴파일러 실행에 있어서, 가베지 수집 페이지 마스크는 각각의 하드웨어 프로세서에 의해 접근 가능한 기억장치 내에 나타난다.
본 발명에 따른 다른 실시예에 있어서, 가베지 수집 페이지 경계 횡단 포인터 저장을 트랩하는 방법은 가베지 수집 페이지 마스크를 컴퓨터의 판독 가능 기억 장치에 형성하고, 포인터 특정 저장 명령의 특별한 실행에 관련된 첫 번째 및 두 번째 포인터를 마스킹하고, 첫 번째 및 두 번째 포인터 각각의 마스크되지 않은 부분을 비교하여 첫 번째 및 두 번째 포인터가 동일 가베지 수집 페이지상의 각각의 기억장치를 참조하고 일치하지 않는 비교 결과에 기초하여 트랩 처리기를 트리거하는 것을 포함한다. 첫 번째 포인터는 포인터 특정 저장 명령의 타깃 오브젝트 참조이고 두 번째 포인터는 포인터 특정 저장 명령의 오브젝트 참조 데이터이다. 마스킹은 가베지 수집 페이지 마스크의 내용에 기초한다.
다른 실시예에 있어서, 방법은 일치하는 비교결과에 근거한 트래핑 없이 포인터 특정 저장 명령의 특별한 실행을 완료시키는 것을 포함한다. 또 다른 실시예에 있어서, 상기 트랩 처리기의 동작은 포인터 특정 저장 명령에 대응하는 재생된 세트 엔트리의 저장을 포함한다.
관련 실시예에 대한 설명
본 발명을 실행하기 위한 최선의 방식에 대한 상세한 설명을 다음과 같이 기술한다. 이 설명은 본 발명을 설명하기 위한 것이고, 이에 한정되지 않는다.
가베지 수집 세대의 격리에 대해 여기서 기술된 아키텍처 지원은 세대간 포인터 저장 트랩 매트릭스, 오브젝트 참조 세대 태그 표시, 세대간 포인터 저장 트랩 매트릭스와 오브젝트 참조 세대 태그 표시에 응답하는 쓰기 배리어, 가베지 수립 트랩 처리기를 포함하고, 쓰기 배리어 지원을 갖는 포인터 특정 명령의 포인터 비특정 명령으로의 선택적인 동적 교체를 용이하게 한다.
일반적으로, 본 발명에 따른 실시예는 가베지 수집 시스템의 세대를 분리하기 위한 여러 가지 양상의 아키텍처 지원을 이용할 수 있다. 이런 구조적인 지원이 하드웨어, 소프트웨어 또는 하드웨어와 소프트웨어의 조합으로 제공될 수 있지만, 구조적인 지원이 실질적으로 하드웨어로 제공되는 실시예가 통상 향상된 성능과 감소된 메모리 요구 이점을 제공할 것이다. 이 때문에, 본 명세서에는 예시적인 하드웨어 가상 머신 명령 프로세서 실시예가 기술되고 있다. 그러나 당업자라면 이 설명에 기초하여 첨부한 특허청구범위의 범위에 포함되는 가상 머신 명령 프로세서의 소프트웨어(예를 들면, 인터프리터, 적기(just-in-time: JIT) 컴파일러 등) 구현에 기초한 실시예를 포함하는 대안적인 실시예를 인식할 수 있을 것이다.
JAVA 가상 머신 명령 프로세서 실시예
도 1은 본 발명에 따른 한정된 정지 시간 재할당 가베지 수집을 위한 지원을 포함하고, 프로세서 구조와는 독립적인 JAVA 가상 머신 명령을 직접 실행하는 가상 머신 명령 프로세서(100)(이하, 하드웨어 프로세서(100))의 예시적인 하드웨어 실시예를 나타낸다. 가상 머신 명령을 실행하는데 있어서 하드웨어 프로세서(100)의 성능은 통상 소프트웨어 JAVA 인터프리터로 동일한 가상 머신 명령을 해석하는 선 마이크로시스템 ULTRASPARC 프로세서 또는 인텔 PENTIUM 마이크로프로세서(ULTRASPARC은 캘리포니아주 마운틴 뷰에 위치한 선 마이크로시스템즈의 상표이고, PENTIUM은 캘리포니아주 서니베일에 위치한 인텔의 상표이다)와 같은 하이엔드(high-end) CPU보다 좋다. 부가적으로, 하드웨어 프로세서(100)의 성능은 JAVA 적기(JIT) 컴파일러를 갖는 다른 몇몇 하이엔드 CPU보다 좋다. 하드웨어 프로세서(100)는 저가이고, 낮은 전력 소비를 나타낸다. 그 결과, 하드웨어 프로세서(100)는 휴대용 애플리케이션에 적합하다.
하드웨어 프로세서(100)는 실질적으로 하드웨어, 25-50Kbyte의 메모리 기억장치, 예를 들어 판독 전용 메모리(ROM) 또는 랜덤 액세스 메모리(RAM)로 JAVA 가상 머신 명령 프로세서 구현을 제공하기 때문에, 소프트웨어 인터프리터에 의해 요구되는 다른 것은 제거되거나 대안적으로 할당될 수 있다. 가베지 수집을 위한 하드웨어 지원은 또한 가베지 수집을 위한 인라인(in-line) 코드(예를 들어 판독 및/또는 쓰기 배리어 지원을 갖는 컴파일러)를 줄이고, 제한된 메모리의 효율 개선을 용이하게 하며, 가베지 수집 오버헤드와 정지 시간을 줄임으로써 제한된 메모리의 JAVA 가상 머신 구현에 대한 이점을 제공한다. 예를 들어 네트워크용 인터넷 칩, 셀룰러폰 프로세서, 다른 통신 집적회로 또는 내장 프로세서와 같은 다른 저전력, 저비용 애플리케이션 및 휴대용 장치를 포함하는 대용량 메모리의 사용이 불가능한 환경에서는 하드웨어 프로세서(100)가 유용하다.
심지어 대용량 메모리가 사용 가능한 환경에서도, 가베지 수집을 위한 하드웨어 지원은 배리어 구현과 관련된 오버헤드를 줄이고, 메모리의 효율 개선을 용이하게 하며, 재할당 가베지 수집기 구현에 대한 정지 시간을 줄인다. 특히, 하드웨어 프로세서(100)는 예시 JAVA 가상 머신 구현과 관련하여 가베지 수집 방법 및 구현에 대한 이점을 제공한다. 그러나 당업자라면 이 설명에 기초하여 예를 들어 해석되고 JIT 컴파일하는 JAVA 가상 머신 구현을 포함하는 다른 JAVA 가상 머신 구현 뿐만 아니라 다른 비-JAVA 가상 머신 구현에 대한 변형을 파악할 수 있을 것이다.
여기서 사용된 것처럼, 가상 머신은 실제 컴퓨팅 기기와 같이 명령 세트를 갖고 다양한 메모리 영역을 사용하는 축약형 컴퓨팅 기기이다. 가상 머신 명세는 가상 머신 구현에 의해 실행되는 프로세서 구조와는 독립된 가상 머신 명령 세트를 규정한다. 일반적으로, 가상 머신 구현은 하드웨어(예를 들어 하드웨어 프로세서(100)의 경우), 소프트웨어(예를 들어 해석 JIT 컴파일러 구현의 경우) 또는 하드웨어와 소프트웨어의 조합일 수 있다. 각각의 가상 머신 명령은 수행되는 특정 연산을 규정한다. 가상 머신은 가상 머신 명령 또는 가상 머신의 기본 구현을 실행하기 위해 사용되는 컴퓨터 언어를 이해할 필요는 없다. 다만 가상 머신 명령에 대한 특정 포맷을 이해하기만 하면 된다. 실시예에서, 가상 머신 명령은 JAVA 가상 머신 명령이다. 각각의 JAVA 가상 머신 명령은 정보, 오퍼랜드 및 다른 필요한 정보를 식별하는 명령을 인코드하는 하나 이상의 바이트를 포함한다.
이 실시예에서, 하드웨어 프로세서(100)(도 1)는 바이트코드를 포함하는 JAVA 가상 머신 명령을 처리한다. 하드웨어 프로세서(100)는 대부분의 바이트코드를 직접 실행한다. 그러나 다른 몇몇 바이트코드의 실행은 마이크로코드를 통해 구현된다. 참조상 본 명세서에 포함된 린드홈 및 엘렌의 "JAVATM 가상 머신 명세(애디슨-웨슬리, 1996), ISBN 0-201-63452-X는 예시적인 JAVA 가상 머신 명령 세트를 포함한다. 하드웨어 프로세서(100)가 지원하는 특정한 가상 머신 명령 세트는 본 발명의 중요한 태양은 아니다. 그러나 가상 머신 명령의 관점에서, 당업자는 특정한 가상 머신 명령 세트 또는 JAVA 가상 머신 명세로의 변경을 위해 본 발명을 변형할 수 있다.
한 실시예에서, 하드웨어 프로세서(100)는 I/O 버스 및 메모리 인터페이스 유닛(110), 명령 캐시(125)를 포함하는 명령 캐시 유닛(120), 비고속-고속 번역기 캐시(131)를 포함하는 명령 디코드 유닛(130), 통합 실행 유닛(140), 스택 캐시(155)를 포함하는 스택 관리 유닛(150), 데이터 캐시(165)를 포함하는 데이터 캐시 유닛(160) 및 프로그램 카운터 및 트랩 제어 로직(170)을 포함한다. 여기에 기술된 가베지 수집 기능에 대한 지원은 기본적으로 프로그램 카운터 및 트랩 제어 로직(170)에 다른 몇몇 부가적인 지원(예를 들어 프로그램 카운터를 트래핑 저장에 이어지는 다음 JAVA 가상 머신 명령으로 강제하는 지원을 포함하는)을 갖는 실행 유닛(140)의 레지스터(144)와 정수 유닛(142)에 존재한다. 한 실시예에서, 비고속-고속 번역기 캐시(131)는 정수 유닛(142)의 하드웨어 쓰기 배리어 로직에 대한 포인터 지정을 용이하게 한다. 이들 유닛들은 아래 기술되어 있다.
도 2는 예를 들어 부분적으로 하드웨어 프로세서(100)(도 1)에 의해 규정되고, 부분적으로 그 프로세서에서 실행 가능한 애플리케이션 환경과 같은 JAVA 애플리케이션 환경의 소프트웨어와 하드웨어 구성요소 사이의 관계 "설정" 을 나타낸다. JAVA 애플리케이션/애플릿 소프트웨어(210)는 한 실시예에서 JAVA 바이트코드를 포함하는 AWT 클래스(241), 네트 및 I/O 클래스(242) 및 JAVA OS 윈도우(243), JAVA OS 그래픽(248), TCP(244), NFS 클라이언트(215), UDP(246), IP(247), 이더넷(222), 키보드(249) 및 마우스(221) 소프트웨어 구성요소를 포함하는 애플릿/애플리케이션 프로그래밍 인터페이스(220)를 규정하는 소프트웨어 구성요소를 이용한다. 도 2의 실시예에서, JAVA OS 그래픽(248) 및 이더넷(222) 소프트웨어 구성요소는 또한 기준이 되는 JAVA 가상 머신 명세에 의해 규정된 것 이외의 확장 바이트코드를 포함한다. 내장 애플리케이션 프로그래밍 인터페이스(EAPI)(230)의 구성요소는 JAVA 가상 머신 명세에 따른 JAVA 가상 머신 구현(250)의 하드웨어 및 소프트웨어 구성요소와 기본 클래스(231)를 포함한다.
JAVA 가상 머신 구현(250)은 JAVA 가상 머신 명령을 평가하기 위해 하드웨어 프로세서(100)와 그 위에서 실행 가능한 트랩 코드를 포함한다. 부가적으로, JAVA 가상 머신 구현(250)은 클래스 로더(252), 바이트코드 검사기(253), 스레드(thread) 관리기(254) 및 가베지 수집기(251) 소프트웨어와 같은 확장 바이트코드(예를 들어 가베지 수집과 관련하여 아래에 기술된 메모리 액세스 배리어와 포인터 저장 바이트코드를 포함하는) 및 마이크로커널(255)에 대한 하드웨어 지원을 포함한다. JAVA 가상 머신 명세 구현(250)은 JAVA 가상 머신 명세 호환 부분(250a) 뿐만 아니라 구현 종속 부분을 포함한다. JAVA 가상 머신 명세가 가베지 수집이 제공된 것을 나타내지만, 사용된 특정 가베지 수집 방법은 구현 종속이다.
JAVA 가상 머신 구현(250)의 예시적인 하드웨어 프로세서(100) 구현과 관련하여 여기에 기술된 가베지 수집에 대한 구조적인 특징은 특히 세대 가베지 수집 방법에 적합하다. 그러나 당업자라면 이 설명에 기초하여 일반적으로 예를 들어 비-세대 수집기 구현, 증분형 마크 단축 수집기, 복사 수집기 등을 포함하는 재할당 수집기에 대한 본 발명의 한정된 정지 시간 지원에 대한 애플리케이션을 파악할 수 있을 것이다.
도 3A는 보다 정교한 시스템을 형성하기 위한 하드웨어 프로세서(100)에 대한 몇 가지 가능한 첨부를 나타낸다. 도시된 8가지 기능, 즉 NTSC 인코더(301), MPEG(302), 이더넷 제어기(303), VIS(304), ISDN(305), I/O 제어기(306), ATM 어셈블리/리어셈블리(307) 및 무선 링크(308) 중 어느 하나를 지원하는 회로가 본 발명의 하드웨어 프로세서(100)와 같은 칩에 집적될 수 있다.
부가적으로, 당업자라면 상기한 첨부 회로 중 하나를 갖는 하드웨어 프로세서(100)의 실시예를 포함하는 하드웨어 프로세서(100)를 포함하는 광범위한 컴퓨터 시스템을 파악할 수 있을 것이다. 통상적인 컴퓨터 시스템(300) 실시예는 물리적인 메모리 기억장치(예를 들어 RAM 및/또는 ROM), 컴퓨터 판독 가능 매체 액세스 장치(예를 들어, 디스크, CD-ROM, 테이프 및/또는 메모리 기술 기반 컴퓨터 판독 가능 매체 액세스 장치 등), 입력/출력 장치 인터페이스(예를 들어, 키보드 및/또는 포인팅 장치, 디스플레이 장치 등에 대한 인터페이스) 및 통신 장치 및/또는 인터페이스를 포함한다. 적합한 통신 장치 및/또는 인터페이스는 네트워크 또는 전화 기반 통신에 대한 것, 공용 교환망, 전용망 등의 지상통신선 및/또는 무선 부분을 포함하는 통신망과의 연결을 위한 것을 포함한다. 본 발명의 다른 실시예에서, 명령 스트림(예를 들어 JAVA 바이트코드를 포함하는)은 상기 통신 장치 또는 인터페이스를 통하여 하드웨어 프로세서(100)에 의한 실행을 위해 송신 및/또는 수신된다.
가베지 수집을 위한 구조적인 지원
하드웨어 프로세서(100)는 자체에서 실행 가능한 가베지 수집 소프트웨어로서 구현된 세대 수집기 방법을 포함하는 다양한 가베지 수집 방법에 대한 구조적인 지원을 제공한다. 특히, 하드웨어 프로세서(100)는 프로그램 가능 저장 필터링, 태그형 객체 참조와 객체 헤더 포맷 및 확장 바이트코드 지원을 포함한다.
프로그램 가능 저장 필터링
도 4는 상기 히프(heap)에 대한 저장의 프로그램 가능 필터링을 지원하는 슈퍼바이저 쓰기 가능 레지스터 GC_CONFIG의 한 실시예를 나타낸다. 도 1과 관련하여, 레지스터 GC_CONFIG는 레지스터(144)에 포함되고, 실행 유닛(140)에 접근 가능하다. 한 실시예에서, 12비트의 레지스터 GC_CONFIG는 페이지간 포인터 저장 검사를 위해 페이지 크기를 선택하는데 사용하는 필드 GC_PAGE_MASK를 규정한다. 12비트의 필드 GC_PAGE_MASK는 0x3F로 규정된 부가적인 8개의 보다 유효한 비트와 0x000으로 규정된 12개의 덜 유효한 비트를 갖는 32비트 가베지 수집 페이지 마스크의 비트 23:12로서 사용된다. 생성된 32비트의 가베지 수집 페이지 마스크는 프로그램 가능 가베지 수집 페이지 경계를 교차하는 포인터 저장에 대한 저장 배리어(storage barrier)를 형성하는데 사용된다. 포인터 저장의 저장 데이터 value와 objectref 타깃(예를 들어 스택 캐시(155)에 표시된 오퍼랜드 스택의 상위에 존재하는 value와 objectref에 대해 동작하는 aputfield_quick 명령)은 32비트 가베지 수집 페이지 마스크에 의해 효율적으로 마스크되고, value(objectref)가 타깃 객체가 존재하는 것과는 다른 가베지 수집 페이지를 가리키는지를 판정하기 위해 비교된다. 상기 방식에서, 가베지 수집 페이지 크기는 가상 메모리 페이지 크기와는 무관하다. 게다가, 가베지 수집 페이지는 가상 메모리 지원 없이 저비용, 저전력 휴대용 장치 애플리케이션 또는 인터넷기기 애플리케이션과 같은 컴퓨터 시스템과 운영체제 환경에 제공될 수 있다. 도 4의 실시예에서, 이 설명에 기초하여 다른 가베지 수집 페이지 크기와 크기 범위에 대한 적절한 변형이 당업자에게는 명백해지지만, 레지스터 GC_CONFIG는 4KByte 내지 8MByte 범위의 가베지 수집 페이지 크기의 프로그램 가능한 정의를 허용한다.
레지스터 GC_CONFIG는 또한 세대간 포인터 저장 트랩 매트릭스를 프로그램 가능하게 정의하는 필드 WB_VECTOR를 포함한다. 필드 WB_VECTOR는 저장 데이터 value와 연관된 포인터 데이터 세대와, 그의 objectref 타깃과 연관된 타깃 객체 세대를 갖는 포인터 저장이 트래핑하는 세대 쌍을 인코드한다. 도 4의 실시예에서, WB_VECTOR는 가베지 수집 트랩이 바람직한 포인터 데이터와 타깃 객체 세대 쌍에 대한 1비트 표시의 4x4 매트릭스를 규정한다. 다른 실시예는 보다 크거나 작은 매트릭스를 규정할 수 있고, 부가적인 상태(예를 들어, no_trap, gc_notify2 및 gc_notify3)를 선택적으로 인코드할 수 있다.
도 4의 실시예를 참조하면, 타깃 객체의 objectref의 2비트 태그는 필드 WB_VECTOR에 4비트 인덱스를 형성하기 위해 그 안에 저장되는 value의 2개의 태그 비트와 연관된다. 2비트 태그는 각각 아래에 기술된 바와 같이 세대 구성원 정보를 인코드한다. 다음에 필드 WB_VECTOR의 인덱스된 비트는 쓰기 배리어가 대응하는 포인터 저장을 트랩하는지 여부를 인코드한다. 필드 WB_VECTOR는 모든 세대간 포인터 저장(즉, 포인터 데이터 세대와 타깃 객체 세대가 동일하지 않은 모든 포인터의 저장), 모든 포인터 저장(세대간뿐만 아니라 한 세대내), 보다 새로운 세대 포인터 저장(즉, 보다 오래된 세대 객체로의 보다 새로운 세대 포인터의 저장) 등에 대한 트래핑을 인코드하기 위해 프로그램 가능하게 구성될 수 있다. 일반적으로, 세대 쌍에 대한 임의의 복합 트래핑이 지원된다. 도 4의 실시예에서는 4세대까지가 지원되지만, 당업자라면 이 설명에 기초하여 보다 많은 수의 세대에 대한 적절한 변형을 파악할 수 있을 것이다.
한 실시예에서, 필드 GC_PAGE_MASK와 필드 WB_VECTOR는 포인터 저장에 대한 쓰기 배리어의 동작을 프로그램 가능하게 규정한다. 특히, 아래에 보다 상세히 기술되는 것처럼, 하드웨어 프로세서(100)에 의해 제공된 확장 바이트코드 지원은 쓰기 배리어로 하여금 비포인터 저장으로부터 포인터 저장을 식별하도록 하고, 필드 GC_PAGE_MASK와 WB_VECTOR는 또한 하드웨어 프로세서(100)로 하여금 프로그램 가능하게 규정된 포인터 저장 세트를 트랩하기 위해 쓰기 배리어를 프로그램 가능하게 필터링하도록 한다. 그러나 대안적인 실시예는 종래의 배리어 구현에서 프로그램 가능하게 규정된 명백한 포인터 저장 세트를 여전히 이용하면서, 하드웨어 프로세서(100)의 확장 바이트코드 지원에 의해 제공된 포인터 저장에 대한 유리한 정확한 식별을 보류할 수 있다.
도 4는 프로그램 할 수 있는 저장 필터링 지원을 4세대 수집 메모리 공간(450)과 관련하여 나타낸다. 가베지 수집기 프로세스(420)는 기억된 세트(460)가 변형기(mutator) 프로세스(410)에 의해 만들어지는 어린 세대 포인터 저장을 쓰기하는 세대 수집기를 구현하기 위해서 하드웨어 프로세스(100)에서 실행할 수 있는 바이트코드를 포함한다. 세대간 포인터 저장 트랩 매트릭스(470)의 내용은 필드 WB_VECTOR의 내용에 대응하고, 쓰기 배리어를 어린 세대 포인터 저장에 엔코드한다. 이하 설명된 바와 같이 엔코드되는 태그(Tags)는 저정 데이터 포인터 값과 연관된 세대와 프로세스(410)의 포인터 저장 명령(즉, aputfield_quick )의 오브젝트레프(objectref) 타깃과 연관된 세대를 위해 세대간 포인터 저장 트랩 매트릭스(470)내로 인덱스하기 위해 사용된다. 그렇게 인덱스된 세대간 포인터 저장 트랩 매트릭스(470) 원소의 내용에 기초하여, 쓰기 배리어(430)는 만일 태그가 값과 연관되고 오브젝트레프가 어린 세대 오브젝트에 대한 참조가 나이든 세대 오브젝트 내로 저장되고 가베지 수집기 트랩 처리기(gc_notify)(440)를 불러낸다면 aputfield_quick 포인터 저장을 트랩한다.
여기서의 설명에 기초하여, 그러한 기술은 세대간 포인터 저장 트랩 매트릭스(470)(즉, 필드 WB_VECTOR의) 및/또는 필드 GC_PAGE_MASK의 내용에 의해 제공되는 특정 프로그램할 수 있게 선택된 저장 필터링을 지원하는 가베지 수집기 트랩 처리기(440)를 위해 알맞은 구현의 다양성을 평가할 것이다. 세대간 포인터 저장 트랩 매트릭스(470)의 내용(도 4)에 따른 한 실시예에서, 가베지 수집기 트랩 처리기(440)는 기억된 준비 데이터 구조(즉, 수집된 메모리 공간(450)의 세대 1, 2, 및 3에 각각 대응하는 기억된 세트 461, 462, 및 463를 포함하는) 트래핑 저장에 대한 정보를 저장하기 위해 하드웨어 프로세서(100)에서 실행할 수 있는 바이트코드를 포함한다.
또 다른 실시예에서, 세대간 포인터 저장 트랩 매트릭스(470)의 내용은 트랩을 전체 포인터 저장을 프로그램할 수 있게 정의한다. (세대간 또는 달리) 수집 트랩 처리기(440)의 대안적인 관련된 카드 마킹 타입 실시예는 카드 테이블 데이터 구조에 트래핑 저장에 대한 정보를 저장하기 위해 하드웨어 프로세서(100)에 실행할 수 있는 바이트코드를 포함한다. 종래의 카드 마킹 구현과 대조하여, 여기서 설명된 가베지 수립을 위한 구조는 하드웨어 프로세서(100)가 포인터 저장과 일반적으로, 저장을 구분하고, 상호 포인터와 일반적으로 포인터와 구분하도록 지원한다. 이러한 이유로, 또 다른 카드 마킹 타입 실시예에서, 포인터 저장 트랩 매트릭스(470)의 내용은 포인터만 트랩하도록 프로그램 할 수 있게 한정된다.
기억된 세트 스타일 실시예 및 카드 마킹 스타일 실시예에서 확장된 바이트코드지원은 하드웨어 프로세서(100)가 아래에 더 상세하게 설명된 것과 같이 비-포인터 저장 중에서 포인터 저장을 정확히 식별하도록 한다. 또한, 세대간 포인터 저장 트랩 매트릭스(470)(즉, 필드 WB_VECTOR에 의한)와 쓰기 배리어(430)에 의해 제공되는 더미에 대한 저장의 프로그램할 수 있는 필터링과 쓰기 배리어(430)는 하드웨어 프로세서(100)가 수립 시간에서보다 변형기 프로세스(410) 저장 시간의 t세대간 포인터 저장을 식별하게 한다. 이러한 이유로, 용어 카드 마킹은 수립 동안에 수집기 프로세스(420)에 의해 사용하기 위한 가베지 수립 트랩 처리기(440)의 실시예에 의해 제공되는 기억장치의 종류(즉, 카드 테이블)로 설명된다. 용어 "카드 마킹" 의 사용은 포인터 또는 문자 데이터가 저장되는 것과는 상관없이 모든 저장이 트랩되는 것이 필요하다는 것을 의미하지는 않는다.
도 4는 또한 포인터 저장의 트랩핑에 기초한 가베지 수립 페이지를 지원하는 것을 나타낸다. 필드 GC_PAGE_MASK는 저장 데이터 포인터 값과 포인터 저장 명령의 objectref 타깃(즉, aputfield_quick 명령의)을 비교하기 위해 프로그램 가능한 마스크를 제공한다. 쓰기 배리어(430)는 만일 값에 대한 가베지 수립 페이지가 값과 objectref가 부합하지 않는다면 포인터 저장을 트랩한다. 추가적인 저장 필터링은 필드 GC_PAGE_MASK에 의해 제공하고 쓰기 배리어(430)는 수집기 프로세스(420)가 수집기 프로세스(420)의 실시예에 의해 가장 오래된 세대의 비-분열을 수립하기 위해서 사용되는 Hudson의 트레인 알고리즘(R.Hudson 및 J.E.B. Moss, Incremental Garbage Collection for Mature Objects, Proceedings of International Workshop on Memory Management, St.Malo,France,16-18,Sept.1992) 하드웨어 프로세서(100)에서 수집기 프로세스(420)을 구현하는데 특히 유용하다. 당업자는 이러한 것들은 Hudson의 트레인 알고리즘에 따라 트레인 "cars"를 한정하는데 사용되는 필드 GC_PAGE_MASK에 의해 한정되는 가베지 수립 페이지 크기가 있는 알맞은 구현을 인식할 것이다.
예로써, aputfield_quick 바이트코드의 구문(syntax)과 그것에 따른 하드웨어 프로세서(100)의 동작은 다음과 같다:
동작: 가베지 수집 객체에 참조 필드 설정 준비
형식:
aputfield_quick
offsetbyte 1
offsetbyte 2
스택: ...,objectref,value
...
설명: 타입이 reference인 objectref 및 타입이 reference인 value가 연산 스택으로부터 팝(pop)된다. 상기 value는 상기 objectref에 의해 참조되는 클래스 인스턴스내 오프셋(offset)에 쓰여진다. 오프셋의 상기 value는 (오프셋바이트 1《 8)|오프셋바이트 2이다.
실행시간 예외: 만일 상기 objectref가 널(0)이면, aputfield_quick NullPointException을 던져준다.
objectref와 value 각각의 가장 중요한 두 비트가 4-비트 인덱스를 형성하기 위해 연쇄되어진다. 이 인덱스는 GC_CONFIG 레지스터의 16-비트 WB_VECTOR 필드로부터 한 비트를 선택한다. 만일 선택된 비트가 세트되면, gc_notify 트랩이 발생된다.
index=((objectref & 0xC0000000)≫28)|(value≫30)
if(GC_CONFIG.WB_VECTOR [index]= = 1)
generate gc_notify
주의: 이 명령의 동작 코드는 원래 putfield였고, 필드에 대한 동작은 타입 참조의 필드에 대응하는 클래스 인스턴스 데이터 내에 동적으로 오프셋을 가지도록 결정되었다.
putfield 명령에 의해 참조된 상수문의 입력사항이 결정될 때, 상기 명령이 참조하는 상기 필드를 위한 오프셋은 발생되고, 상기 필드의 타입이 결정된다. 16-비트 오프셋은 본래의 putfield 명령의 두개의 연산자 바이트를 대체한다. 상기 필드의 타입은 putfield_quick, putfield2_quick, 또는 aputfield_quick 바이트코드가 본래의 putfield 바이트코드를 대체하는지를 결정한다.
클래스(객체에서 참조 필드보다 오히려)에서의 정적 참조 필드를 설정하기 위한 aputstatic_quick 바이트코드의 구문과 그것에 따른 하드웨어 프로세서(100)의 동작은 유사하다.
빠른 가베지 수집 트랩 처리기
한 실시예에서, 빠른 가베지 수집의 처리는 벡터된 트랩에 의해 제공되고, gc_notify(tt=0x27), prioity=17는 하드웨어 프로세서(100)에 의해 실행할 수 있는 바이트코드를 포함하는 연관된 가베지 트랩 처리기(440)를 시작하게 하는 트랩 제어 로직(170)에 의해 구현된다. 한 실시예에서, 가베지 수립 페이지 경계 횡단 포인터 저장 또는 세대간 포인터 저장에 대한 응답으로 발생하던지 간에, 단일 가베지 수립 트랩 조정기(440)는 가베지 수립 트랩의 각각을 서비스한다. 트래핑 저장이 완료되기 전에 가베지 수립 트랩이 일어나기 때문에, 가베지 수립 트랩 처리기(440)는 하드웨어 프로세서(100)가 무한하게 트래핑하는 것을 방지하기 위해 기억된 세트 또는 카드 테이블 갱신과 같이 수행된 가베지 수립 기능에 더하여 트래핑 저장을 모방하는 것이 필요하다. 다음에 가베지 수립 트랩 처리기(440)는 상기 저장에 뒤따르는 명령에 PC를 강제해야 된다.
가베지 수립 트랙에 의해서 영향 받은 JAVA 가상 머신 명령은 aputfield_quick, aputststic_quick, aastore, anewarray, multianewarray, newarray, putfield, putstatic, 및 new를 포함한다. 이들 중에서, aputfield_quick, aputstatic_quick, 및 aastore만이 상기 필드 WB_VECTOR 및/또는 GC_PAGE_MASK의 내용에 따라서 동적인 필터링과 같은 가베지 수집 점검을 수행하는 것이 필요하다. 다른 것은 가베지 수립 메커니즘 사용, 예를 들어, 세대의 멤버쉽 태그를 적절히 초기화 사용된 가베지 수집 메커니즘을 알고 있기만 하면 된다. 한 실시예에서, 상기 aastore 바이트코드는 모방 루틴에 트랩하고 aastore 트랩 처리기는 적당한 가베지 수집 점검을 수행한다. 간단한 트랩 처리기 구현은 aastore 트랩 처리기에서의 연산자 스택의 최상위에 상기 arrayref를 저장시키고, 만일 필요하다면 적당한 점검과 트랩을 수행하기 위해서 dup,getfield_quick #0,aputfield_quick #0 바이트코드 시퀀스를 실행한다.
태그된 참조와 오브젝트 포맷(객체포맷)
도 5는 하드웨어 프로세서(100)에서 나타낸 것과 같은 객체 참조(objectref)의 한 실시예를 도시한다. 상기 objectref의 3 비트는 가베지 수집 힌트를 위해 사용될 수 있다. 특히, 필드 GC_TAG는 쓰기 배리어(430)가 상기한 바와 같이 포인터 저장을 트랩하는지를 결정하기 위해서 레지스터 필드 GC_CONFIG.WB_VECTOR내의 인덱스의 일부를 형성한다. 도 5의 실시예에서, 필드 GC_TAG는 상기한 바와 같이 쓰기 배리어(430)가 사용할 수 있도록 세대 멤버쉽 정보를 엔코드한다. 부가적인 처리 비트 H는 상기 객체가 핸들을 통해 직접 또는 간접으로 objectref에 의해서 참조되는지를 표시한다. 핸들은 그 시설을 참조하는 방법, 무객체의 첨가적인 레벨의 비용, 그것에 포인터(또는 objectref)의 큰 스케일의 개정 없는 메모리 객체의 재위치를 제공한다. 이러한 필드 모두는 하드웨어 프로세서(100)의 정수 유니트(142)(도 1)에 제공되기 전에 제거된다.
하드웨어 프로세서(100)의 한 실시예에서, 객체(600)는 헤더 부분(610)과 인스턴스 변수 기억장치 부분(620)을 포함하는 메모리에 나타내진다. 도 6A는 이와 같은 실시예를 도시한다. 헤더부(610)는 가베지 수집기를 위한 정보와 객체의 동시 지위에 지정되는 추가적인 기억장치(614)의 다섯 개 비트와 객체의 분류를 대표하기 위한 방법 벡터 테이블 베이스 일부(612)를 포함하는 32-비트 워드를 포함한다. 선택적으로, 제 2 헤더 워드, 즉, 모니터 포인터(616)는 그 객체에 할당된 모니터의 어드레스를 포함할 수 있고, 그것에 의해 가베지 수립 정보에 쓸 수 있는 제 1 헤더 위드에 추가적인 기억장치(614)의 다섯 개의 비트를 만든다. 도 6A의 실시예에서, 객체 참조(objectref)는 메소드 호출 오버헤드를 최소화하기 위해 메소드 벡터 테이블 베이스부(612)의 위치를 가리킨다.
헤더부(610)의 세 비트는 수집기 프로세스(420)와 같은 가베지 수집기가 이용할 수 있다. 헤더부(610)에서, 세 개의 하위 오더 비트(헤더(2;0)) 및 두 개의 상위 비트(헤더(31:30))는 상기 헤더가 포인터로 취급될 때 마스크 오프된다. 이러한 세 개의 비트(헤더(31:30,2))는 가베지 수집기가 객체(600)에 대하여 정보를 저장하는데 이용할 수 있다. 비트 0과 1은 객체동기화를 위해서 LOCK과 WANT bit를 유지하는데 사용된다. 또는, 제 2헤더 위드는, 즉, 모니터 포인터(616)는 객체(600)의 동기 상태를 유지하기 위해서 제공될 수 있고, 가베지 수립 지원을 위해 다섯 개의 비트 모두를 남긴다. 가베지 수립을 위한 수집기 프로세스(420) 및 가베지 수립 트랩 처리기(440)를 구현하는 특별한 타입의 가베지 수립 방법에 의존하여 사용되었다. 가능한 사용들은 마크 비트, 한 세대 내에서의 나이 객체에 대한 카운터 비트 등을 포함한다. 상기한 바와 같이, 헤더부(610)의 제 2 헤더 워드 실시예에서, 다섯 개의 비트는 수집기 프로세스(420)와 같은 가베지 수집기에서 이용할 수 있다.
도 6A의 실시예에서, 인스턴스 변수 기억장치 부분(620)은 메소드 벡터 테이블 베이스부(612) 뒤에 한 워드를 시작하고 객체(600)의 인스턴스 변수를 포함한다. objectref의 가장 작은 비트자릿수는 상기 참조가 조정되는지(==1) 아닌지 (==0)를 규정하고, 대체적인 "조정된" , 객체 포맷은 도 6B에 도시된다. 조정된 참조는 객체(600b)가 만들어지고 모든 후속하는 참조가 상기 조정을 겪을때, 즉, 기억장치 포인터(650b)가 객체에 접근할 때 수립된다. 이 지원은 가베지 수집기의 몇명 유형의 변수를 포함하는 밑에 있는 객체 기억장치보다 핸들을 카피함으로써 객체 재배치의 비용을 줄이는 것을 제공한다.
포인터 비특정 비이트코드의 동적 재배치를 위한 확장 바이트코드 지원
하드웨어 프로세서(100)는 실행 유닛에 공급된 바이트코드를 빠른 변형으로 대치함으로써 JAVA바이트 코드의 실행을 가속하기 위한 특성을 포함한다. 그러나 이제 설명하는 바와 같이, 빠른 바이트코드 대치 특성은 하드웨어 프로세서(100)가 가베지 수립을 위한 쓰기 배리어의 구현을 이용하도록 포인터 특정 저장 동작 바이트코드로 데이터 타입 비특정 저장 동작을 역학적으로 재배치한다.
명령 디코더(135)는 명령 캐시 유닛(120)으로부터 JAVA 바이트 코드와 같은 일련의 명령 흐름을 수신하기 위해 연결된다. 본 발명은 JAVA 바이트 코드와 관련하여 기술되지만, 당업자는 본 명세서에 기초한 다른 가상 머신 환경에서 다른 형태의 명령을 동적으로 대체하기 위한 변형을 인지할 것이다. 비록 여기에 기술된 바이트코드 대치 특성은 상기 병합된 특허 출원에 보다 일반적으로 기술된 것과 같이 명령 파라미터의 실행 시간 분석에 근거한 명령 실행 가속에 일반적으로 적용 가능하지만, 명세서는 쓰기 배리어의 구현을 용이하게 하기 위한 상기 역학적 교환을 효율적으로 실행하기 위한 하드웨어 프로세서(100)상과 포인터 비특정 비고속 바이트코드와 다른 포인터 특성 고속을 가지는 포인터 비특성 비고속 바이트코드의 역학적 교환에 초점을 맞춘다.
도 7을 보면, 명령 디코더(135)는 버스(11)상에 디코드된 바이트코드를 제공하고, 상기 디코드된 바이트코드에 대응하는 프로그램 카운터(PC) 값을 버스(13)상에 제공한다. 이들 바이트코드와 PC 값은 실행 유닛(140)과 명령 및 데이터 프로세서(12)로 제공된다. 또한, PC 값은 연합 메모리(14)의 입력 회로(22)에 제공된다. 일반적으로, 각 PC 값은 바이트코드의 대응 프로그램 발생을 유일하게 확인한다. 연산자 스택(723)의 상부 엔트리는 명령 및 데이터 프로세서(12)에 제공된다.
연합 메모리(14)내에서, 명령 식별자 메모리부(18)는 다수의 (N) 엔트리를 포함한다. 상기 N개의 엔트리 각각은 바이트코드 식별자 값 PC_0, PC_1, PC_2, PC_3, …PC_N과 같은 대응하는 바이트코드 식별자 값을 저장하는 것이 가능하다. 명령 식별자 메모리 부(18)에 저장된 바이트코드 확인 값 각각은 다른 PC 값에 대응된다. 명령 식별자 메모리부(18)의 폭은 상기 프로그램 카운터의 폭에 대응하도록 선택된다.
데이터 세트 메모리 부(20)은 N 엔트리를 포함하여, 명령 식별자 부(18)내의 각 엔트리가 데이터 세트 부(20)내의 관련 엔트리를 가지도록 한다. 데이터 세트 메모리 부(20)의 N 엔트리 각각은 데이터 세트 DATA_0, DATA_1, DATA_2, DATA_3, …DATA_N과 같은 데이터 세트를 저장하는 것이 가능하다. 아래에 상술된 바와 같이, 데이터 세트 메모리 부(20)에 저장된 데이터 세트 각각은 바이트코드의 대응 프로그램 발생의 고속 변형의 실행을 위한 데이터를 포함한다. 한 실시예에서, 데이터 세트 메모리 부(20)는 4개의 32비트 워드의 폭을 가진다. 그러나 데이터 세트 메모리 부(20)은 다른 실시예에서 다른 폭을 가질 수 있다.
명령 및 데이터 프로세서(12)는 버스(11)상에 제공된 바이트코드를 모니터하고, 대응 데이터 세트가 고속 접속가능하다면, 버스(11)상의 현재 바이트코드는 가속된 방법으로 실행되어지는 것이 가능한 비고속 바이트코드인지를 결정한다. 만약 그렇다면, 대응 데이터 세트와 함께 비고속 바이트코드의 고속 변형은 비고속 - 고속 번역기 캐시(131)로 캐시될 것이다. 일반적으로, 비고속 바이트코드는 0, 1 또는 보다 고속 변형을 가질 수 있다. JAVA 가상 머신 규격은 다음의 비고속 바이트코드: anewarray, checkcast, getfield, getstatic, instanceof, invokeinterface, invokespecial, invokestatic, invokevirtual, ldc, ldc_w, ldc2_w, multianewarray, new, putfield, 및 putstatic를 설명하고, 그것은 하드웨어 프로세서(100)의 한 실시예에서, 고속 변형을 갖는다. putfield, putstatic 및 aastore를 포함하는 비고속 저장 지향의 바이트코드에 있어서, 객체 필드에 대응하는 상수 풀 엔트리의 결정은, 만약 결정이 포인터 저장 동작을 가리킨다면, aputfield_quick(가베지 수집 체크를 가지는 객체 내에 참조 필드 설정) 또는 aputstatic_quick(가베지 수집 체크를 가지는 클래스 내에 정적 참조 필드 설정)과 같은 포인터 특정 고속 변형으로 교환을 허용한다. 만약 분석이 다른 참조(예를 들어 비포인터 특정)와 다른 형태의 객체 필드를 가리킨다면, 대치는 예를 들어, putfield_quick(객체 내에 필드 설정), putfield2_quick(물체에서의 긴 또는 이중 필드 설정), putstatic_quick(클래스 내에 정적 필드 설정) 또는 putstatic2_quick(클래스 내에 긴 또는 이중의 정적 필드 설정)과 같은 다른 고속 변형에 의한다.
일반적으로, 대응 데이터 세트가 고속 접속가능하다면, 가속 실행이 가능한 비고속 바이트코드는 이하에서 고속 변형을 가지는 비고속 바이트코드로 지칭된다. 고속 변형을 가지는 비고속 바이트코드는 명령 디코더(135)에 의해 제공되는 바이트코드의 서브세트를 형성한다. 명령 및 데이터 프로세서(12)는 현재 바이트코드의 확인부를 디코딩함으로써 현재 바이트코드가 고속 변형을 가지는 비고속 바이트코드인지를 결정한다. 받침은 고속 변형을 가지는 비고속 바이트코드의 N 프로그램 발생를 위한 지원이 데이터 세트 메모리와 명령 식별자 메모리내의 엔트리에 의해 제공된다. 상기 엔트리의 일부는 대응 프로그램 발생이 포인터 저장을 결정하기 위한 비고속 저장 지향의(그러나 비포인터형의) 바이트코드의 포인터형 고속 변형을 위해 사용되어질 수 있다.
비고속-고속 번역기 캐시(131)에 대한 비고속은 현재 PC 값을 가지는 현재 바이트코드에 따라 다음과 같이 동작한다. 명령 디코더(135)는 현재 PC 값과 디코드된 현재 바이트코드를, 실행 유닛(140)과 명령 및 데이터 프로세서(12)에 제공한다. 디코드된 바이트코드가 고속 변형, 고속 변형 로드 바이트코드 또는 재시도 바이트코드를 가지는 비고속 바이트코드일 때, 명령 및 데이터 프로세서(12)가 작동한다. 만약 명령 디코더(135)에 의해 버스(11)상에 제공된 현재 바이트코드가 고속 변형, 고속 변형 로드 바이트코드 또는 재시도 바이트코드를 가지는 비고속 바이트코드가 아니라면, 명령 및 데이터 프로세서(12)는 바이트코드에 반응하지 않고, 대신에, 현재 바이트 코드 및 현재 PC 값이 실행을 위해 실행 유닛(140)에 제공된다.
그러나 현재 바이트코드가 고속 변형을 가지는 비고속 바이트코드일 때, 명령 및 데이터 프로세서(12)는 현재 명령에 반응하여 작동된다. 한 실시예에서, 바이트코드 putfield 및 putstatic은 데이터 프로세서(12)를 작동한다. 작동시에, 명령 및 데이터 프로세서(12)는 라인(21)상에 나타나는 신호 NO_MATCH의 상태를 결정한다. 초기에는 명령 식별자 메모리 부(18)에 저장된 명령 식별자 값 PC_0, PC_1, PC_2, PC_3, …PC_N은 무효 값으로 설정된다. 또는 상기 명령 식별자 값과 관련한 '유효' 비트는 제거될 수 있다. 어느 경우에서나, 입력회로(22)에 제공된 상기 현재 PC값은 처음에는 명령식별자 메모리 섹션(18)에 저장된 상기 명령 식별자 값 중 어느 것과도 일치하지 않는다. 따라서 신호 NO_MATCH가 나타난다. 현재 PC 값과 명령 식별자 값 PC_1, PC_1, PC_2, PC_3, …PC_N 사이의 매치의 부재는 현재 바이트코드를 실행하기 위해 필요한 데이터 세트가 연합 메모리(14)에 현재 저장되지 않았다는 것을 가리킨다. 그 결과로, 명령 및 데이터 프로세서(12)는 상기 비고속 바이트코드를 적당한 고속 변형으로 교환을 허용하기 위해 상기 데이터 세트를 초기에 위치를 알아내고 회수해야 한다.
현재 바이트코드가 고속 변형을 가지는 비고속 바이트코드라는 결정과 상기 신호 NO_MATCH에 응답하여, 명령 및 데이터 프로세서(12)는 제어 신호 TRAP을 나타낸다. 제어 신호 TRAP은 트랩 로직(170)에 제공된다. 제어 신호 TRAP에 응답하여, 트랩 로직(170)은 실행 유닛(170)의 작동을 일시적으로 중지하고, 대응하는 소프트웨어 코드부(31, 32 또는 33)가 액세스되도록 한다. 액세스된 상기 소프트웨어 코드부는 나타내어진 제어 신호 TRAP가 나타나도록 한 상기 비고속 바이트코드에 의존한다.
한 실시예에서, 트랩 로직(170)은 제어 신호 TRAP을 나타나게 한 바이트코드의 특정한 프로그램 발생를 확인하기 위해서 현재 PC 값을 사용하여 명령 캐시 유닛(120)을 액세스한다. 소프트웨어에서 구현된 스위치문은 적당한 소프트웨어 코드부(상기 확인된 바이트코드에 따른)로의 실행을 유도한다. 대안 실시예에서, 트랩 벡터와 같은 다른 방법이 상기 적당한 소프트웨어 코드부로의 실행을 유도하기위해 사용되어질 수 있다.
이와 같이, 상기 식별된 바이트코드가 제 1 바이트코드 INST_0에 대응할 때, 상기 스위치문은 대응 소프트웨어 코드부(31)가 액세스되도록 한다. 실시예에서, 제 1 바이트코드 INST_0은 putfield이고, 제 2 바이트코드 INST_1은 putstatic이다. 상기 식별된 바이트코드가 다른 임의의 바이트코드(예로 INST_N으로 표시되는)에 대응할 때, 상기 스위치 문은 대응하는 소프트웨어 코드부(33)가 액세스되도록 한다.
소프트웨어 코드부(31, 32, …33)는 바이트코드, INST_0(예를 들면, putfield), INST_1(예를 들면 putstatic)…INST_N을, 각각 실행하기 위해 필요한 상기 데이터 세트를 찾아서 회수한다. 다른 방법으로 설명하면, 소프트웨어 코드부(31, 32,…33)는 바이트 코드 INST_0, INST_1, …INST_N의 프로그램 어커러스에 대해서 상수 풀 엔트리를 각각 분석한다. 임의의 비고속 바이트코드(예를 들면, putfield와 putstatic)는 다중 고속 변형(예를 들면 putfield_quick, putfield2_quick, aputfield_quick, putstatic_quick, putstatic2_quick 및 aputstatic_quick)을 가지기 때문에, 상기 대응하는 소프트웨어 코드부는 또한 적당한 고속 변형을 선택한다. 만약 대응하는 상수 풀 엔트리의 분석이 저장 지향의 바이트코드(예를 들면, putfield)인 포인터 저장(예를 들면, 저장 타깃 객체 필드의 타입이 참조이면)의 특정한 프로그램 발생을 가리킨다면, 포인터 특정 고속 변형을 가지고 교환(예를 들면 aputfield_quick)하는 것이 적당하다.
소프트웨어 코드부(31, 32,…33)는 추가로 상기 회수된 데이터세트를 스택(273)으로 로드되도록 한다. 소프트웨어 코드부(31, 32, …33)는 명령 디코더(135)에 고속 변형 로드 바이트코드를 제공한다. 상기 회수된 데이터 세트가 연산자 스택(723)에 로드된 후에, 명령 디코더(135)는 수신된 고속 변형 로드 바이트코드를 디코드한다. 상기 디코드된 고속 변형 로드 바이트코드는 버스(11)로 명령 및 데이터 프로세서(12)에 제공된다. 명령 및 데이터 프로세서(12)는 버스(11)상에 존재하는 각각의 고속 변형 로드 바이트코드를 식별하고, 응답으로 오퍼랜드 스택(723)에 로드된 대응하는 데이터 세트를 회수한다.
그 다음에 명령 및 데이터 프로세서(12)는 상기 회수된 데이터 세트와 상기 현재 PC 값을 연합 메모리(14)로 로드한다. 한 실시예에서, 상기 현재 PC 값은 명령 식별자 값 PC_0으로 명령 식별자 메모리 부(18)의 제 1 엔트리에 쓰기되고, 대응 회수된 데이터 세트는 데이터 세트 DATA_0으로 데이터 세트 부(20)의 제 1 엔트리에 쓰기된다. 현재 PC 값은 명령 및 데이터 프로세서(12)로부터 버스(15)로의 메모리 부(18)로 경로 설정된다. 메모리(14)내의 특정한 엔트리를 선택하기 위해 사용된 방법은 예를 들면, 랜덤, LRU 알고리즘, 또는 FIFO 알고리즘일 수 있다. 상기 데이터 세트는 명령어/데이터 프로세서(12)로부터 데이터 세트 메모리섹션(20)으로 버스(17)로 루팅된다.
상기 현재 PC 값과 상기 회수된 데이터 세트가 메모리(14)에 쓰기된 후에, 명령어 및 데이터 프로세서(12)는 상기 소프트웨어 코드가 제어 신호 TRAP을 나타나도록 하는 상기 비고속 명령어을 재시도하기 위해 일으킨다. 이때, 입력 회로(22)로 다시 제공된 현재 PC 값은 상기 명령 식별자 메모리 부(18)내에 저장된 명령 식별자 값(예를 들면, 명령 식별자 값 PC_0)과 일치한다. 그 결과, 신호 NO_MATCH는 나타나지 않는다. 따라서 명령 및 데이터 프로세서(12)는 소프트웨어 코드부(31, 32, …33)중 대응하는 하나와 트랩 로직(170)을 경유하는 대응 데이터 세트를 찾아서 회수하는 것을 시도하지 않는다.
상기 현재 PC 값은 명령 식별자 값 PC_0과 일치하기 때문에, 출력 부(24)은 실행 유닛(140)으로 대응 데이터 세트 DATA_0을 전달한다. 따라서 실행 유닛(140)은 비고속-고속 번역기 캐시(131)로 상기 연합(조합)관련 데이터 세트 DATA_0(고속 변형 바이트코드 포함)와 현재 PC 값을 회수한다. 이에 응하여, 실행 유닛(140)은 상기 고속 변형 바이트코드를 실행한다.
일단 상기 PC값과 고속 변형을 가지는 비고속 바이트코드와 조합된 상기 데이터 세트가 연합 메모리(14)로 로드되면, 고속 변형을 갖는 상기 비고속 바이트코드의 특정한 프로그램 발생은 상기 소프트웨어 코드를 액세스할 필요 없이, 상기 상수 풀을 분석하지 않고도 이어서 실행되어질 수 있다. 또한, 저장 지향 바이트코드의 특정한 프로그램 발생에 대해서, 상기 특정 프로그램 발생이 포인터 저장으로 귀결된다면 포인터 특정 고속 변형(예를 들면, putfield-quick)이 다음에 실행되고, 상기 특정 프로그램 발생이 비포인터(또는 문자값) 저장으로 귀결된다면 비포인터 고속 변형(예를 들면, putfield_quick 또는 putfield2_quick)이 다음에 실행된다. 또한, 상기 비고속 바이트코드가 프로그램 이미지에서 겹쳐 쓰이지 않기 때문에, 상기 비고속 바이트코드는 그 원래의 형태로 이용할 수 있게 유치된다. 게다가, 상기 비고속 바이트코드는 겹쳐 쓰여지지 않기 때문에 상기 비고속 바이트코드는 읽기 전용 메모리에서 선택적으로 저장되어질 수 있다.
다음의 실시예는 하드웨어 프로세서(100), 특히 변형기 프로세스(410)(도 4)에 의해 포인터 저장소를 선택적으로 트래핑하기 위해서, 쓰기 배리어(430)의 포인터 저장 특정 구현을 용이하게 하는 비고속-고속 번역기 캐시(131)의 동작을 좀더 명확히 해줄 것이다. 명령 디코더(135)는 고속 변형을 가지는 비고속 바이트코드(예를 들면 putstatic)를 초기에 수신하며, 여기서 상기 비고속 바이트코드의 특정한 프로그램 발생은 0×000100이라는 대응하는 PC 값을 가진다. 바이트코드 putstatic의 특정한 프로그램 발생이 명령 식별자 메모리 부(18)에 나타나지 않는다고 가정하면, 상기 현재 PC 값은 0×000100의 입력회로(22)가 신호 NO_MATCH를 나타내도록 한다. 신호 NO_MATCH와, 바이트코드 putstatic가 고속 변형을 가지는 비고속 바이트코드라는 결정에 대응하여, 명령 및 데이터 프로세서(12)는 제어 신호 TRAP을 나타낸다. 트랩 로직(170)은 바이트코드 INST_1(즉 putstatic)로 식별되어 있는 상기 현재 바이트코드를 식별하기 위해서 상기 PC 값을 사용한다. 바이트코드 INST_1로 식별되어있는 현재 바이트코드에 대응하여 소프트웨어 스위치 문은 대응 소프트웨어 코드부(32)의 실행을 지시한다.
그 다음에 소프트웨어 코드부(32)는 상기 저장 타깃 오브젝트 필드와 관련한 상수 풀 엔트리를 분석하여, 바이트코드 INST_1을 실행하기 위해 필요한 상기 데이터 세트를 회수하고, 상기 데이터 세트를 오퍼랜드 스택(723)에 로드한다. 소프트웨어 코드부(32)는 명령 디코더(135)에 고속 변형 로드 바이트코드를 제공한다. 응답으로, 명령 디코더(135)는 명령 및 데이터 프로세서(12)에 디코드된 고속 변형 로드 바이트코드를 제공한다. 명령 및 데이터 프로세서(12)는 오퍼랜드 스택(723)으로부터 상기 데이터 세트를 회수하고, 상기 데이터 세트를 데이터 세트 DATA_0로서 데이터 세트 메모리 부(20)의 제 1 엔트리에 로드한다. 소프트웨어 코드부(32)는 상기 저장 타깃 오브젝트 필드가 타입이 참조 인지(즉, putstatic의 특정한 프로그램 발생이 포인터 저장인지)를 결정하고, 데이터 세트 DATA_0를 갖는 상기 적당한 포인터 특정 고속 변형 바이트코드 aputstatic_quick을 포함한다.
명령 및 데이터 프로세서(12)는 명령 식별자 값 PC_0으로써 명령 식별자 메모리 부(18)의 제 1 엔트리에 0×000100의 현재 PC 값을 추가로 로드한다. 다음에 명령 및 데이터 프로세서(12)는 비고속 바이트코드 INST_1(즉 putstatic)과 0×000100의 현재 PC 값을 버스(11, 13)상에 각각 나타나게 한다. 한 실시예에서, 명령 및 데이터 프로세서(12)는 상기 제어 신호 TRAP를 나타나게 한 바이트코드로 제어를 다시 전달하는 트랩(ret-from-trap) 바이트코드로부터 리턴을 발행함으로써 이것을 달성한다. 이때, 입력 회로(22)는 현재 PC 값과 명령 식별자 값 PC_0사이의 매치를 확인한다. 응답으로, 연합 메모리(14)는 명령 식별자 값 PC_0(즉 포인터 특정 고속 변형 바이트코드 aputstatic-quick을 포함하는 데이터 세트 DATA_0)과 관련된 데이터 세트를 출력 회로(24)에 제공한다. 출력 회로(24)는 상기 포인터 특정 고속 변형 바이트코드 aputstatic_quick를 실행하는 실행 유닛(140)으로 상기 데이터 세트 DATA_0를 전달한다.
고속 변형을 가지는 다른 비고속 바이트코드와 명령 디코더(135)에 의해 그 후에 수신된 동일 비고속 바이트코드의 다른 프로그램 인스턴스는 유사한 방법으로 처리된다. 예를 들면, 관련 PC 값 0×000200을 갖는 비고속 바이트코드 INST_1(즉 putstatic)의 또 다른 프로그램 발생은 데이터 세트 DATA_1로써 데이터 세트 메모리 부(20)에 저장되어있는 명령 INST_1과 관련한 데이터 세트와 명령 식별자 PC_1로써 명령 식별자 부(18)에 저장되어지는 0×000100의 PC 값에 기인한다. 만약 바이트코드 putstatic의 상기 특정한 프로그램의 발생이 문자 값 저장으로 귀결되면, 명령 식별자 값 PC_1(즉 데이터 세트 DATA_1)과 관련한 데이터 세트는 포인터 특정 고속 변형 보다는 putstatic2_quick과 같은 고속 변형 바이트코드를 포함할 것이다. 비고속 바이트코드 INST_1(예를 들면, 데이터 세트 DATA_0)의 제 1 프로그램 발생와 관련한 데이터 세트는 비고속 바이트코드 INST_1(예를 들면 데이터 세트 DATA_1)의 제 2 프로그램 발생과 관련한 데이터 세트와 동일하지는 않는다는 것을 주의하라.
바이트코드 putstatic의 2개의 프로그램 발생을 분해하여, 포인터형 저장 바이트코드 aputstatic_quick에 제 1 프로그램 발생와 비포인터 특정 저장 바이트코드 putstatic2_quick에 제 2 프로그램 발생, 하드웨어 프로세서(100)의 비고속-고속 번역기 캐시(131)는 쓰기 배리어(430)를 포인터 저장에 한정한다. 전술한 바와 같이, 하드웨어 프로세서(100)에 의해 바이트코드 aputfield_quick을 참조평가를 통해서, (포인터형 빠른 변형 바이트코드로 구현된 것처럼) 상기 objectref와 value 오퍼랜드의 각각의 가장 왼쪽 자릿수 2비트를 연쇄시켜 4비트 인덱스를 형성한다. 이 상기 인덱스는 레지스터 GC_CONFIG의 16비트 필드 WB_VECTOR로부터 한 비트를 선택한다. 상기 선택된 비트가 세트이면, 트랩 gc_notify가 발생된다.
index=((objectref & 0xC0000000)>>28) | (value>>30)
if(GC_CONFIG.WB_VECTOR[index]==1)
generate gc_notify
실행유닛(140)(도 1)의 한 실시예에 있어서, 바이트코드 계산을 위한 논리회로는 레지스터 GC_CONFIG(도 4)에 결합하고 상기 논리 표현을 구현한다. 당업자는 다양한 적절한 변형을 인지할 것이다.
또 다른 실시예에 있어서, 쓰기 배리어(430)(포인터형 변형 바이트코드에 의해 구현된)는 세대간의 저장 트래핑과 가베지 수집 페이지 경계 포인터 저장 트래핑을 크로싱하는 양쪽을 지원한다. 전술한 바와 같이, 쓰기 배리어(430)의 상기 실시예는 상기 objectref와 store_data 오퍼랜드의 각각의 가장 왼쪽의 자릿수 2비트를 연쇄시키는 것에 의해 4비트 인덱스를 형성한다. 이 인덱스는 레지스터 GC_CONFIG의 16비트 필드 WB_VECTOR로부터 한 비트를 선택한다. 상기 선택된 비트가 설정되면, 트랩 gc_notify가 발생된다. 그러나 또한 상기 objectref와 store_data 오퍼랜드의 마스크된 부분의 비교에 의해 제 2 트리거가 제공된다. 상기 마스크는 레지스터 GC_CONFIG의 GC_PAGE_MASK필드, 즉 비트 27:16에 의해 프로그램 가능하게 규정된다. 이 제 2 트리거는 프로세서 상태 레지스터 PSR의 가베지 수집 페이지 인에이블 비트 GCE에 의해서 보호된다.
if{(GC_CONFIG[(objectref[31:30]##store_data[31:30])}==1)
OR((PSR.GCE==1) AND
((store_data[31:12] & 0x3F##GC_CONFIG[27:16])!=
(objectref[31:12] & 0x3F##GC_CONFIG[27:16])}
then trap
실행유닛(140)(도 1)의 한 실시예에 있어서, 바이트코드 계산을 위한 논리회로는 레지스터 GC_CONFIG(도 4)에 결합되어 상기 로직 표현을 구현한다. 당업자는 다양한 적절한 구현예들을 인식할 수 있다.
쓰기 배리어(430)의 유리한 대안의 실시예는, 대표적으로 가베지 수집 페이지 경계 횡단 체크를 특정한 세대 또는 세대에 수집된 메모리 공간의 전형적으로 가장 오래된 세대를 제한하기 위한 메커니즘을 제공한다. 변형된 페이지 체크 트래핑 식, 예를 들어
if((PSR.GCE==1)||
((objectref[31:30] == store_data[31:30]) &&
(GEN_PAGE_CHECK_ENABLE[objectref[31:30]]==1))) &&
((objectref[31:12] & 0x3F##GC_PAGE_MASK)!=
(store_data[31:12] & 0x3F##GC_PAGE_MASK)))
then trap
은 상기 objectref 및 store_data 오퍼랜드의 세대 태그 비트(예, 비트 31:30)가 동일한 것을 요구한다. 가장 오래된 세대를 인코딩하기 위한 유연성을 허용하기 위해, 레지스터 GC_CONFIG의 달리 미사용된 4비트(예, 비트 31:28)가 필드 GEN_PAGE_CHECK_ENABLE를 인코드하기 위해서 사용될 수 있다. 이 4비트 필드는 가베지 수집 페이지 경계 횡단 저장의 트래핑이 제한되어지는 세대(를) 어느 것인지를 나타낸다. 당업자는 특정 상기 세대 특유의 가베지 수집 페이지 경계 횡단 저장 트래핑을, 전술한 세대 간 포인터 저장 트래핑과 통합하는 실시예를 포함하는 다양한 실시예를 알수 있을 것이다.
전술한 바와 같이, 빠르지 않은 비고속-고속 번역기 캐시(131)의 동작은 (상기 동작은 타입이 reference 형태인 필드에 대응하는 상기 클래스 인스턴스 데이터에 오프셋을 갖는 필드상에서 동작하도록 결정되었다.) 원래의 바이트코드 putfield를 바이트코드 aputfield_quick로 대체했으며, putfield 명령에 의해 참조된 상수 풀 엔트리가 분석되었을 때, 참조한 필드에 대한 오프셋이 발생되며, 상기 필드의 타입은 reference로 결정되었다. 비고속-고속 번역기 캐시(131)의 대응 데이터 세트 DATA_1에 포함된 16비트 오프셋은 원래의 putfield 명령의 2개의 오퍼랜드 바이트를 대체한다. 상기 필드의 타입은 aputfield_quick 바이트코드가 putfield_quick 또는 putfield2_quick 바이트코드보다 상기 원래의 putfield 바이트코드를 대체한 것을 결정했다. 레지스터 GC_CONFIG의 필드 WB_VECTOR의 내용에 따라서, 쓰기 배리어(430)(한 실시예에서 고속 변형 바이트코드 aputfield_quick에 의해 부분적으로 구현됨)는 전술한 바와 같이 포인터 저장을 트랩할 수 있다.
하드웨어 프로세서(100)에 대한 다이내믹 바이트코드 대체의 일실시예를 기술한다. 다이내믹 바이트코드 대체의 다른 실시예는 자가 변형 코드에 기초한다. 비고속-고속 번역기 캐시(131)의 설명에 비추어, 자가 변형 코트 실시예는 캐시의 구현이 비실용적이거나 또는 바람직하지 않을 때(예, 비용 때문에) 유리하다. 이러한 경우에 있어서, 비고속-고속 번역기 캐시(131)는 제거될 수 있다. 그 대신에, 트랩 코드, 예를 들어, 소프트웨어 코드부(31, 32, …)가 원래의 비고속 바이트코드의 특정 프로그램 출현의 후속 실행이 상기 고속 변형을 평가할 수 있도록, 상기 명령 스페이스내로 직접 쓰는 것에 의해 그의 적절한 변형으로 원래의 바이트코드를 대체한다. 동적 바이트코드 대체 메카니즘에 기초한 자가변형 코드의 한 실시예가 미국특허 제5,367,685호에 기술되어 있다.
가베지 수집 실시예
이제 전술한 가베지 수집에 대한 상술한 구조적 지원의 사용이 다음 3개의 세대 수집기 접근법의 문맥에서 설명된다. 운거(Ungar)의 기억 세트 세대 수집기의 실시예, 세대 수집기에 기초한 윌슨(Wilson)의 카드 테이블의 실시예, 허드슨(Hudson)의 트레인 연산 실행.
기억 세트에 기초한 세대 수집기
도 8은 운거 식의 기억된 세트를 사용하는 세대 가베지 수집을 묘사한다. 이 가베지 수집 접근법의 실시예(예를 들어, 쓰기 배리어(430), 수집기 프로세서(420) 및 가베지 수집 트랩 처리기(440) 포함) 이하의 방식으로 하드웨어 프로세서(100)의 특성을 유리하게 이용할 수 있다.
1. 모든 저장은 트랩할 필요가 없다. 특히, 단지 heap내의 포인터 저장만이 체크될 필요가 있다. 전술한 aputfield_quick 및 aputstatic_quick 바이트코드의 사용은 단지 이러한 포인터 저장만의 체크를 허용한다.
또한, 스택 캐시(155)에 표시된 오퍼랜드 스택 또는 로컬 변수에 대한 저장은, 만약 상기 오퍼랜드 스택, 로컬변수 및 정적 영역이 루트 세트의 부분으로 가정된다면 트랩은 필요하지 않다. 스택 캐시(155)의 엔트리에 나타낸 객체 참조는 포인터로써 식별될 수 있다.
2. 전술한 바와 같이, 하드웨어 프로세서(100)의 쓰기 배리어(430) 지원은 만약 젊은 세대 객체의 objectref가 늙은 세대 객체로 저장되고 있는지가 트랩된다.
3. 어떤 실시예에 있어서, 단지 2 세대가 모아진 메모리 영역(850)내에 지원되는, 실시예에 있어서, 레지스터 GC_CONFIG의 필드 WB_VECTOR은 값 0x5050을 포함한다. 상기 objectref의 필드 GC_TAG의 1 비트(즉 비트 30)만이 고려된다. 한실시예에 있어서, '0' 값은 상기 objectref가 젊은 세대(810)내의 한 객체를 가리키는 것으로 정의한다. 반면, '1' 값은 상기 objectref를 늙은 세대(820)내의 객체를 가리키는 것으로 정의한다. 이 실시예에 있어서, 비트 31이 사실상 무시될 수 있다. 더 많은 수의 세대를 위한 실시예는 본 발명이 속하는 기술 분야의 당업자에 자명할 것이다. 필드 WB_VECTOR의 내용에 따르면, 쓰기 배리어(430)는 늙은 세대(820) 객체로부터의 포인터가 새로운 세대(810) 객체 속으로 저장될 때마다, 가베지수집 트랩 처리기(440)를 트리거한다. 이 실시예에 있어서, PSR.GCE 비트는 '0' 으로 설정되며, 필드 GC_PAGE_MASK의 내용에 기초하여 쓰기 배리어(430) 동작을 무력하게 한다.
4. 상기 저장을 위한 트랩 조건
if{(GC_CONFIG[(objectref[31:30]##store_data[31:30])}==1)
OR((PSR.GCE==1) AND
((store_data[31:12] AND 0x3F##GC_CONFIG[27:16])!=
(objectref[31:12] AND 0x3F##GC_CONFIG[27:16])}
then trap
여기서, store_data는 타깃 객체내로 저장되는 32비트 포인터이며, objectref는 상기 저장이 만들어지는 객체의 32비트 포인터이다.
5. 하드웨어 프로세서(100)가 트랩할 때, 즉, 쓰기 배리어(430)가 가베지 수집 트랩 처리기(440)를 트리거할 때, 하드웨어 프로세서(100)의 실행은 가베지 수집 트랩 처리기(44)를 점프한다. 한 실시예에 있어서, 가베지 수집 트랩 처리기(440)는 기억된 세트(830)에 정보를 저장하며 트래핑 포인터 저장을 에뮬레이션한다.
6. 가베지 수집 동안, 객체는 젊은 세대(810)로부터 오래된 세대(820)로 진급한 객체, 상기 진급한 객체에 대한 모든 참조의 필드 GC_TAG는 상기 진급한 객체가 상기 더 늙은 세대의 부분인 것을 반영하기 위해서 갱신된다.
카드 테이블에 기초한 세대 수집기(Generational collector)
카드에 기초한 세대 수집기를 구현(실시)하기 위해, 레지스터 GC_CONFIG의 필드 WB_VECTOR가 0xFFFF로 세트된다. 이는 쓰기 배리어(433)가 상기 히프에 모든 포인터 저장을 트랩하도록 하며 가베지 수집 트랩 처리기(440)와 같은 트랩 처리기를 트리거한다. 이러한 카드에 기초한 세대 정보수집의 실시예에 있어서, 가베지 수집 트랩 처리기(440)는 카드 테이블 데이터 구조에 추가 저장을 실행하며 트래핑 저장을 모방한다. 대조적으로 윌슨 식의 종래의 카드 기반 세대 수집기 실시와 대조적으로, 상술한 실시예는 단지 포인터 저장을 트랩한다. 또 다른 실시예에 있어서, 레지스터 GC_CONFIG의 필드 WB_VECTOR는 역시 세대간의 포인터 저장만 대응하는 쓰기 배리어(430)의 트래핑 행동을 정의하기 위해서 적절한 값이 세트된다. 이 방식에 있어서, 수집 시간 스캐닝은 세대간 포인터 저장이 일어나는 카드에 한정될 수 있다. 이러한 실시예에 있어서, 상기 카드 테이블은 전술한 기억 세트 실시예와 대조적으로 중복 제거기능을 제공하는 이점을 가진다.
트레인 알고리즘 기반 수집기(Collector)
허드슨의 트레인 알고리즘(train algorithm)은 세대 시스템의 가장 늙은 세대의 비 분열 수집을 허용하는 것으로 잘 알려져 있다. 가장 늙은 세대내의 상이한 메모리 영역( "cars" )사이에서 참조를 기억하는 것은 쓰기 배리어를 사용하여 작동한다. 하드웨어 프로세서(100)의 실시에 있어서, 이들 "cars" 는 고정된 2의 제곱의 한도로 정렬된, 2의 제곱 크기의 영역으로, 파워 2 사이즈 구역은 파워 2 에 정의된다. 필드 GC_PAGE_MASK는 가베지 수집 알고리즘에 대한 쓰기 배리어(430)의 동작을 정의한다. 만약 프로세서 상태 레지스터 비트 PSR.GCE가 1로 세트되면, 가베지 수집 페이지 경계(필드 GC_PAGE_MASK로 정의된)를 넘는 모든 포인터 저장은 쓰기 배리어(430)가 가베지 수집 트랩 처리기(440)를 트리거하도록 한다. 이러한 실시예에 있어서, 상기 페이지( 'care')크기를 관리하는 트랩 처리기(440)는 레지스터 GC_CONFIG의 필드 GC_PAGE_MASK에 기초하여 프로그램 가능하게정의된다. 상술한 실시예에서, 4KByte에서 8MByte사이의 페이지 영역이 전술한 실시예에 지원된다.
다른 수집기
쓰기 배리어에 종속하는 몇몇 실시간 가베지 수집기가 개발되어 있다. 이들 가베지 수집기의 구현은 쓰기 배리어(430)의 포인터 특유의 특성을 이용할 수 있다. 스틸(Steele)에 의해 제안된 것과 같은 증분 마크-스윕 수집기(Guy L. Steele, Multiprocessing Compactifying Garbage Collection, Communications of the ACM, 18(9)(1975))역시 상기의 포인터 특유의 특성을 이용할 수 있다.
본 발명은 다양한 실시예를 참조하여 설명되었지만, 이들 실시예에 예시적인 것이며, 본 발명의 범위를 한정하는 것은 아니다. 상기 실시예의 다양한 변형, 변경, 추가 및 개선이 가능하다. 예를 들어, 여기서, 본 발명은 JAVA 프로그래밍 언어와 JAVA 가상머신과 관련하여 실시예를 참조하여 기술되었지만 그들에 한정되지 않으며 아주 다양한 프로세서 환경에 대한 시스템, 물품, 방법 및 장치를 포함한다.
또한, 본 발명은 하드웨어, 소프트웨어의 형태로 기술하였지만 가상 머신명령 프로세서의 실행은 세대간 포인터 저장 트랩 매트릭스, 객체 기준 세대 태깅, 세대간 포인터 저장 트랩 매트릭스와 객체 기준 세대 태깅 반응 쓰기 배리어, 가베지 수집 트랩 처리기를 채용하며, 및/또는 적절한 쓰기 배리어 지원으로 포인터 특정 명령과 함께 포인터 비 특정 명령의 선택적인 동적인 치환을 용이하게 할 수 있다. 이들 및 다른 변형, 변경, 추가 및 개선이 본 발명의 기술사상을 벗어나지 않는 범위 내에서 가능하다.

Claims (26)

  1. 동적으로 할당 가능한 기억장치 - 여기서, 상기 기억장치 내부에 형성된 오브젝트(object)는 각각의 오브젝트 참조를 통해 액세스 가능함-와,
    프로그램 가능하게 정의된 가베지 수집 페이지 마스크(garbage collection page mask)와,
    가베지 페이지 경계 횡단 포인터 저장에 대한 쓰기 배리어(write barrier)를 구비하고,
    상기 쓰기 배리어는 그와 관련된 제 1 및 제 2 포인터의 각각의 선택된 부분이 다른 경우 저장 명령을 트랩(trap)하고,
    상기 제 1 포인터는 상기 저장 명령의 타깃 오브젝트를 참조하며,
    상기 제 2 포인터는 그 내부로의 기억을 위한 오브젝트 참조 데이터이고,
    상기 각각의 선택된 부분들은 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크의 내용에 의해 정의되는 것을 특징으로 하는 장치.
  2. 제 1 항에 있어서,
    상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크는 가베지 수집 페이지 크기를 정의하는 것을 특징으로 하는 장치.
  3. 제 1 항에 있어서,
    상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크는 상기 타깃 오브젝트 참조와 상기 오브젝트 참조 데이터의 상기 각각의 선택된 부분의 비교를 위한 비트와이즈 비교 윈도(bitwise comparison window)를 정의하는 것을 특징으로 하는 장치.
  4. 제 1 항에 있어서,
    상기 제 1 및 제 2 포인터 각각은 최상위 부분, 최하위 부분 및 그 사이의 중간 부분을 포함하고,
    상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크는 상기 제 1 및 제 2 포인터의 상기 최상위 부분을 통과하도록 정의된 최상위 부분을 갖는 복합 마스크의 프로그램 가능하게 정의된 중간 부분을 정의하여, 상기 상위 부분 및 중간 부분의 마스크되지 않은 부분이 상기 저장 동작을 트래핑하기 위해 비교되는 것을 특징으로 하는 장치.
  5. 제 1 항에 있어서,
    상기 쓰기 배리어는 상기 가베지 수집 페이지 마스크를 인코딩하는 가베지 수집 페이지 레지스터 필드에 응답하는 비교 로직 및 마스크를 구비하는 것을 특징으로 하는 장치.
  6. 제 1 항에 있어서,
    상기 쓰기 배리어는 포인터 저장 특정 하드웨어 쓰기 배리어(pointer store specific hardware write barrier)를 포함하고, 그의 포인터 저장 특정성은 포인터 비특정 저장 명령의 저장 타깃 필드 타입의 실행-시간 해결에 따라서 포인터 비특정 저장 명령을 포인터 특정 저장 명령으로 치환함으로써 제공되는 것을 특징으로 하는 장치.
  7. 제 1 항에 있어서,
    상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크의 표현을 포함하는 가상 머신 명령 프로세서를 추가로 포함하고,
    상기 쓰기 배리어는 상기 가상 머신 명령 프로세서 상에서 실행 가능한 포인터 특정 저장 명령 코드를 구비하고,
    상기 포인터 특정 저장 명령 코드의 실행은, 상기 타깃 오브젝트 참조와 상기 오브젝트 참조 데이터의 각각의 마스크된 부분의 비트와이즈 비교에 기초하여 상기 포인터 특정 저장 명령 중 하나의 특정 실행이 가베지 수집 페이지 경계 횡단 포인트를 저장할 것이지를 결정하고, 만약 그렇다면 가베지 수집 폴트 핸들러로 트래핑하는 것을 특징으로 하는 장치.
  8. 제 7 항에 있어서,
    상기 가상 머신 명령 프로세서는 하드웨어 프로세서를 포함하고, 가상 머신 명령 중의 적어도 하나의 서브세트는 그것에 의해 직접 실행 가능한 것을 특징으로 하는 장치.
  9. 제 7 항에 있어서,
    상기 가상 머신 명령 프로세서는 하드웨어 프로세서 상에서 실행 가능한, 그의 해석된 실현(interpreted implementation)을 포함하고,
    상기 가베지 수집 페이지 마스크는 상기 하드웨어 프로세서에 액세스 가능한 기억장치 내에 표현되는 것을 특징으로 하는 장치.
  10. 제 7 항에 있어서,
    상기 가상 머신 명령 프로세서는 하드웨어 프로세서 상에서 실행 가능한, 그의 적기 컴파일러(just-in-time compiler) 실현을 포함하고,
    상기 가베지 수집 페이지 마스크는 상기 하드웨어 프로세서에 액세스 가능한 기억장치 내에 표현되는 것을 특징으로 하는 장치.
  11. 제 7 항에 있어서,
    상기 가상 머신 명령 프로세서는 데이터 타입의 실행 시간 해결에 따라서 포인터 비특정 저장 명령 코드를 상기 포인터 특정 저장 명령 코드로 동적으로 치환하고, 이것에 의해 상기 쓰기 배리어를 포인터 저장으로 제한하며, 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크는 상기 쓰기 배리어에 의한 트랩을, 또한 가베지 수집 페이지 경계 횡단 포인터 저장으로 제한하는 것을 특징으로 하는 장치.
  12. 제 1 항에 있어서,
    상기 쓰기 배리어의 실현 및 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크의 표현을 포함하는 가상 머신 명령 프로세서와,
    상기 가상 머신 명령 프로세서에 의해 실행될 수 있는 명령을 포함하는 폴트 핸들러(fault handler)를 추가로 포함하고,
    상기 쓰기 배리어는, 상기 저장 명령의 실행이 가베지 수집 페이지 경계 횡단 포인터 저장을 저장하도록, 타깃 오브젝트와 저장 데이터를 갖는 저장 명령의 실행 시에 상기 폴트 핸들러를 트리거하는 것을 특징으로 하는 장치.
  13. 제 12 항에 있어서,
    상기 폴트 핸들러의 상기 명령은 기억된 세트로의 저장을 위한 명령을 포함하는 것을 특징으로 하는 장치.
  14. 제 12 항에 있어서,
    상기 가상 머신 명령 프로세서에 의해 실행 가능한 명령의 세대 수집기 프로세스(generational collector process)를 추가로 포함하고,
    상기 폴트 핸들러는, 상기 세대 수집기 프로세스에 의해 사용되도록, 기억된 세트 표현에 트랩된 저장 데이터를 식별하는 정보를 저장하기 위하여 상기 가상 머신 명령 프로세스에 의해 실행될 수 있는 명령을 포함하는 것을 특징으로 하는 장치.
  15. 제 1 항에 있어서,
    상기 타깃 오브젝트 참조 및 상기 오브젝트 참조 데이터의 상기 각각의 선택된 부분을 마스킹하고 비교하기 위한 논리 회로를 갖는 실행 유닛 및 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크의 레지스터 표현을 포함하는 하드웨어 프로세서를 추가로 구비하는 것을 특징으로 하는 장치.
  16. 제 1 항에 있어서,
    하드웨어 프로세서 상에서 실행 가능한 소프트웨어 가상 머신 명령 프로세서 프로그램을 추가로 구비하고, 상기 소프트웨어 가상 머신 명령 프로세서 프로그램은 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크를 표현하기 위한 컴퓨터 판독 가능한 기억장치를 정의하고, 상기 타깃 오브젝트 참조 및 상기 오브젝트 참조 데이터의 상기 각각의 선택된 부분을 마스킹하고 비교하기 위한 프로그램 명령을 포함하는 것을 특징으로 하는 장치.
  17. 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 방법에 있어서,
    컴퓨터 판독 가능한 기억장치 내에 가베지 수집 페이지 마스크를 형성하는 단계와,
    포인터 특정 저장 명령의 특정 실행에 관련된 제 1 및 제 2 포인터를 마스킹 하는 단계 - 여기서, 상기 제 1 포인터는 상기 포인터 특정 저장 명령의 타깃 오브젝트 참조 데이터이고, 상기 제 2 포인터는 상기 포인터 특정 저장 명령의 오브젝트 참조 데이터이며, 상기 마스킹은 상기 가이비 수집 페이지 마스크의 내용에 기초함 - 와,
    상기 제 1 및 제 2 포인터의 각각의 마스크되지 않은 부분을 비교하여 상기 제 1 및 제 2 포인터가 각각 동일한 가베지 수집 페이지 상의 각각의 기억장치를 참조하고 있지를 판정하는 단계와,
    상기 비교에 따른 불일치 결과에 기초하여 트랩 처리기를 트리거하는 단계를 포함하는 것을 특징으로 하는 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑 하는 방법.
  18. 제 17 항에 있어서,
    상기 비교에 따른 일치 결과에 기초하여 트래핑 없이 상기 포인터 특정 저장 명령의 상기 특정 실행을 완료하는 단계를 추가로 포함하는 특징으로 하는 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 방법.
  19. 제 17 항에 있어서,
    상기 트랩 처리기의 동작은
    상기 포인터 특정 저장 명령에 대응하는 기억된 세트 엔트리를 저장하는 단계를 포함하는 것을 특징으로 하는 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 방법.
  20. 제 17 항에 있어서,
    상기 트랩 처리기의 동작은
    상기 포인터 특정 저장 명령을 에뮬레이팅하는 단계를 포함하는 것을 특징으로 하는 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 방법.
  21. 제 17 항에 있어서,
    저장 타깃 필드 타입의 실행-시간 결정에 기초하여, 포인터 비특정 명령의 프로그램 출현을, 상기 포인터 특정 명령과 같은 포인터 특정 명령들로 선택적으로 변환하는 단계, 및
    실질적으로 상기 포인터 특정 명령들에 대해서만 마스킹하는 단계 및 비교하는 단계를 수행하는 단계를 추가로 포함하는 것을 특징으로 하는 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 방법.
  22. 가상 머신 명령 프로세서-여기서, 상기 가상 머신 명령 프로세서는 그 위에서 실행 가능한 변형기(mutator) 및 가베지 수집 프로세스를 가짐-에서 가베지 수집 페이지 경계 횡단 포인터 저장을 트래핑하는 아키텍처 지원 장치에 있어서,
    프로그램 가능하게 정의된 가베지 수집 페이지 마스크와,
    상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크에 응답하는 쓰기 배리어 수단을 포함하고,
    (1) 상기 저장 명령이 포인터 저장으로 되고, 또한 (2) 상기 저장 명령의 타깃 메모리 오브젝트 및 상기 저장의 오브젝트 참조 데이터에 의해 식별된 메모리 오브젝트 모두가 동일한 가베지 수집 페이지에 상주하는 경우, 상기 변형기 프로세스의 저장 명령의 평가로 인해 가베지 수집 폴트 처리가가 트리거되고,
    가베지 수집 페이지 경계들은 상기 프로그램 가능하게 정의된 가베지 수집 페이지 마스크에 의해 정의되는 것을 특정으로 하는 아키텍처 지원 장치.
  23. 제 22 항에 있어서,
    상기 쓰기 배리어 수단은 가상 머신 명령 프로세서에 의해 실행 가능한 포인터 특정 저장 명령을 포함하고, 상기 포인터 특정 저장 명령은 상기 쓰기 배리어를 포인터 저장으로 제한하는 것을 특징으로 하는 아키텍처 지원 장치.
  24. 제 23 항에 있어서,
    상기 포인터 특정 저장 명령은 비고속 바이트코드의 고속의 변형인 것을 특징으로 하는 아키텍처 지원 장치.
  25. 제 22 항에 있어서,
    상기 쓰기 배리어 수단은 논리 회로를 포함하고,
    상기 논리 회로는 상기 저장 명령의 특정 실행에 관련된 제 1 및 제 2 포인터의 부분을 효과적으로 마스킹하고, 또한 상기 제 1 및 제 2 포인터의 마스크되지 않은 부분을 비트 단위로 비교하고,
    상기 제 1 포인터는 상기 저장 명령의 상기 타깃 메모리 오브젝트를 식별하며,
    상기 제 2 포인터는 상기 저장 명령의 상기 데이터이고,
    상기 논리 회로는 상기 비교의 상위 결과에 기초하여 트랩 처리기를 트리거 하는 것을 특징으로 하는 아키텍처 지원 장치.
  26. 제 22 항에 있어서,
    상기 쓰기 배리어 수단은 포인터 저장 특정 하드웨어 쓰기 배리어를 포함하고, 그의 포인터 저장 특정성은 상기 포인터 비특정 저장 명령의 저장 타깃 필드 타입의 실행-시간 해결에 따라서 포인트 비특정 저장 명령을 포인터 특정 저장 명령으로 치환함으로써 제공되는 것을 특징으로 하는 아키텍처 지원 장치.
KR1019980710967A 1997-04-23 1998-04-21 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법 KR100576904B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1019980710967A KR100576904B1 (ko) 1997-04-23 1998-04-21 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US8/841,544 1997-04-23
US08/841,544 1997-04-23
KR1019980710967A KR100576904B1 (ko) 1997-04-23 1998-04-21 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법

Publications (2)

Publication Number Publication Date
KR20000022522A KR20000022522A (ko) 2000-04-25
KR100576904B1 true KR100576904B1 (ko) 2006-08-18

Family

ID=41745950

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1019980710967A KR100576904B1 (ko) 1997-04-23 1998-04-21 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법

Country Status (1)

Country Link
KR (1) KR100576904B1 (ko)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112182580B (zh) * 2019-09-19 2024-04-09 中国科学院信息工程研究所 一种基于处理器芯片的内存漏洞检测方法及电子装置

Also Published As

Publication number Publication date
KR20000022522A (ko) 2000-04-25

Similar Documents

Publication Publication Date Title
US6098089A (en) Generation isolation system and method for garbage collection
US5953736A (en) Write barrier system and method including pointer-specific instruction variant replacement mechanism
US5845298A (en) Write barrier system and method for trapping garbage collection page boundary crossing pointer stores
JP3881702B2 (ja) 部分的に再配置されたオブジェクトのソース及び目標インスタンスに関する書込みバリアを含む有界休止時間ガーベッジコレクションシステム及び方法
US5873105A (en) Bounded-pause time garbage collection system and method including write barrier associated with a source instance of a partially relocated object
US5857210A (en) Bounded-pause time garbage collection system and method including read and write barriers associated with an instance of a partially relocated object
Singhal et al. Texas: An efficient, portable persistent store
US6424977B1 (en) Train-algorithm-based garbage collector employing reduced oversized-object threshold
US6185581B1 (en) Train-algorithm-based garbage collector employing fixed-size remembered sets
US6434577B1 (en) Scalable-remembered-set garbage collection
US20020161792A1 (en) Garbage collector employing multiple-car collection sets
US6912553B1 (en) Virtual machine memory management
US7062518B2 (en) Efficiently supporting the existence of long trains in a generation managed by the train algorithm
US7096329B2 (en) Better placement of objects promoted into a generation managed by the train algorithm
KR100576904B1 (ko) 가비지수집페이지경계횡단포인터스토어를트랩하기위한기록배리어시스템및방법
KR100502380B1 (ko) 포인터-고유명령변형교환메카니즘을포함하는쓰기배리어시스템및방법

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment
FPAY Annual fee payment
FPAY Annual fee payment

Payment date: 20170330

Year of fee payment: 12

EXPY Expiration of term