200 likes | 301 Views
Kaffe-1.0.b1-rt の問題点について. 慶應義塾大学 SFC 研究所 喜多山卓郎. Kaffe-1.0.b1. JDK1.1 AWT サポート ThreadInterface, LockInterface, GarbageCollectorInterface. -rt の構造. Class Libraries. java.lang/io/net/util. java.awt.packages. Code-Verifier. Class Magagement. Execution-Engine (JIT, Interpreter).
E N D
Kaffe-1.0.b1-rt の問題点について 慶應義塾大学 SFC研究所 喜多山卓郎
Kaffe-1.0.b1 • JDK1.1 • AWTサポート • ThreadInterface, LockInterface, GarbageCollectorInterface
-rtの構造 Class Libraries java.lang/io/net/util... java.awt.packages Code-Verifier Class Magagement Execution-Engine (JIT, Interpreter) Virtual Machine System Call subsystem Thread subsystem (K/U) Heap(GC) subsystem Native lfc subsystem (JNI, KNI) RT-Thread Subsystem (RT-Mach) Native Libraries Native core library Native AWT library Kaffe-1.0.b1の構造
Kaffe-1.0.b1-rt Real-Time Java Threads Deadline Handler Real-Time Java VM Kernel Threads RT-Scheduler, RT-Sync RT-Mach
Thread Interface typedef struct ThreadInterface { void (*init)(int nativestacksize); void (*createFirst)(Hjava_lang_Thread*); void (*create)(Hjava_lang_Thread*, void*); void (*sleep)(jlong); void (*yield)(void); void (*setPriority)(Hjava_lang_Thread*, jint); void (*stop)(Hjava_lang_Thread*); void (*exit)(void); bool (*alive)(Hjava_lang_Thread*); jint (*frames)(Hjava_lang_Thread*); void (*finalize)(Hjava_lang_Thread*); Hjava_lang_Thread* (*currentJava)(void); void* (*currentNative)(void); void (*GcWalkThreads)(void); void (*GcWalkThread)(Hjava_lang_Thread*); void* (*nextFrame)(void*); } ThreadInterface;
Thread Interface(Cont’d) • Real-Time 拡張部分 typedef struct ThreadInterface { : : void (*rtCreate)(Hkaffe_rt_RtThread*, void*); void (*setRtAttr)(Hkaffe_rt_RtThread*); bool (*isPeriodic)(Hkaffe_rt_RtThread*); void (*handlerCreate)(Hkaffe_rt_RtHandler*, void*); void (*handlerWait)(Hkaffe_rt_RtHandler*, Hkaffe_rt_RtThread**, char**); } ThreadInterface;
Lock Interface typedef struct LockInterface { void (*init)(iLock*); void (*lock)(iLock*); void (*unlock)(iLock*); void (*wait)(iLock*, jlong); void (*signal)(iLock*); void (*broadcast)(iLock*); void (*spinon)(void*); void (*spinoff)(void*); } LockInterface;
Java thread Real-Time Java thread class MyThread extends Thread{ … public void run(){…} … } … MyThread th = MyThread(..); th.start(); class MyRtThread extends RtThread{ … public void run(){…} … } … MyRtThread rth = MyRtThread(pri, start, period, deadline); rth.start(); Application Interface - Real-Time Thread
Application Interface - Deadline Handler class MyHandler extends RtHandler{ public void Handler(RtThread Th){ //deadline detected //some recovery method } } … MyHandler handler = new MyHandler(); … rth.setHandler(handler, “Handler”);
Library • Klasses.jar • classes.zip の置き換え • pizza.jar • コンパイラ
Problems in Thread Support • いい加減 !! • “Deprecated()” • stop(), suspend(), resume() • Deadline Handler の中で resume() できない!!
Problems and Overhead • JITのオーバヘッド • Interpreterのオーバヘッド • Interpreterにはバグがある。javacが動かない。
‘System.out.Println(HelloWorld)’ • ダイナミックJavaステップ 615 • メソッド数 29 • シンクロナイズトメソッド 3 • 実行時間 • JIT 一回目:27.3(ms) 二回目以降:2.1(ms) • Intrp 一回目:18.3(ms) 二回目以降:4.3(ms) • ロック • JIT 一回目:322回 二回目以降:7回 • Intrp 一回目:235回 二回目以降:7回
‘System.out.Println(HelloWorld)’ (Cont’d) • rt_mutex_locak() のコスト 25μS • println中のrt_mutex_lock()のコスト(1回目) • JIT 8 ms • Intrp 5.9 ms • ロックを除いた実行時間 • JIT 一回目:19.3(ms) 二回目以降:2.0(ms) • Intrp 一回目:12.4(ms) 二回目以降:4.2(ms) • ちなみに、 • ちなみに、printf(“HelloWorld\n”); • 一回目: 250 μS 二回目以降: 159μS
new RtThread vs.new Thread • RtThread - ダイナミックJavaステップ - 375、メソッド -50 (1回目)ダイナミックJavaステップ - 544、メソッド -62 (2回目) • Thread - ダイナミックJavaステップ - 366、メソッド -49 (1回目)ダイナミックJavaステップ - 535、メソッド -61 (2回目) • 実行時間 • new RtThread() • JIT 一回目:27.4(ms) 二回目以降:0.9(ms) • Intrp 一回目:13.8(ms) 二回目以降:3.3(ms) • new Thread() • JIT 一回目:25.3(ms) 二回目以降:0.9(ms) • Intrp 一回目:13.0(ms) 二回目以降:3.2(ms)
new RtThread vs.new Thread • ロック(synchronized メソッド 5) • new RtThread() • JIT 一回目:350回 二回目以降:16回 • Intrp 一回目:246回 二回目以降:16回 • new Thread() • JIT 一回目:333回 二回目以降:16回 • Intrp 一回目:234回 二回目以降:16回 • ロックを除いた実行時間 • new RtThread() • JIT 一回目:19.3(ms) 二回目以降:0.5(ms) • Intrp 一回目: 8.2(ms) 二回目以降:3.0(ms) • new Thread() • JIT 一回目:17.5(ms) 二回目以降:0.5(ms) • Intrp 一回目: 7.4(ms) 二回目以降:2.9(ms)
Threadの起動 • RtThread - ダイナミックJavaステップ - 5、メソッド -3 • Thread - ダイナミックJavaステップ - 3、メソッド -2 • 実行時間 • new RtThread() • JIT 一回目:3.9(ms) 二回目以降:1.8(ms) • Intrp 一回目:2.6(ms) 二回目以降:1.9(ms) • new Thread() • JIT 一回目:3.0(ms) 二回目以降:1.8(ms) • Intrp 一回目:2.1 (ms) 二回目以降:1.9(ms)
Threadの起動(Cont’d) • ロック • new RtThread() • JIT 一回目:31回 二回目以降:5回 • Intrp 一回目:19回 二回目以降:5回 • new Thread() • JIT 一回目:17回 二回目以降:3回 • Intrp 一回目:11回 二回目以降:4回 • ロックを除いた実行時間 • new RtThread() • JIT 一回目:3.1(ms) 二回目以降:1.8(ms) • Intrp 一回目:2.3(ms) 二回目以降:1.8(ms) • new Thread() • JIT 一回目:2.7(ms) 二回目以降:1.7(ms) • Intrp 一回目:1.9(ms) 二回目以降:1.7(ms)
ちなみに • rt_thread_create • 一回目 • 233μS • 二回目以降 • 129μS
まとめ • 時間属性記述方法は? • インプリ上の問題 - Deprecated() • JITの影響 • Class Loadの影響 • Cacheなどによる影響 • GC