KR20030044902A - 가상 메모리 관리자를 갖지 않는 데이터 처리 장치에서클래스를 프리로딩하는 시스템 및 방법 - Google Patents
가상 메모리 관리자를 갖지 않는 데이터 처리 장치에서클래스를 프리로딩하는 시스템 및 방법 Download PDFInfo
- Publication number
- KR20030044902A KR20030044902A KR1020027011804A KR20027011804A KR20030044902A KR 20030044902 A KR20030044902 A KR 20030044902A KR 1020027011804 A KR1020027011804 A KR 1020027011804A KR 20027011804 A KR20027011804 A KR 20027011804A KR 20030044902 A KR20030044902 A KR 20030044902A
- Authority
- KR
- South Korea
- Prior art keywords
- resource
- resource module
- module
- pointer
- item
- Prior art date
- Legal status (The legal status 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 status listed.)
- Withdrawn
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/54—Link editing before load time
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
- Information Transfer Systems (AREA)
Abstract
오소링 시스템은 가상 메모리 관리자가 없는 클라이언트 장치에 프리로드하기 위한 지정된 클래스의 세트를 준비한다. 오소링 시스템은 지정된 클래스의 세트를 복수의 자원 모듈로 변환하되, 자원 모듈의 서브셋의 각각은 자원 모듈 중의 다른 자원 모듈 내의 아이템에 대한 포인터를 갖는 아이템을 포함한다. 오소링 시스템은 복수의 자원 모듈, 인터프리터 및 시동 프로시져를 포함하는, 클라이언트 장치로 로드하기 위한 로드 모듈을 생성한다. 인터프리터는 클라이언트 장치 상에서 선정된 컴퓨터 언어의 프로그램을 실행하기 위한 것이다. 지정된 클래스의 세트는 선정된 컴퓨터 언어의 메소드를 포함한다. 시동 프로시져는 실행을 위해 인터프리터로의 로드 시에 클라이언트 장치에 의해 실행하기 위한 것이다. 시동 프로시져는 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 자원 모듈 내의 포인터를 갱신된 포인터로 교체한다. 자원 모듈은 클래스 테이블 자원 모듈, 메소드 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀 자원 모듈 및 스트링 자원 모듈을 포함한다. 클래스 데이터 구조는 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 필드 테이블 자원 모듈은 스트링 자원 모듈 내의 아이템을 포함하고, 콘스탄트 풀 자원 모듈은 필드 테이블 자원 모듈 내의 아이템 및 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함한다.
Description
자바 프로그램 또는 실시간 프로그램 링킹(realtime program linking)을 지원하는 다른 객체 지향 언어의 프로그램을 실행하는 컴퓨터 시스템에서, 실행된 컴퓨터 프로그램의 세트는 동적으로 실시간으로 결정되고 로드되며 링크된다. 이것은 극히 유연성있고 특히 원격으로 위치된 컴퓨터로부터 로드되는 소프트웨어의 사용을 용이하게 하지만, 기본적인 데이터 처리 동작을 지원하는데 필요한 기본적인 클래스 파일의 세트의 로딩과 링킹은 시간을 소비할 수 있으며, 특히 그 연산력과 메모리 자원이 전형적인 데스크탑 컴퓨터 보다 훨씬 한정된 작은 클라이언트 장치에서 메모리 자원 면에서 값이 비싸다.
이 문제는 Sun Microsystems Inc.에 양도된 Theron Tock에 의한 미국 특허 제5,815,718호 (1998년 9월 9일 허여)에 의해 해결된다. '718 특허는 극히 제한된 판독/기록 메모리 자원을 갖는 클라이언트 장치용의, 판독 전용 메모리(ROM)에 클래스 파일을 프리로드(preload)하는 것에 특히 초점을 두고 있다. 이와 같은 자원은 ROM을 사용하여 그 소프트웨어의 대부분을 저장한다.
본 발명은 가상 메모리 관리자를 갖지 않는 클라이언트 장치로 클래스 파일을 프리로드하는 것과 관련되지만 다소 다른 문제에 관한 것이다. 본 발명에 의해 해결되는 다른 문제는, 임의의 하나의 데이터 구조의 최대 크기를 제한하는 클라이언트 장치에서 실행될 수 있도록 가상 머신의 데이터 구조 (즉, 자바 프로그램 베리파이어(verifier), 클래스 로더(loader), 인터프리터 및 연관된 보안 프로시져)를 재배열하는 방법이다. 예를 들어, 자원의 최대 크기는 64K 바이트일 수 있다.
본 발명은 총체적으로 자바(Java)와 같은 객체 지향 컴퓨터 언어로 작성된 프로그램을 실행하는 컴퓨터 시스템 및 장치에 관한 것이다.
보다 상세하게, 본 발명은 이와 같은 장치에서 클래스의 세트(set of classes)를 프리로딩(preloading)하는 시스템 및 방법에 관한 것이다.
본 발명의 부수적인 목적 및 특징은 도면을 참조하여 설명된 다음의 상세한 설명 및 첨부하는 특허청구의 범위로부터 명확할 것이다.
도 1은 자바 가상 머신(JVM) 오소링 시스템(authoring system)의 블럭도,
도 2는 JVM이 프리로드된 클래스(preloaded class)의 세트에 따라 실행되는 클라이언트 장치의 블럭도,
도 3은 클라이언트 장치의 메모리 맵도,
도 4는 클라이어트 파일 구조도,
도 5는 클라이언트 장치에서 JVM에 의해 사용하기 위한 프리로드된 클래스의 세트를 발생하기 위한 프로세스의 순서도,
도 6은 네티브 메소드(native method) 테이블 데이터 구조도,
도 7은 또한 자원 모듈의 세트라고 하는 로드 모듈(load module)을 도시하는 도면,
도 8은 자원 모듈에 대한 정보를 저장하는, 콘텐츠 테이블(Table of Contents) 데이터 구조도,
도 9A는 UTF 스트링(string) 테이블 데이터 구조도, 도 9B 및 도 9C는 인턴드 스트링(Interned string) 테이블 데이터 구조도,
도 10 및 11은 클래스 테이블 데이터 구조도,
도 12는 메소드 테이블, 코드 블록 및 예외 테이블 데이트 구조도,
도 13은 필드 테이블 데이터 구조도,
도 14는 콘트탄트 풀(constant pool) 데이터 구조도,
도 15는 0 mod 4 어드레스에 해당하기 위해 자원 내의 제1 데이터 구조의 위치를 조정하기 위한 프로세스의 개념도, 및
도 16A 및 도 16B는 JVM 시동 프로시져의 순서도.
오소링 시스템(authoring system)은 가상 메모리 관리자가 없는 클라이언트 장치에서 프리로딩하기 위한 클래스의 특정 세트를 준비한다. 오소링 시스템은 클래스의 특정 세트를 복수의 자원 모듈로 변환하는데, 자원 모듈의 서브셋의 각각은 자원 모듈중의 다른 모듈에 있는 아이템(item)에 대한 포인터를 갖는 아이템을 포함한다.
오소링 시스템은 복수의 자원 모듈, 인터프리터 및 시동 프로시져(startupprocedure)를 포함하는 클라이언트 시스템에의 로딩을 위한 로드 모듈(load module)을 생성한다. 인터프리터(interpreter)는 클라이언트 장치 상에서 선정된 컴퓨터 언어의 프로그램을 실행하기 위한 것이다. 클래스의 특정 세트는 선정된 컴퓨터 언어의 메소드(method)를 포함한다. 시동 프로시져는 실행을 위해 인터프리터를 로드할 때 클라이언트 장치에 의해 실행하기 위한 것이다. 시동 프로시져는 임의의 특정 클라이언트 장치에서 자원 모듈의 실제 메모리 위치에 따라 자원 모듈 내의 포인터를 갱신된 포인터로 교체한다.
본 발명의 다른 특징은, 데이터 처리 유닛, 사용자 인터페이스, 및 이전에 설명한 자원 모듈, 인터프리터 및 시동 프로시져는 물론 가상 메모리 관리자가 없이 운영 체제를 저장하기 위한 메모리를 갖는 클라이언트 시스템이다.
본 발명의 한 실시예에서, 자원 모듈은 클래스 테이블 자원 모듈, 메소드 테이블 자원 모듈(method table resource module), 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈 및 스트링(string) 자원 모듈을 포함한다. 클래스 데이터 구조는 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈에 대한 포인터를 포함하고, 필드 테이블 자원 모듈은 스트링 자원 모듈에 대한 포인터를 포함하고, 콘스탄트 풀 자원 모듈은 필드 테이블 자원 모듈 내의 아이템 및 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함한다.
본 발명의 다른 실시예에서, 시동 프로시져는 임의의 특정 하나의 클라이언트 장치에서 0 mod 4 어드레스의 서브셋으로 자원 모듈의 적어도 두 개의 각각에서 제1 데이터 구조를 포지셔닝하기(positioning) 위한 명령어를 포함한다.
본 발명의 또 다른 실시예에서, 자원 모듈은 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블을 포함하되, 제2 세브셋은 자원 모듈 내의 포인터 중의 적어도 한 포인터에 의해 가리켜지는 자원 모듈의 서브셋을 포함한다. 시동 프로시져는, (A) 제2 서브셋 내의 자원 모듈의 각각에 대한 현재의 메모리 어드레스를 결정하고, 현재의 메모리 어드레스와 콘텐츠의 테이블에서 가리켜진 메모리 어드레스 간의 차이에 대응하는 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 차이 값에 따라 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함한다.
본 발명의 한 실시예에서, 자원 모듈은 특정 클래스 세트의 메소드를 위한 코드에 대한 포인트를 갖는 메소드 테이블 모듈, 및 메소드 테이블 포인트에서 컴파일된 인터프리터 내의 네티브 메소드(native method)에 대한 포인터의 서브셋을 포함한다.
도 1 및 2를 참조하면, 클라이언트 장치(102), 적어도 하나의 서버컴퓨터(104), 오소링 시스템(authoring system)(106), 및 다양한 클라이언트 장치(102), 서버 컴퓨터(104) 및 오소링 시스템(106)을 접속시키는 하나 이상의 통신 네트워크 또는 접속부(108)를 갖는 분산 컴퓨터 시스템(100)이 도시되어 있다.
클라이언트 장치(102)는 퍼스널 디지털 어씨스턴트(PDA)와 같은 휴대용 장치, 내장 장치, 데스크탑 컴퓨터를 포함하는, 다양한 종류의 컴퓨터 및 컴퓨터 제어 장치를 포함할 수 있다. 서버 컴퓨터(104)는 클라이언트 장치에 의해 액세스될 수 있는 문서 및 다운로드가능 애플릿(downloadable applet)(110)을 저장한다.
컴퓨터 네트워크 또는 접속부(108)는 단순한, 서버와 클라이언트 장치간의 직렬 케이블 또는 적외선 직렬 접속부일 수 있거나 또는 근거리 통신망 또는 인터넷 네트워크 접속부일 수 있다.
바람직한 실시예에서, 클라이언트 장치(102)중의 적어도 일부는 자바 가상 머신(Java virtual machine, JVM)(112)(Sun Microsystems의 상표)이라고 하는 프로그램 인터프리터(program interpreter)를 사용하여 자바(Sun Microsystems의 상표) 언어 프로그램 및 애플릿을 실행하도록 구성된다.
본 실시예에서 JVM(112)은 그 운영 체제의 일부로서 가상 메모리 관리자를 갖지 않으며 임의의 실행 프로그램에 의해 사용될 수 있는 액티브한 메모리의 크기에 대한 크기 제한을 갖는 클라이언트 장치에 의해 실행하기 위해 설계되어 있는 특수한 버전의 자바 가상 머신(소형 장치에 의해 사용하기 위한 것을 가리키는 흔히 "KVM"이라고도 함)이다.
오소링 시스템(106)의 역할은 그 운영 체제의 일부로서 가상 메모리 관리자없이 그리고 임의의 실행 프로그램에 의해 사용될 수 있는 액티브한 메모리의 크기에 대한 크기 제한을 갖는 클라이언트 장치에 사용하기 위한 프리로드된 클래스 파일의 세트를 생성하는 것이다. 본 문서를 읽는 이를 위해, "클라이언트 장치"라는 용어는, 오소링 시스템(106)이 프리로드된 클래스의 세트를 생성하는 클라이언트 장치만을 가리키는데 사용될 것이다. 다른 클라이언트 장치는 본 문서의 주제가 아니다.
또한, 오소링 시스템(106)의 역할은, 자바 프로그램 또는 애플릿을 실행하기 위해 JVM이 로드될 때마다 클라이언트 장치에 의해 실행될 JVM 시동 프로시져(114)를 생성하는 것이다.
JVM 오소링 시스템의 개요
JVM 오소링 시스템(106)은 하나 이상의 처리 유닛(CPU)(120), 사용자 인터페이스(122), 메모리(124), 네트워크(108)를 거쳐 다른 장치와의 통신을 가능하게 하는 네트워크 통신 인터페이스(126), 및 시스템(106)의 다양한 구성요소를 상호접속하기 위한 하나 이상의 내부 버스(128)를 갖는 전형적인 컴퓨터 워크스테이션일 수 있다. 메모리(124)는 전형적으로 고속 랜덤 액세스 메모리(RAM) 및 하드디스크 기억장치와 같은 비휘발성 메모리를 포함한다.
바람직한 실시예에서, 메모리(124)는:
。기본적인 시스템 기능을 수행하는 운영 체제 프로시져(130)의 세트;
。다른 컴퓨터 및 장치(위에 설명된 바와 같이, 이는 단순한 직렬 접속 통신 프로시져일 수 있거나 완전한 네트워크 접속 프로시져일 수 있음)와의 통신을 처리하는 네트워크 액세스 또는 통신 프로시져(132);
。JVM을 위한 소스 코드(136) 및 JVM 시동 프로시져를 위한 소스 코드(138)를 포함하는 프로시져를 위한 소스 코드를 저장하는 소스 코드 저장소(134);
。클래스 파일(142) 및 클래스 라이브러리(144)를 포함하는 자바 언어 프로그램을 저장하기 위한 클래스 필드 저장소(140);
。클라이언트 장치로 클래스 파일의 세트를 로드하기 위한 본 발명의 바람직한 실시예에서 사용되는 툴(tool) 중의 하나이며 C 언어 프로그램을 포함하는 JVM 오프라인 클래스 파일(152)을 생성하는데 사용되는 오프라인 클래스 로더(offline class loader)(150);
。JVM 오프라인 클래스 파일을 실행가능 파일로 컴파일하기 위한 C 컴파일러와 같은 로컬 컴파일러(154);
。그 속성이 이하에 상세히 설명될 자원 파일(158)의 세트를 발생하기 위해 로컬 컴파일러(154)에 의해 발생되는 파일을 실행하기 위한 프로그램 실행기(156);
。클라이언트 장치에 의해 네티브 코드(native code)를 실행하는데 적합한 형식으로 프로그램을 컴파일하기 위한 클라이언트 장치 컴파일러(160);
。클라이언트 장치(102)로 로드하기 위한 로드 모듈(162), 로드 모듈은 프리로드된 클래스 파일의 세트를 표현하는 자원 파일의 세트를 포함함;
。클라이언트 장치에 의해 실행하기 위한 컴파일된 JVM 프로그램(164); 및
。클라이언트 장치에 의해 실행하기 위한 컴파일된 JVM 시동 프로그램(166)
를 저장한다.
위에 언급된 많은 파일 및 프로그램의 기원, 기능 및 구조는 "프리로드된 클래스 파일을 생성하기 위한 프로세스"라는 제목의 본 문서의 절에서 이하에 상세히 설명될 것이다.
클라이언트 장치의 개요
클라이언트 장치(102)는 예를 들어, 3COM(Palm Division에 의해 제조된 Palm(3COM 상표) 장치 및 PalmOS 운영 체제를 이용한 다른 장치와 같은 휴대용 퍼스널 디지털 어씨스턴트(PDA)일 수 있다. 제공된 메모리의 양이 다른 몇 가지 버젼의 Palm이 존재할 때, 본 발명에 설명된 Palm의 기본적인 특징 및 제한은 2000년 1/4분기의 본 제조 라인의 모든 버전에 적용 가능하다.
클라이언트 장치(102)는 전형적으로 데이터 처리 유닛(CPU)(220), 사용자 인터페이스(222), 메모리(224), 네트워크 또는 다른 통신 매체(108)를 거쳐 다른 장치(즉, 서버(104)와의 통신을 가능하게 하는 네트워크 또는 직렬 또는 IR 통신 인터페이스와 같은 통신 인터페이스(226), 및 클라이언트 장치(102)의 다양한 구성요소를 상호 접속시키기 위한 하나 이상의 내부 버스(228)를 가질 것이다. 메모리(224)는 전형적으로 고속 동적 랜덤 액세스 메모리(DRAM) 및/또는 정적 랜덤 액세스 메모리를 포함한다.
바람직한 실시예에서, 메모리(224)는
。기본적인 시스템 기능을 수행하는 운영 체제 프로시져(즉, PalmOS)(230)의 세트;
。다른 컴퓨터 및 장치와의 통신을 처리하는 네트워크 액세스프로시져(232);
。JVM 오소링 시스템에 의해 발생되는 로드 모듈(162);
。클라이언트 장치의 네티브 코드(native code)로 컴파일되는 프로그램인 자바 가상 머신(JVM)(112);
。실행을 위한 JVM을 준비하고 클라이언트 장치 내의 가상 메모리 관리자의 부족을 교정하는데 사용되는 JVM 시동 프로그램(114);
。클래스 증명 및 로드 단계를 거칠 필요 없이 JVM에 의해 실행하기 위한 준비되는 프리로드된 클래스 파일을 표현하는 JVM 자원(234);
。서버(104)로부터 다운로드된 클래스 파일(242)를 포함하는, 자바 언어 프로그램을 저장하기 위한 클래스 저장소(240);
。자바 언어로 작성된 게임 프로그램 또는 다른 종류의 프로그램을 실행하기 위한 것과 같은 JVM(112)를 호출하는 어플리케이션(252);
。어드레스 북 어플리케이션, 캘린더 어플리케이션 등과 같은 다른 어플리케이션 프로그램(254);
。JVM(112), JVM 시동 프로시져(114) 및 어플리케이션 프로그램(252, 254)을 실행하기 위한 프로그램 실행기(256); 및
。데이터 파일(270)
을 저장한다.
어플리케이션(252)은 전형적으로 JVM 및 JVM 자원을 포함하는 로드 모듈의 일부가 아니다. 즉, JVM을 호출하는 어플리케이션(252)은 전형적으로 개별적으로클라이언트 장치로 로드된다.
어플리케이션(252)은 일부 실시예에서, 서버(104)와 같은 원격으로 위치된 컴퓨터로부터 그리고 메모리(224) 내의 HTML 문서 저장소(260)에 저장된 HTML 문서(262)를 다운로드하기 위한 명령어를 포함하는 브라우저 어플리케이션일 수 있다. 브라우저는 전형적으로 클라이언트 장치의 네티브 코드로 컴파일되는 어플리케이션이지만, 대체 실시예에서 브라우저는 로드 모듈(162) 내의 프리로드된 클래스에 포함된 자바 바이트코드 프로그램(byecode program)으로서 구현될 수 있다. 다운로드된 문서는 JVM(112)에 의해 실행가능한 애플릿에 대한 참조(즉, HTML 오브젝트 태그 또는 애플릿 태그)가 내장된 문서를 포함할 수 있고, 브라우저 어플리케이션은 애플릿 또는 내부의 애플릿을 실행하므로써 발생되는 임의의 이미지를 포함하는, 문서를 사용자 인터페이스(22) 내의 디스플레이스에 디스플레이하기 위한 명령어를 포함한다.
프리로드된 클래스 파일을 생성하기 위한 프로세스
도 3은 클라이언트 장치의 메모리 맵을 도시한다. 도시된 바와 같이, 장치의 메모리의 제1 부분(280)은 운영 체제를 위해 제공된다. 장치 내의 PalmOS의 버전에 따라 Palm에서 64K 바이트 내지 256K 바이트 범위의 크기를 갖는 제2 부분(282)은 액티브 메모리(active memory)(또는 선택적으로 동적 메모리)라고 하며, 어플리케이션 프로그램을 실행하는데 사용된다. 정적 메모리라고 하는 장치의 메모리의 나머지 부분(284)은 파일, 데이터베이스 테이블 및 인액티브 어플리케이션(inactive application)을 저장하는 사용된다. 메모리의 다양한 부분(280, 282,284)에 대한 어드레스 범위는 도 3에 도시된 것과 다를 수 있다. 예를 들어, 운영 체제 부분(280)은 도 3에 도시된 바와 같이 메모리 내의 최하위 어드레스 대신에 최상위 어드레스에 위치될 수 있다. 어플리케이션 프로그램을 위한 코드는 정상적으로 어플리케이션의 실행 동안 정적 메모리(284)(하나 이상의 코드 자원으로서)에 남고, 액티브 메모리(282)는 흔히 어플리케이션에 의해 사용되는 변수 및 임시 데이터 구조를 저장하는데 사용된다.
PalmOS는 두 가지 종류의 데이터베이스: 레코드 데이터베이스(record database) 및 자원 데이터베이스(resource database)를 지원한다. 어드레스 북 어플리케이션(address book application)을 위한 어드레스를 저장하는데 사용되는 데이터베이스와 같은 레코드 데이터베이스에서, 각각의 데이터베이스 엔트리는 하나의 레코드이다. 어플리케이션 및 라이브러리는 자원 데이터베이스의 예이다. 각각의 레코드 및 각각의 자원은 PalmOS에서 64K 바이트 크기에 한정된다. 다른 한편, PalmOS에 저장될 "파일"은 다수의 레코드 및 자원을 포함할 수 있고, 그 크기는 64K 바이트를 초과할 수 있다.
도 4는 자바 클래스 파일(142)의 주요 구성요소가 헤더(292), 콘스탄트 풀(constant pool)(294), 메소드의 세트(296)(클래스의 실행가능 프로시져를 구성함), 및 예외 테이블(298)(임의의 예상치 못한 조건이 발생할 때 실행될 코드를 가리킴)라는 것을 도시한다.
도 5는 프리로드된 클래스 파일을 생성하기 위한 프로세스(300)의 단계를 개략적으로 도시한다. 프리로드된 클래스 파일은 일단 클라이언트 장치 상에 설치되면 검증 및 로딩을 수행할 필요 없이 클라이언트 장치 내의 JVM에 의한 임시 실행에 이용가능하다. 클래스 파일의 세트를 프리로드하므로써, 프리로드된 클래스들이 클라이언트 장치의 정적 메모리에 거의 전적으로 저장되기 때문에, 클라이언트 장치 내의 JVM의 시동 시간이 크게 감소되고, JVM의 액티브(또는 동적이라고도 함) 메모리 조건이 크게 감소된다.
오소링 시스템에 의해 반드시 수행될 필요가 없는 예비 단계로서, 각 클래스의 메소드를 위한 자바 소스 코드(302)가 자바 컴파일러(304)에 의해 클래스 파일(142)로 컴파일된다. "컴파일러"(304)는, 결과로 나타나는 코드가 특정 프로세서를 위한 오브젝트 코드가 아니지만, 오브젝트 클래스의 메소드를 함께 형성하는 메소드라고 하는 자바 바이트코드 프로그램을 구성한다는 점에서 종래의 컴파일러와는 다르다. 자바 컴파일러 및 자바 클래스 파일들은 공지되어 있고, 극히 광범위하게 사용되며, 따라서 자세히 설명되지 않을 것이다. 언급될 필요가 있는 것은, 가상 머신으로 프리로드된 기본적인 클래스 세트는 본 발명의 개발 훨씬 이전에 잘 수립되어 있고, 다라서 프리로드될 클래스 파일(142)의 세트는 오소링 시스템 보다는 소스로부터 얻어질 수 있다는 것이다.
오프라인 클래스 로더(150)는 클래스 파일(142)의 세트를 취하고, 실행될 때 클라이언트 장치로의 로딩을 위해 (자원 모듈이라고 하는) 그로부터 파일(158)의 세트를 구축하는 C 언어 프로그램(152)을 발생한다. 물론, 프로그램(152)은 자바, 파스칼 및 C++을 포함하는 임의의 수의 다른 언어로 작성될 수 있고, 따라서 프로그램(152)에 사용된 특정 컴퓨터 언어는 중요하지 않다. 특히, 프로그램을 단지직접 생성하는 대신에 프로그램(152)를 사용하여 파일(158)을 구축하는 이유는, 손으로 연산하기가 힘들 뿐 아니라 그 값이 클래스 파일(142) 또는 파일(158) 내의 데이터 구조에 맞도록 임의의 시간에 변할 수 있는 수 천 개의 포인터를 파일(158)이 포함하기 때문이다. 예를 들어, 만일 새로운 최적화가 실행되어 클라이언트 장치에 의해 실행될 때 파일(158) 내의 데이터 구조에 의해 표현되는 메소드를 보다 효율적으로 하면, 많은 또는 모든 포인터들이 재연산될 필요가 있을 것이다. 프로그램 문장에 맞게 포인터를 만듦으로써, 프로그램(152)을 컴파일하는데 사용되는 컴파일러(154)에 의해 모든 포인터 값들이 자동적으로 해결된다.
프로그램(152)의 내용 및 구조는 프로그램(152)에 의해 발생되는 자원 파일(158)의 내용 및 구조를 설명하므로써 간접적으로 설명될 것이다. 극히 넓은 정도로, 프로그램(152)은, 프리로드된 클래스의 세트에 포함될 클래스 파일의 각각에 대한 정보를 포함하는 데이터 구조 문장의 세트로 구성된다. 많은 데이터 구조 문장 내의 엘리먼트는 다른 데이터 구조의 엘리먼트에 대한 참조를 포함하고, 이는 컴파일러(154)에 의해 포인터로 리졸브(resloved)되는 이들 참조이다.
컴파일러는 프로그램(152)을, JVM 오프라인 클래스 파일이라고 하는 프로그램으로 컴파일한다. 프로그램 실행기는 자원 모듈(158)로서 식별되는 파일의 세트를 만드는 JVM 오프라인 클래스 파일(156)을 실행한다. 자원 모듈(158)은, 파일의 수가 특정 중요도를 가지고 있지 않기 때문에 하나 이상의 파일에 저장될 수 있다. 그러나, 논리적으로, 자원 모듈은 각각이 개별적으로 논의되고 실제로 클라이언트 장치 내의 개별적인 자원으로서 저장될 몇 개의 구별되는 모듈을 포함한다.
다음에, 클라이언트 장치를 위한 컴파일러(160)는 클라이언트 장치로 로드될 프로그램 및 데이터 구조를 생성하기 위해 프로그램(136, 312)의 몇 가지 세트를 컴파일하는데 사용된다. 한 실시예에서, 컴파일러(160)는, 클라이언트 장치에 의해 실행가능한 네티브 오브젝트 코드를 생성하는 클라이언트 장치를 위한 C 언어 컴파일러이다. 컴파일될 프로그램은, 서브프로그램의 세트가 많은 다른 서브프로그램은 물론, 프로그램 베리파이어(program verifier), 클래스 로더, 프로그램 인터프리터를 포함하는 자바 가상 머신을 위한 코드(136)를 포함한다. 자바 가상 머신을 위한 코드(136)는 또한 50개 세트 또는 네티브 오브젝트 코드를 사용하여 클라이언트 장치에 의해 실행되어야 하는 입력/출력 연산과 같은 하드웨어 특정 연산을 수행하기 위한 "네티브 메소드"를 포함한다.
컴파일러(160)에 의해 컴파일되는 다른 프로그램은, JVM이 실행되려 할 때 자원 모듈의 현재 위치를 결정하고, 메모리 내의 적절한 위치를 가리키도록 자원 모듈 내의 모든 포인터를 리졸브하고 갱신하는 특수한 프로그램인 JVM 시동 프로시져(138)이다. 자원 모듈이 저장되는 물리적 메모리 위치는 JVM의 한 실행에서 다음 실행으로 변할 수 있고, 클라이언트 장치가 가상 메모리 관리자를 가지고 있지 않기 때문에, JVM 시동 프로시져(138)는 자원 모듈의 현재 위치를 고려하기 위해 자원 모듈 내의 모든 절대 어드레스 포인터를 갱신하는데 사용된다.
컴파일러(160)에 의해 컴파일되는 또 다른 데이터 구조는 네티브 메소드 테이블이라고 하는 데이터 구조를 정의하는 프로그램(132)이다. 네티브 메소드 테이블 프로그램(312)은 오프라인 클래스 로더(150)에 의해 만들어지고, 하나의 열이이하에 설명된 메소드 테이블 데이터 구조에의 오프셋을 가리키고, 다른 열이 클라이언트 장치의 메모리 내의 대응하는 네티브 메소드의 메모리 위치를 가리키는 두 개의 열을 갖는 데이터 구조(320)(도 6)로 구성된다. 컴파일러(160)는 네티브 메소드의 위치를 리졸브하고, 개별적으로 컴파일되는 프로그램으로서 취급되는 결과로 나타나는 네티브 메소드 테이블(320)(도 6)에 이들을 저장한다. 보다 상세하게, 네티브 메소드 테이블(320)은 JVM 코드 자원(132)의 세트와 연관된 "데이터 자원"(168) 내의 컴파일러(160)에 의해 포함되고, 데이터 자원(168)은 컴파일된 JVM 및 시동 프로시져에 의해 사용되는 모든 변수이다.
자원 모듈(158)은 컴파일러(160)에 의해 컴파일되지 않는다. 그 보다는, 이들이 컴파일러(160)의 일부인 링커(linker)를 사용하기 때문에 컴파일러(160)에 의해 발생되는 모듈에 이들이 "포함된다". 컴파일러(160)에 의해 발생된 모듈은 클라이언트 장치를 위한 (기본적으로 자원 모듈(158)로 구성된) 로드 모듈(162), JVM을 위한 모든 컴파일된 코드(164) 및 JVM 시동 프로시져를 위한 컴파일된 코드(166)를 함께 포함하는 JVM 코드 자원의 세트(163), 및컴 파일된 네티브 메소드 테이블(320)을 포함하는 연관된 JVM 데이터 자원(168)을 포함한다. JVM 프로그램은, JVM 프로그램의 전체 크기가 자원에 다한 크기 제한을 초과하기 때문에 복수의 코드 자원(각각은 크기가 64K 바이트 미만임)으로 분할된다.
자원 모듈 및 키 데이터 구조
도 7, 8, 9A-9C 및 10-15를 참조하면,자원 모듈(162, 158)의 내용 및 구조가 다음에 설명될 것이다. 클라이언트 장치의 자원 크기 제한(즉 64K 바이트) 미만의크기를 각각 갖는 주 자원 모듈은:
。다른 모듈의 클라이언트 메모리 위치를 추적하는데 사용되는 콘텐츠 테이블(350);
。자바 스트링 오브젝트를 저장하기 위한 인턴드 스트링 테이블(Interned string table)(352);
。가변 길이 스트링(UTF 스트링)을 저장하기 위한 UTF 스트링 테이블(354);
。프리로드된 클래스에 대한 정보를 저장하기 위한 클래스 테이블(356);
。프리로드된 클래스의 메소드에 대한 정보를 저장하기 위한 메소드 테이블(358);
。프리로드된 클래스의 필드에 대한 정보를 스트링(string)하기 위한 필드 테이블(360);
。프리로드된 클래스의 메소드에 의해 사용되는 필드, 메소드 및 인턴드 스트링에 대한 포인터는 물론 일정한 수치 값을 저장하기 위한 콘트탄트 풀(constant pool)(362);
。프리로드된 클래스의 메소드와 연관된 예외 핸들러(exception handler)에 대한 정보를 저장하기 위한 핸들러 테이블(364);
。프리로드된 자바 클래스의 각각에 의해 구현되는 인터페이스에 대한 정보를 저장하기 위한 인터페이스 테이블(366);
。프리로드된 클래스의 예외 핸들러 및 메소드의 바이트코드를 저장하기 위한 코드 모듈(368); 및
。오브젝트당 인스턴스에 기초하여 할당되는 변수에 반대되는, 클래스에 기초하여 할당되는 변수의 값을 저장하기 위한 정적 데이터 테이블(370).
이하의 상세한 설명으로부터 명확한 바와 같이, 모든 자원 모듈들이 모듈의 다른 모듈 내의 아이템에 대한 포인터를 갖지 않는다. 예를 들어, 코드 자원(368), 핸들러 테이블 자원(364), 및 인터페이스 테이블 자원(366)은 내부에 어떠한 자원도 가지고 있지 않다. 클래스 테이블 자원(356), 메소드 테이블 자원(358)은 포인터를 갖지 않는 자원의 예이다. 더욱이, 콘텐츠 테이블 자원 이외의 모든 모듈들은 모듈중의 다른 모듈 내의 포인터의 타겟인 아이템을 가지며, 심지어 콘텐츠 테이블은 자신에 대한 포인터를 포함하도록 셋업될 수 있다.
정적 데이터 테이블(370)은 실제로 클라이언트 장치에 로드될 필요가 없는 위치 홀더(place holder)이다. 그 보다는, 정적 데이터 테이블은 JVM의 실행 동안 클라이언트 장치의 액티브한 메모리에서 생성되고 저장된다. 그러나, 정적 데이터 테이블은, 다른 모듈들이 정적 데이터 테이블(370)의 다양한 필드(즉 엔트리)에 대한 포인터를 포함하기 때문에, 적어도 그 초기 생성 동안 로드 모듈에 포함된다. 정적 데이터 테이블 내의 아이템에 대한 포인터는 다른 자원에 대한 포인터와 동일한 방법으로 시동 프로시져에 의한 재배치 또는 갱신을 필요로 한다. 클라이언트 장치의 액티브한 메모리 내의 정적 데이터 테이블의 위치가 한 실행에서 다음 실행으로 변할 수 있기 때문에, 정적 데이터 테이블 내의 아이템에 대한 포인터는, JVM 시동 프로시져가 실행될 마다 갱신되어야 한다.
도 8에 도시된 콘텐츠(35)의 테이블은 자원 모듈 각각의 메모리 위치 및 크기를 저장하는데 사용된다. 초기에, 어드레스 위치는, 예를 들어 로드 모듈 내의 그 위치에 기초하여 임의의 세트의 값이다. JVM 시동 프로시져가 클라이언트 장치에 의해 실행될 마다, 콘텐츠 테이블 내의 어드레스는 클라이언트 장치의 메모리 내에서 그 자원의 현재 위치를 가리키도록 갱신된다. 이 프로시져는 이하에 상세히 설명될 것이다. 바람직한 실시예에서, 콘텐츠 테이블(350)은 또한, 클래스 테이블 자원(356) 내의 클래스 테이블에 대한 포인터, java.lang.Object라고 하는 클래스에 대한 클래스 블록(최상위 레벨 클래스), 도 9A, 9B 및 10에 도시된 해시 테이블(hash table), 및 다른 키 데이터 구조(key data structure)를 포함하는 "키 값(key values)"의 세트를 저장한다.
도 9A에 도시된 바와 같이, UTF 스트링 테이블(354)은 해시 테이블을 사용하여 구현된다. 해시 테이블은 스트링이 대응하는 해시 함수(JVM에 의해 포함됨)에 의해 맵핑되는 많은 "버킷(bucket)"을 포함한다. 해시 테이블은 테이블 내의 버킷의 수를 가리키는 길이 값(380), 테이블 내의 UTF 스트링(386)의 수를 가리키는 카운트 값(382), 버킷(384)의 세트를 포함하는 헤더를 구비한다. 각각의 버킷(384)은 제로 이상의 UTF 스트링(386)의 링크된 리스트(linked list)에 대한 포인터를 포함한다. 각각의 UTF 스트링(386)은 다음 UTF 스트링에 대한 포인터(390), 스트링에서 바이트의 수로 측정된 길이를 가리키는 길이 필드(392), 스트링 자체를 저장하는 바이트 필드(394)를 포함한다.
인턴드 스트링 테이블(Interned sting table)(352)은 UTF 스트링 테이블(354)와 구조가 유사하다. 특히, 인턴드 스트링 테이블(352)은 도 9B에 도시된 바와 같이 해시 테이블을 사용하여 구현된다. 해시 테이블은, 스트링 오브젝트가 (JVM에 포함되는) 대응하는 해시 함수에 의해 맵핑되는 많은 "버킷"을 포함한다. 해시 테이블은, 테이블 내의 버킷의 수를 가리키는 길이 값(400), 테이블 내의 스트링 오브젝트(408)의 수를 가리키는 카운트 값(402), 및 버킷(404)의 세트를 포함하는 헤더를 구비한다. 각각의 버킷(404)은 제로 이상의 셀(cell)(406)의 링크된 리스트에 대한 포인터를 포함한다. 각 버킷 내의 포인터는, 만일 존재한다면 링크된 리스트 내의 첫 번째 셀(406)을 가리킨다. 각각의 셀(406)은 스트링 오브젝트(408)에 대한 포인트(또는 보다 정확하게 타입 "java.lang.String"의 오브젝트)는 물론 다음 셀에 대한 포인터를 포함한다. 도 9C에 도시된 바와 같이, 스트링 오브젝트(408)는 전형적으로 클래스 "java.lang.String"에 대한 포인터(410), 타입 char□의 오브젝트의 인스턴스(instance)에 대한 포인터, 문자의 어레이에의 오프셋(414), 및 현재 오브젝트에 대한 스트링의 길이의 표시기(416)을 포함한다. 문자(420)의 어레이는, 어레이 내의 각각의 이와 같은 스트링의 위치가 각각의 스트링 오브젝트의 오프셋 및 길이 필드(414, 416)에 의해 가리켜진 채 스트링 오브젝트의 모든 스트링을 저장한다. 공간을 절약하기 위해, char□ 오브젝트 인스턴스(418)만이 저장되고, 모든 스트링 오브젝트는 char□ 오브젝트(418)의 동일한 하나의 인스턴스를 가리킨다.
도 10에 도시된 바와 같이, 클래스 테이블은 클래스 버킷(424)의 링크된 리스트를 가리키는 많은 버킷(422)을 갖는 다른 해시 테이블(hash table)이다. 이 테이블은 테이블 내의 버킷의 수를 가리키는 길이 필드(425), 및 테이블 내의 클래스블록의 수를 가리키는 카운트 필드(426)를 포함한다.
각각의 클래스 블록(424)은 도 11에 도시된 바와 같이;
。만일 존재한다면, 다음 클래스 블록에 대한 포인터(430);
。클래스 블록에 연관된 클래스 명에 대한 포인터(432), 클래스 명은 이 포인터에 저장된 어드레스에 있는 UTF 스트링에 저장됨;
。클래스 블록에 연관된 클래스의 슈퍼클래스에 대한 클래스 블록에 대한 포인터(434);
。클래스 블록에 연관된 클래스의 메소드를 가리키는 메소드 테이블(450)에 대한 포인터(436);
。클래스 블록에 연관된 클래스의 필드를 정의하는 필드 테이블(500)에 대한 포인터(436); 및
。클래스 블록에 연관된 클래스에 대한 콘스탄트 풀 테이블(510)에 대한 포인터(438)
를 포함한다.
메소드 테이블 자원(358)은 "C"가 로드 모듈 내의 클래스의 수인 "C" 메소드 테이블(450)(도 7 및 12 참조)의 세트을 저장한다. 각각의 클래스 블록(426)은 메소드 테이블(450)중의 하나를 가리킨다. 유사하게, 필드 테이블 자원(360)은 "C" 필드 테이블(500)(도 13)의 세트를 저장하고, 콘스탄트 풀 자원(362)은 콘스탄트 풀 테이블(520)(도 14)의 세트를 저장하고, 핸들러 테이블 자원(364)은 예외 테이블(454)(도 12)의 세트를 저장하고, 코드 자원(368)은 코드 블록(452)(도 12)의 세트를 저장한다.
각각의 메소드 테이블(450)은, 연관된 클래스의 각 메소드에 대해 한 메소드 블록인 메소드 블록(460)의 세트를 포함한다. 테이블은, 테이블 내의 메소드 블록의 수를 가리키는 카운트 필드(462), 및 테이블의 크기를 가리키는 길이 필드(464)를 포함한다. 각각의 메소드 블록은 본 설명에 무관한 다른 정보를 물론, 코드 블록(452)에 대한 포인터(466), 및 예외 테이블(454)에 대한 다른 포인터(468)를 포함한다.
각각의 코드 블록(452)은, 바람직한 실시예에서 자바 언어 바이트코드 프로그램(즉 메소드)인 실행가능한 프로그램(또한 코드 또는 실행가능 명령어라고 함)을 포함한다.
각각의 예외 테이블(454)은 대응하는 메소드에 의해 지정된 각각의 예외 핸들러에 대한 하나의 예외 핸들러 엔트리(480)를 포함한다. 카운트 필드(482)는 예외 핸들러 엔트리의 수를 가리키고, 각각의 엔트리(480)는 특정 핸들러가 적용가능한 메소드 내의 코드 범위(즉, 첫 번째 및 최종 바이트코드), 메소드에 대한 코드 블록 내의 예외 핸들러의 위치를가리키는 오프셋 값 및 예외 핸들러가 사용될 예외의 종류를 가리킨다.
도 13에 도시된 바와 같이, 필드 테이블 자원의 각 필드 테이블(500)은 필드 엔트리(502)의 세트를 포함한다. 각각의 필드 엔트리(502)는 오프셋 또는 포인터, 필드의 데이터 종류, 및 필드의 명칭을 포함하는 UTF 스트링에 대한 포인터를 포함한다. 필드 엔트리에 대응하는 필드가 연관된 클래스(오브젝트 종류)의 모든 오브젝트에 포함된 "오브젝트당 인스턴스(per-object instance)" 필드일 때, 필드 엔트리를 오프셋을 포함하고, 오프셋은 연관된 클래스의 각 오브젝트 내의 대응하는 필드의 위치를 가리킨다. 한편, 필드 엔트리에 대응하는 필드가 정적 데이터 어레이에 저장된 "클래스당 한번(once per-class)" 변수를 표현할 때, 필드 엔트리는 오프셋 값 대신에 정적 데이터 어레이 내의 엔트리에 대한 포인터를 포함한다. 필드 테이블(500)은 또한 테이블 내의 필드 엔트리(502)의 수를 가리키는 길이 필드(504)를 포함한다.
도 14에 도시된 바와 같이, 특정 클래스에 대한 콘스탄트 풀(520)은 풀 내의 아이템의 수를 가리키는 크기 필드(size field)(522)를 갖는다. 풀 내의 각각의 아이템은 1 바이트 태그와 4 바이트 태그로서 표현된다. 태그(524)는 어드레싱 경계 조건을 충족시키기 위해 하나의 어레이 및 아이템에 저장된다. 각각의 태그(524)는 콘스탄트의 데이터 종류를 가리키는 한편, 대응하는 아이템(526)은 필드 테이블(500) 내의 필드 엔트리(502), 메소드에 대한 포인터(즉, 메소드 테이블(450) 내의 메소드 블록(460)에 대한 포인터), UTF 스트링 테이블(354) 내의 UTF 스트링에 대한 포인터 또는 수치 값(즉, 정수 또는 부동 소수값)이다. 태그(524)에 의해 지정된 데이터 종류는, 아이템(526)이 포인터의 종류는 물론 수치 값 또는 포인터를 포함하는 지를 명시한다.
클라이언트 장치에서 자바 가상 머신을 초기화하고 동작시키는 프로세스
도 15를 참조하면, 자원 모듈의 각각은 그 끝에 널 정보(null information)의 2 바이트를 포함한다. 그 이유는 다음과 같다. 각 모듈의 메모리 위치는 JVM이 실행하지 않을 때 변할 수 있다. 즉, 클라이언트 장치는 다양한 이유로 메모리 내에 자원을 재배치할 수 있다. 이에 따른 문제는, 클라이언트 장치가 0 mod 4 어드레스(즉, 4로 균일하게 나눌 수 있는 어드레스)인 위치에 자원을 저장할 수 있다는 것이다. 보다 상세히, 자원의 시작 어드레스는 2 mod 4 어드레스일 수 있다. 그러나, JVM은 0 mod 4인 위치에 저장되는 임의의 데이터 구조에 의존한다. 이 문제는 (A) 각 자원 모듈의 시작 또는 끝에 널 정보의 2 바이트를 저장하고, (B)JVM의 시작시, JVM 자원 모듈의 위치를 록킹(locking)하고, (C) 자원 모듈 내의 비-널(non-null) 정보의 첫 번째 바이트가 0 mod 4 어드레스에 위치되도록, 필요할 때마다 각각의 자원 모듈의 시작 또는 끝으로 이들 2 바이트를 회전시키므로써 해결된다. 만일 자원 모듈이 2 mod 4 어드레스(및 여기서 전면으로 이동한 그 널 바이트를 갖는)에 이전에 저장된 다음에 0 mod 4 어드레스에 저장되면, 널 바이트는 자원 모듈의 앞에서 뒤로 이동될 필요가 있을 것이다.
자원 모듈 내의 널 바이트가 뒤에서 앞으로 이동할 때마다, 콘텐츠 테이블(350)에 저장된 대응하는 위치 값이 2씩 감소되고, 자원 모듈 내의 널 바이트가 앞에서 뒤로 이동할 때마다, 콘텐츠 테이블(350)에 저장된 대응하는 위치 값이 2씩 증가된다. 콘텐츠 테이블에 대한 이와 같은 조정은 자원 모듈 내의 포인터의 후속 수정이 보자 정확하게 수행되게 한다.
도 16A 및 16B를 참조하면, JVM 시동 프로시져의 실행 이전에, JVM, 시동 프로시져 및 자원 모듈은, 장치의 메모리에 저장된다는 것을 의미하는 클라이언트 장치(540) 상에 설치되어야 한다.
JVM이 클라이언트 장치에 의해 실행될 때마다, 그 실행 이전에 JVM 시동 프로시져의 실행이 온다(542). 시동 프로시져의 완료 시에, JVM이 실행되고(544), JVM의 실행의 완료 시에, 시동 프로시져에 의해 록(locked)된 모든 JVM 자원들이 언록(unlocked)된다(546).
시동 프로시져는 실제로, 본 발명에서 JVM 코드 자원이라고 하는 JVM과 동일한 코드 자원의 일부이고, 더욱이 JVM은 본 발명에서 JVM 데이터 자원이라고 하는 "데이터 자원"을 포함한다. JVM 데이터 자원은, 네티브 메소드 테이블을 포함한 JVM 내의 모든 변수를 표현한다. JVM 시동 프로시져가 실행되려 할 때, PalmOS는 JVM 데이터 자원을 액티브한 메모리에 자동적으로 복사한다(550). 즉, Palm 장치에 의해 실행될 임의의 프로그램의 경우, PalmOS는 대응하는 데이터 자원을 액티브한 메모리에 자동적으로 복사한다.
더욱이, 액티브한 메모리로 데이터 자원을 이동시키면서, PalmOS는 연관된 코드 자원(들) 내의 정확한 위치를 가리키기 위해 데이터 자원 내의 포인터를 자동적으로 갱신한다. 결국, 액티브한 메모리 내의 네티브 메소드 테이블의 사본이 자동적으로 PalmOS에 의해 갱신되어, JVM 코드 자원 내의 네티브 코드 메소드에 대한 갱신된 포인트를 포함하게 된다.
시동 프로시져는 콘텐츠 테이블의 작업 사본(working copy)을 생성한다(551). 도 8에 도시된 바와 같이, 콘텐츠 테이블의 작업 사본은 자원 모듈의 각각의 이전 및 현재 위치간의 차이를 저장하기 위한 "Δ위치" 열을 포함한다.
더욱이, JVM의 실행이 완료된 후에, 자원이 언록될 때까지 메모리 내의 그 위치가 변경되지 않도록 JVM에 의해 사용된 자원의 각각을 록한다. 다음에 프로시져는 각각의 JVM 자원 모듈 내의 널 정보의 2 바이트의 위치를 조정하지만, 만일 0 mod 4 어드레스에서 이와 같은 각각의 자원 내의 첫 번째 비-널(non-null) 데이터를 위치시킬 필요가 있을 때에만, 이에 대응하여 콘텐츠 테이블에 레코드된 모듈의 시작 어드레스를 조정한다(551).
프리로드된 클래스와 연관된 수정가능한 클래스당 변수의 어레이(정적 데이터 어레이 또는 정적 데이터 테이블이라고 함)가 액티브한 메모리에 수립된다(552). 이 어레이의 위치가 주지되고 포인터 조정 단계 동안 사용된다(556) .
다음에, 시작 프로시져는 JVM 자원의 현재 시작 위치를 결정하고, 콘텐츠 테이블에 표시된 바와 같이 이를 이전 시작 위치와 비교하고, JVM 자원 모듈의 각각에 대해 현재 및 이전 위치 간의 차이와 같은, Δ위치 값을 생성한다(554). 만일 JVM의 최종 실행이후 JVM 자원 모듈의 어떤 것도 이동되지 않았다는 것을 가리키는, 모든 Δ위치 값이 제로이면, 이때 단계(556)(포인터 조정)에서 수행된 작업의 대부분이 스킵된다. 이 자원이 JVM의 각 실행에 따라 재생되더라도, 정적 데이터 어레이는 콘텐츠 테이블에서 행이 존재하는 "자원"중의 하나라는 것을 알아야 한다. 한 실행에서 다음 실행까지의 정적 데이터 어레이의 위치 변경은 필드 테이블 자원에서 정적 데이터 어레이 내의 엔트리에 대한 포인터를 갱신하는데 사용된다(556).
JVM 자원의 시작 위치의 변경에 기초하여 JVM 자원 내의 포인터를 조정하는 단계(556)은, 가상 메모리 관리자 없는 장치에서 JVM이 실행되게 하는 단계이다. 포인터의 조정은 다음과 같이 달성된다. UTF 스트링 테이블(354) 및 인턴드 스트링 테이블(352)의 경우, 이들 테이블 내의 포인터의 값들은 이들 테이블의 각각에 대한 위치의 변경과 같은 양만큼 조정된다. 예를 들어, 만일 UTF 스트링 테이블(354)가 +1024 바이트만큼 이동되었다면, 이때 이 테이블 내의 모든 포인터들이 1024만큼 증가된다. 인턴드 스트링 테이블(352) 내에서, java.lang.String에 대한 포인터(410)는 클래스 테이블 자원에 대한 Δ위치와 동일한 양만큼 조정된다.
클래스 테이블(356), 메소드 테이블(450), 필드 테이블(500) 및 콘스탄트 풀(520) 내에서, 각각의 포인터는 적당한 자원 내의 위치를 가리키는 지가 점검되고, (B) 해당 자원에 대한 Δ위치만큼 조정된다. 조정될 포인터의 세트는 클래스 테이블의 모든 클래스 블록을 추적하고, JVM 자원 내의 모든 메소드 테이블, 필드 테이블 및 콘스탄트 풀을 위치시키기 위해 내부의 포인트를 따라가고 그들 각각의 포인터를 조정하므로써 찾을 수 있다.
필드 테이블 자원만이 정적 데이터 어레이 내의 아이템에 대한 포인터를 포함한다. 이들 포인터는 JVM의 이전 실행에서 JVM의 현재 실행까지 정적 데이터 어레이의 위치(만일 존재하면)의 변경에 따라 갱신된다. 바람직한 실시예에서, JVM시동 프로시져(단계 554)는 정적 데이터 어레이 이외의 모든 자원에 대한 Δ위치 값을 점검하고, 모든 Δ위치 값들이 제로와 같을 때 "고속(fast)" 갱신 프로세스로 스위치한다. 고속 갱신 프로세스에서, 정적 데이터 어레이를 가리키는 필드 테이블 자원 내의 포인터들만이 단계(556)에서 갱신된다.
메소드 테이블 내에서 네티브 메소드에 대한 포인터는 네티브 메소드 테이블에 저장된 값을 사용하여 단계(558)에서 개별적으로 갱신된다. 위에서 설명한 바와 같이, 네티브 메소드 테이블 내의 포인터들은 단계(550)에서 자바 코드 자원 내의 네티브 메소드의 현재 위치를 가리키도록 갱신된다. 네티브 메소드 테이블은 메소드 테이블 자원에의 오프셋 및 네티브 메소드에 대한 포인터를 포함하는, 각각의 네티브 메소드에 대해 하나의 행을 포함한다. 단계(558)에서, 네티브 메소드 테이블(320)의 각 행의 경우, 행 내의 포인터는 해당 행 내의 오프셋 값에 의해 가리켜진 메소드 테이블 자원 내의 위치로 복사된다. 단계(558)는, 콘텐츠 테이블에 주지된 모든 자원들에 대한 Δ위치 값들이 제로와 같을 때에도 수행된다.
클라이언트 장치가 Palm 장치인 바람직한 실시예에서, 비록 JVM 자원이 클라이언트 장치의 "정적 메모리"에 저장되었지만, 그와 같은 자원의 내용은 적당한 운영 체제 명령을 사용하여 오버라이트(overwrite)될 수 있다는 것을 알아야 한다. 비록 정적 메모리에의 새로운 값을 기록이 특수한 운영 체제 명령의 사용을 필요로 하고 클라이언트 장치의 액티브한 메모리(282)(도 3)에의 정상적인 기록보다 많은 시간을 소비하지만, 포인터 조정 프로세스는 JVM 시동 프로시져의 각 실행 동안 한번만 수행된다.
바람직한 실시예에서, 포인터 갱신은 JVM 자원의 작업 사본에서 수행된다. 가능한 이들 작업 사본은 액티브한 메모리에 저장되지만, 액티브한 메모리의 양의 제한은 정적 메모리에 저장될 작업 사본의 적어도 일부를 강제한다. 작업 사본은내부에 포인터를 갖지 않는 JVM 자원으로 이루어진다. 단계(600)에서, 콘텐츠 테이블은 그 시작 어드레스에 각 자원에 대한 Δ위치를 부가하므로써 완료된다. 다음에, 작업 사본이 존재하는 각각의 JVM 자원의 경우, JVM 자원은 그 작업 사본으로 교체된다. 시동 프로시져의 맨 끝까지 콘텐츠 테이블 및 다른 JVM 자원이 변경되지 않은 이유는, 만일 시동 프로시져가 중간 프로세스에서 중단되려 한다면 콘텐츠 테이블의 내용 및 JVM 자원이 내부적으로 불일치할 것이고 이때 시동 프로시져의 중간으로부터 복구하기 위해 JVM 자원 내의 모든 포인터를 적절히 조정하는 것이 불가능하기 때문이다. 다른 말로 하면, 끝 부분까지 콘텐츠 테이블 및 다른 JVM 자원을 변경되지 않게 하는 것은, JVM 자원의 내용이 내부적으로 불일치하는 동안의 시간 양을 최소화시킨다. 이는, 시동 프로시져가 시동 프로세스의 파괴 또는 다른 중단으로부터 복구할 수 있는 가능성을 크게 증가시킨다.
시동 프로세스가 완료된 후에, JVM이 실행된다(544, 도 16A). 다음에 JVM은 하나의 애플릿을 실행할 수 있거나 또는 그 자신의 실행이 중지되기 전에 자바 프로그램을 실행할 수 있다. JVM의 실행이 완료될 때, JVM 자원이 언록(unlocked)되어, 운영체제로 하여금 그 내부 유지 정책에 따라 메모리 내의 새로운 위치로 이동시키게 한다.
대체 실시예
본 발명은 컴퓨터 판독가능 기억 매체에 내장된 컴퓨터 프로그램 메커니즘을 포함하는 컴퓨터 프로그램 제품으로서 구현될 수 있다. 예를 들어, 컴퓨터 프로그램 제품은 도 1 및 2에 도시된 프로그램 모듈을 포함할 수 있다. 이들 프로그램모듈들은 CD-ROM, 자기 디스크 기억제품 또는 임의의 다른 컴퓨터 판독가능 데이터 또는 프로그램 기억 제품에 기억될 수 있다. 컴퓨터 프로그램 제품 내의 소프트웨어 모듈은 또한 반송파 상으로 컴퓨터 데이터 신호(소프트웨어 모듈이 내장되어 있는)를 전송하므로써 인터넷 또는 다른 매체를 통해 전자적으로 배포될 수 있다.
비록 본 발명이 몇몇 특정 실시예를 참조로 설명되었지만, 이 설명은 본 발명의 예시일 뿐이며 본 발명을 제한하는 것으로 간주되어서는 않된다. 기술분야의 숙련자에게는 첨부하는 특허청구의 범위에 정의된 본 발명의 참된 의도 및 범위를 일탈하지 않고 다양한 수정이 발생할 수 있다.
Claims (32)
- 가상 메모리 관리자(virtual memory manager)가 없는 클라이언트 장치에서 프리로드(preloading)하기 위해 클래스의 특정 세트를 준비하는 방법에 있어서,상기 특정 클래스의 세트를 복수의 자원 모듈(resource modules)로 변환하는 단계 - 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;상기 클라이언트 장치에 의한 실행을 위해 컴파일된 인터프리터(complied interpreter)를 제공하는 단계 - 상기 인터프리터는 선정된 컴퓨터 언어의 프로그램을 실행하기 위한 것이고, 상기 특정 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드(methods)를 포함함-;실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행될 컴파일된 시동 프로시져(compiled startup procedure)를 제공하는 단계 - 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체함;- 및상기 클라이언트 장치에의 로딩을 위한 로드 모듈(load module)을 생성하는 단계 - 상기 로드 모듈은 복수의 자원 모듈, 컴파일된 인터프리터 및 컴파일된 시동 프로시져를 포함함-를 포함하는 것을 특징으로 하는 방법.
- 제1항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class table resource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되, 상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 방법.
- 제1항에 있어서, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치에 따라 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키기 위한 명령어를 포함하는 것을 특징으로 하는 방법.
- 제1항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)을 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에 대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스간의 차이에 대응하는 상기 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 것을 특징으로 하는 방법.
- 제1항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 방법.
- 컴퓨터 시스템과 결합하여 사용하며, 컴퓨터 판독가능 기억 매체 및 내부에 내장된 컴퓨터 프로그램 매커니즘을 구비하는 컴퓨터 프로그램 제품에 있어서,상기 특정 클래스의 세트를 복수의 자원 모듈(resource modules)로 변환하기 위한 클래스 프리로더(class preloader) - 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;및컴파일된 인터프리터를 생성하기 위해, 가상 메모리 관리자가 없는 클라이언트 장치에 의한 실행을 위해 인터프리터를 컴파일하기 위한 컴파일러 - 상기 인터프리터는 선정된 컴퓨터 언어의 프로그램을 실행하기 위한 것이고, 상기 특정 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드(methods)를 포함함-;를 구비하되,상기 컴파일러는 또한 컴파일된 시동 프로시져를 생성하기 위해, 실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행될 시동 프로시져(startup procedure)를 컴파일하되, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체하고,상기 컴파일러는 또한 상기 클라이언트 장치에의 로딩을 위해 로드 모듈(load module)을 생성하되, 상기 로드 모듈은 복수의 자원 모듈, 상기 컴파일된 인터프리터 및 상기 컴파일된 시동 프로시져를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제6항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class table resource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되,상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제6항에 있어서, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치에 따라 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제6항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)을 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에 대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스 간의 차이에 대응하는 상기 제2서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제6항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 가상 메모리 관리자가 없는 클라이언트 장치에서 프리로드라기 위한 특정 클래스의 세트를 준비하는 컴퓨터 시스템에 있어서,데이터 처리 유닛;특정 클래스의 세트, 인터프리터, 및 시동 프로시져를 저장하기 위한 메모리;상기 데이터 처리 유닛에 의해 실행되고, 상기 특정 클래스의 세트를 복수의 자원 모듈(resource modules)로 변환하기 위한 클래스 프리로더(class preloader) - 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-; 및상기 데이터 처리 유닛에 의해 실행되고, 컴파일된 인터프리터를 생성하기 위해 가상 메모리 관리자가 없는 클라이언트 장치에 의한 실행을 위해 인터프리터를 컴파일하기 위한 컴파일러 - 상기 인터프리터는 선정된 컴퓨터 언어의 프로그램을 실행하기 위한 것이고, 상기 특정 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드(methods)를 포함함-;를 구비하되,상기 컴파일러는 또한 컴파일된 시동 프로시져를 생성하기 위해, 실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행될 시동 프로시져(startup procedure)를 컴파일하되, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체하고,상기 컴파일러는 또한 상기 클라이언트 장치에의 로딩을 위해 로드 모듈(load module)을 생성하되, 상기 로드 모듈은 복수의 자원 모듈, 상기 컴파일된 인터프리터 및 상기 컴파일된 시동 프로시져를 포함하는 것을 특징으로 하는 컴퓨터 시스템.
- 제11항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class tableresource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되, 상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 컴퓨터 시스템.
- 제11항에 있어서, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치에 따라 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 시스템.
- 제11항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)을 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스 간의 차이에 대응하는 상기 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 시스템.
- 제11항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 컴퓨터 시스템.
- 가상 메모리 관리자(virtual memory manager)가 없는 클라이언트 장치를 동작시키는 방법에 있어서,상기 클라이언트 장치 내의 메모리에 복수의 자원 모듈을 저장하는 단계 - 상기 복수의 자원 모듈은 클래스의 세트를 표현하고, 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;인터프리터를 사용하여 선정된 컴퓨터 언어의 프로그램을 실행하는 단계 - 상기 프로그램은 상기 클래스의 세트에 메소드를 포함함-; 및상기 인터프리터의 로드시 그리고 상기 인터프리터를 사용하여 프로그램을 실행하기 전에, 상기 클라이언트 장치 내의 상기 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체하기 위해 시동 프로시져를 실행하는 단계를 포함하는 것을 특징으로 하는 방법.
- 제16항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class table resource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되, 상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 방법.
- 제16항에 있어서, 상기 시동 프로시져를 실행하는 것은, 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키는 것을 포함하는 것을 특징으로 하는 방법.
- 제16항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)를 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에 대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스 간의 차이에 대응하는 상기 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 것을 특징으로 하는 방법.
- 제16항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 방법.
- 컴퓨터 시스템과 결합하여 사용하며, 컴퓨터 판독가능 기억 매체 및 내부에 내장된 컴퓨터 프로그램 매커니즘을 구비하는 컴퓨터 프로그램 제품에 있어서,가상 메모리 관리자가 없는 클라이언트 장치로의 로딩을 위한 로드 모듈을 구비하되,상기 로드 모듈은,클래스의 세트를 표현하는 복수의 자원 모듈 - 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;선정된 컴퓨터 언어의 프로그램을 실행하기 위한 인터프리터 - 상기 지정된 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드를 포함함-; 및실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행될 시동 프로시져(startup procedure) - 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체함-를 구비하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제21항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class tableresource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되, 상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제21항에 있어서, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치에 따라 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제21항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)을 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스 간의 차이에 대응하는 상기 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 제21항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 컴퓨터 프로그램 제품.
- 클라이언트 장치에 있어서,데이터 처리 유닛; 및메모리를 구비하되,상기 메모리는,가상 메모리 관리자가 없는 운영 체제;복수의 자원 모듈 - 상기 복수의 자원 모듈은 클래스의 서브셋을 표현하고,상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;상기 데이터 처리 유닛에 의해 실행가능한 인터프리터 - 상기 인터프리터는 선정된 컴퓨터 언어의 프로그램을 실행하고, 상기 지정된 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드를 포함함-; 및상기 데이터 처리 유닛에 의해 실행가능하며, 실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행하기 위한 시동 프로시져(startup procedure) - 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체함-를 저장하기 위한 것을 특징으로 하는 클라이언트 장치.
- 제26항에 있어서, 상기 자원 모듈은 클래스 테이블 자원 모듈(class table resource module), 메소드(method) 테이블 자원 모듈, 필드 테이블 자원 모듈, 콘스탄트 풀(constant pool) 자원 모듈, 및 스트링(string) 자원 모듈을 포함하되, 상기 클래스 데이터 구조는 상기 메소드 테이블, 필드 테이블 및 콘스탄트 풀 자원 모듈들 내의 아이템에 대한 포인터를 포함하고, 상기 필드 테이블 자원 모듈은 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하고, 상기 콘스탄트 풀 자원 모듈은 상기 필드 테이블 자원 모듈 내의 아이템 및 상기 스트링 자원 모듈 내의 아이템에 대한 포인터를 포함하는 것을 특징으로 하는 클라이언트 장치.
- 제26항에 있어서, 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치에 따라 0 mod 4 어드레스로 상기 서브셋 내의 자원 모듈 중 적어도 두 개의 각각에 제1 데이터 구조를 위치시키기 위한 명령어를 포함하는 것을 특징으로 하는 클라이언트 장치.
- 제26항에 있어서, 상기 자원 모듈은 상기 자원 모듈의 제2 서브셋의 각각에 대한 메모리 어드레스를 가리키는 콘텐츠의 테이블(table of contents)을 포함하되, 상기 제2 서브셋은 상기 자원 모듈 내의 포인터 중의 적어도 하나에 의해 가리켜진 상기 자원 모듈의 서브셋들을 포함하고,상기 시동 프로시져는 (A) 상기 제2 서브셋 내의 상기 자원 모듈의 각각에 대한 현재의 메모리 어드레스를 결정하고, 상기 현재의 메모리 어드레스와 상기 콘텐츠의 테이블에서 가리켜진 상기 메모리 어드레스 간의 차이에 대응하는 상기 제2 서브셋 내의 각각의 자원 모듈에 대한 차이 값을 결정하고, (B) 상기 차이 값에 따라 상기 자원 모듈 내의 포인터의 적어도 한 서브셋을 조정하기 위한 명령어를 포함하는 클라이언트 장치.
- 제26항에 있어서, 상기 자원 모듈은, 상기 특정 클래스의 세트의 메소드를 위한 코드에 대한 포인터를 갖는 메소드 테이블 모듈(method table module)을 포함하되, 상기 메소드 테이블 내의 포인터들의 서브셋은 상기 컴파일된 인터프리터 내의 네티브 메소드(native method)를 가리키는 것을 특징으로 하는 클라이언트 장치.
- 제26항에 있어서,상기 클라이언트 장치는 디스플레이를 구비하고,상기 메모리는,상기 클라이언트 장치에 의해 실행가능하고, 원격으로 위치된 컴퓨터 문서로부터 로드하며, 상기 인터프리터에 의해 실행가능한 애플릿에 대한 참조를 내부에 내장하고 있는 문서를 포함하며, 상기 문서 및 상기 애플릿을 실행하므로써 생성된 이미지를 상기 디스플레이 상에 디스플레이하기 위한 브라우저 어플리케이션을 더 저장하는 것을 특징으로 하는 클라이언트 장치.
- 반송파에 내장된 컴퓨터 데이터 신호에 있어서,가상 메모리 관리자없는 클라이언트 장치에의 로드를 위한 로드 모듈(loadmodule)을 구비하되,상기 로드 모듈은,복수의 자원 모듈 - 상기 복수의 자원 모듈은 클래스의 서브셋을 표현하고, 상기 자원 모듈의 서브셋의 각각은 상기 자원 모듈 중의 다른 자원 모듈 내의 아이템(item)에 대한 포인터를 갖는 아이템을 포함하고, 상기 각각의 포인터는 포인트되는 아이템의 메모리 어드레스를 지정함-;선정된 컴퓨터 언어의 프로그램을 실행하기 위한 인터프리터 - 특정 클래스의 세트는 상기 선정된 컴퓨터 언어의 메소드를 포함함-; 및실행을 위해 상기 인터프리터를 로드할 때 상기 클라이언트 장치에 의해 실행될 시동 프로시져(startup procedure) - 상기 시동 프로시져는 상기 임의의 특정 클라이언트 장치 내의 자원 모듈의 실제 메모리 위치에 따라 상기 자원 모듈 내의 포인터를 갱신된 포인터로 교체함- 를 포함하는 것을 특징으로 하는 컴퓨터 데이터 신호.
Applications Claiming Priority (3)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US09/522,268 US6745386B1 (en) | 2000-03-09 | 2000-03-09 | System and method for preloading classes in a data processing device that does not have a virtual memory manager |
| US09/522,268 | 2000-03-09 | ||
| PCT/US2001/007497 WO2001067236A2 (en) | 2000-03-09 | 2001-03-08 | System and method for preloading classes in a data processing device that does not have a virtual memory manager |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| KR20030044902A true KR20030044902A (ko) | 2003-06-09 |
Family
ID=24080171
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| KR1020027011804A Withdrawn KR20030044902A (ko) | 2000-03-09 | 2001-03-08 | 가상 메모리 관리자를 갖지 않는 데이터 처리 장치에서클래스를 프리로딩하는 시스템 및 방법 |
Country Status (11)
| Country | Link |
|---|---|
| US (1) | US6745386B1 (ko) |
| EP (1) | EP1269309B1 (ko) |
| JP (1) | JP2003526154A (ko) |
| KR (1) | KR20030044902A (ko) |
| CN (1) | CN1218245C (ko) |
| AT (1) | ATE268023T1 (ko) |
| AU (2) | AU4202801A (ko) |
| CA (1) | CA2402298A1 (ko) |
| DE (1) | DE60103521T2 (ko) |
| RU (1) | RU2002126996A (ko) |
| WO (1) | WO2001067236A2 (ko) |
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR100790053B1 (ko) * | 2006-06-05 | 2008-01-02 | 주식회사 대우일렉트로닉스 | 마스터 장치의 번들 처리 장치 및 방법 |
Families Citing this family (22)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US6324685B1 (en) | 1998-03-18 | 2001-11-27 | Becomm Corporation | Applet server that provides applets in various forms |
| GB9921720D0 (en) * | 1999-09-14 | 1999-11-17 | Tao Group Ltd | Loading object-oriented computer programs |
| US6745386B1 (en) | 2000-03-09 | 2004-06-01 | Sun Microsystems, Inc. | System and method for preloading classes in a data processing device that does not have a virtual memory manager |
| BRPI0209761B1 (pt) * | 2001-05-30 | 2018-04-03 | Blackberry Limited | Sistema de tempo de execução de dispositivo de comunicação móvel para executar uma aplicação, método de manusear um módulo ligado ao principal em um sistema alvo e produto de programa de computador |
| US8205193B2 (en) * | 2001-06-11 | 2012-06-19 | Hewlett-Packard Development Company, L.P. | Runtime updating of virtual machine class files |
| JP2004152279A (ja) * | 2002-10-08 | 2004-05-27 | Matsushita Electric Ind Co Ltd | プログラム更新方法および端末装置 |
| CN100365570C (zh) * | 2003-12-18 | 2008-01-30 | 中国电子科技集团公司第三十研究所 | 运用于dsp的动态加载方法 |
| KR100654428B1 (ko) * | 2004-01-14 | 2006-12-06 | 삼성전자주식회사 | 자바 프로그램의 처리 속도를 향상시키는 시스템 및 그 방법 |
| US7406687B1 (en) * | 2004-03-17 | 2008-07-29 | Sun Microsystems, Inc. | Sharing runtime representation of software component methods across component loaders |
| US7356811B2 (en) * | 2004-07-08 | 2008-04-08 | International Business Machines Corporation | Method and apparatus for referencing a constant pool in a java virtual machine |
| CN100442233C (zh) * | 2007-01-31 | 2008-12-10 | 华为技术有限公司 | 实现应用系统动态升级的方法及系统 |
| US9305238B2 (en) * | 2008-08-29 | 2016-04-05 | Oracle International Corporation | Framework for supporting regular expression-based pattern matching in data streams |
| US8799357B2 (en) * | 2010-11-08 | 2014-08-05 | Sony Corporation | Methods and systems for use in providing a remote user interface |
| KR20130020050A (ko) * | 2011-08-18 | 2013-02-27 | 삼성전자주식회사 | 로컬리티 센서티브 해시의 버킷 구간 관리 장치 및 그 방법 |
| US9507613B2 (en) * | 2012-03-30 | 2016-11-29 | Oracle International Corporation | Methods and apparatus for dynamically preloading classes |
| US8997075B2 (en) * | 2013-07-23 | 2015-03-31 | Red Hat, Inc. | System and method for dynamic class management |
| US9274769B1 (en) * | 2014-09-05 | 2016-03-01 | International Business Machines Corporation | Table of contents pointer value save and restore placeholder positioning |
| US10394528B2 (en) | 2016-03-30 | 2019-08-27 | Oracle International Corporation | Returning a runtime type loaded from an archive in a module system |
| US10191753B2 (en) | 2016-03-30 | 2019-01-29 | Oracle International Corporation | Generating verification metadata and verifying a runtime type based on verification metadata |
| CN108228694B (zh) * | 2017-06-30 | 2024-10-22 | 勤智数码科技股份有限公司 | 基于细化数据项的目录生成方法 |
| US10866806B2 (en) * | 2017-11-14 | 2020-12-15 | Nvidia Corporation | Uniform register file for improved resource utilization |
| CN114519582B (zh) * | 2022-02-21 | 2024-08-09 | 中国邮政储蓄银行股份有限公司 | 服务的预热方法、预热装置和服务系统 |
Family Cites Families (9)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5548759A (en) * | 1994-07-05 | 1996-08-20 | Microsoft Corporation | System for storing executable code within a resource data section of an executable file |
| US5692047A (en) * | 1995-12-08 | 1997-11-25 | Sun Microsystems, Inc. | System and method for executing verifiable programs with facility for using non-verifiable programs from trusted sources |
| US5727147A (en) * | 1995-12-08 | 1998-03-10 | Sun Microsystems, Inc. | System and method for resolving symbolic references to externally located program files |
| US5815718A (en) * | 1996-05-30 | 1998-09-29 | Sun Microsystems, Inc. | Method and system for loading classes in read-only memory |
| US5946487A (en) * | 1996-06-10 | 1999-08-31 | Lsi Logic Corporation | Object-oriented multi-media architecture |
| US5966702A (en) | 1997-10-31 | 1999-10-12 | Sun Microsystems, Inc. | Method and apparatus for pre-processing and packaging class files |
| US6349344B1 (en) | 1997-12-16 | 2002-02-19 | Microsoft Corporation | Combining multiple java class files into a run-time image |
| FR2775805B1 (fr) | 1998-03-05 | 2001-10-12 | Alsthom Cge Alkatel | Procede et architecture logicielle pour la transmission d'objets au sein d'un environnement distribue, conservant les references entre objets |
| US6745386B1 (en) | 2000-03-09 | 2004-06-01 | Sun Microsystems, Inc. | System and method for preloading classes in a data processing device that does not have a virtual memory manager |
-
2000
- 2000-03-09 US US09/522,268 patent/US6745386B1/en not_active Expired - Lifetime
-
2001
- 2001-03-08 RU RU2002126996/09A patent/RU2002126996A/ru not_active Application Discontinuation
- 2001-03-08 AU AU4202801A patent/AU4202801A/xx active Pending
- 2001-03-08 AT AT01913356T patent/ATE268023T1/de not_active IP Right Cessation
- 2001-03-08 KR KR1020027011804A patent/KR20030044902A/ko not_active Withdrawn
- 2001-03-08 DE DE60103521T patent/DE60103521T2/de not_active Expired - Lifetime
- 2001-03-08 WO PCT/US2001/007497 patent/WO2001067236A2/en not_active Ceased
- 2001-03-08 CN CN018092608A patent/CN1218245C/zh not_active Expired - Lifetime
- 2001-03-08 CA CA002402298A patent/CA2402298A1/en not_active Abandoned
- 2001-03-08 AU AU2001242028A patent/AU2001242028B2/en not_active Expired - Fee Related
- 2001-03-08 JP JP2001564991A patent/JP2003526154A/ja active Pending
- 2001-03-08 EP EP01913356A patent/EP1269309B1/en not_active Expired - Lifetime
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR100790053B1 (ko) * | 2006-06-05 | 2008-01-02 | 주식회사 대우일렉트로닉스 | 마스터 장치의 번들 처리 장치 및 방법 |
Also Published As
| Publication number | Publication date |
|---|---|
| ATE268023T1 (de) | 2004-06-15 |
| EP1269309B1 (en) | 2004-05-26 |
| CA2402298A1 (en) | 2001-09-13 |
| WO2001067236A2 (en) | 2001-09-13 |
| RU2002126996A (ru) | 2004-03-10 |
| CN1427968A (zh) | 2003-07-02 |
| AU4202801A (en) | 2001-09-17 |
| AU2001242028B2 (en) | 2005-05-26 |
| WO2001067236A3 (en) | 2002-05-30 |
| DE60103521D1 (de) | 2004-07-01 |
| US6745386B1 (en) | 2004-06-01 |
| CN1218245C (zh) | 2005-09-07 |
| JP2003526154A (ja) | 2003-09-02 |
| DE60103521T2 (de) | 2005-06-23 |
| EP1269309A2 (en) | 2003-01-02 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| EP1269309B1 (en) | Preloading of classes in a data processing device that does not have a virtual memory manager | |
| AU2001242028A1 (en) | System and method for preloading classes in a data processing device that does not have a virtual memory manager | |
| US8261244B2 (en) | Arbitrary runtime function call tracing | |
| CA2255042C (en) | Class loader | |
| JP4372348B2 (ja) | マルチプル・クラスファイルのランタイムイメージへの結合 | |
| JP3550151B2 (ja) | ロード・リンキング装置および方法 | |
| EP1098247B1 (en) | A method and system for loading classes in read-only memory | |
| US6826750B1 (en) | Method of automatically selecting program and data updates based upon versions | |
| US7225438B2 (en) | Lazy compilation of template-generated classes in dynamic compilation execution environments | |
| EP0861467B1 (en) | An object oriented programming based global registry system and method | |
| AU712005B2 (en) | System and method for runtime optimization of private variable function calls in a secure interpreter | |
| US9411617B2 (en) | System and method for matching synthetically generated inner classes and methods | |
| CA2255035C (en) | Archiving tool | |
| US20040015935A1 (en) | Techniques for loading class files into virtual machines | |
| US5062039A (en) | Sharing of workspaces in interactive processing using workspace name tables for linking of workspaces | |
| US20080022265A1 (en) | Methods, systems, and computer program products for generating and using object modules | |
| US6996813B1 (en) | Frameworks for loading and execution of object-based programs | |
| US6901591B1 (en) | Frameworks for invoking methods in virtual machines | |
| US20060248523A1 (en) | Annotation management | |
| US5963955A (en) | Bridge for exporting and importing objects between object oriented programming environments | |
| US6934726B2 (en) | Storing and retrieving of field descriptors in Java computing environments | |
| US6658647B1 (en) | Access to resource files stored in ROM | |
| EP1405180A2 (en) | Methods and apparatus for numeric constant value inlining in virtual machines | |
| JPS63626A (ja) | プログラム管理装置 | |
| CN1222874C (zh) | 动态链接的电脑系统中扩增程序功能的方法 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PA0105 | International application |
Patent event date: 20020909 Patent event code: PA01051R01D Comment text: International Patent Application |
|
| PG1501 | Laying open of application | ||
| PC1203 | Withdrawal of no request for examination | ||
| WITN | Application deemed withdrawn, e.g. because no request for examination was filed or no examination fee was paid |