Kaffe-1.0.b1-rt の問題点について
慶應義塾大学 SFC研究所
喜多山卓郎
Kaffe-1.0.b1
 JDK1.1
 AWTサポート
 ThreadInterface, LockInterface,
GarbageCollectorInterface
Kaffe-1.0.b1の構造
-rtの構造
java.lang/io/net/util...
java.awt.packages
Code-Verifier
Class Magagement
Execution-Engine (JIT, Interpreter)
System Call
subsystem
RT-Thread
Thread
subsystem
Subsystem
(K/U)
(RT-Mach)
Native core library
Heap(GC)
subsystem
Class
Libraries
Virtual
Machine
Native lfc
subsystem
(JNI, KNI)
Native AWT library
Native
Libraries
Kaffe-1.0.b1-rt
Real-Time Java Threads
Deadline Handler
Real-Time Java VM
Kernel Threads
RT-Mach
RT-Scheduler, RT-Sync
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;
Application Interface
- Real-Time Thread
Java thread
class MyThread extends Thread{
…
public void run(){…}
…
}
…
MyThread th = MyThread(..);
th.start();
Real-Time Java thread
class MyRtThread extends RtThread{
…
public void run(){…}
…
}
…
MyRtThread rth = MyRtThread(pri, start,
period, deadline);
rth.start();
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ステップ
メソッド数
• シンクロナイズトメソッド
実行時間
• JIT
一回目:27.3(ms)
• Intrp
一回目:18.3(ms)
615
29
3
二回目以降:2.1(ms)
二回目以降:4.3(ms)
ロック
• JIT
• Intrp
一回目:322回
一回目:235回
二回目以降:7回
二回目以降: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)
• Intrp
一回目:12.4(ms)
二回目以降:2.0(ms)
二回目以降:4.2(ms)
ちなみに、
ちなみに、printf(“HelloWorld\n”);
•
一回目: 250 μS
二回目以降: 159μS
new RtThread vs.new Thread

RtThread -

Thread -

実行時間
ダイナミックJavaステップ - 375、メソッド -50 (1回目)
ダイナミックJavaステップ - 544、メソッド -62 (2回目)
ダイナミックJavaステップ - 366、メソッド -49 (1回目)
ダイナミックJavaステップ - 535、メソッド -61 (2回目)
• new RtThread()
– JIT
一回目:27.4(ms)
– Intrp 一回目:13.8(ms)
• new Thread()
– JIT
一回目:25.3(ms)
– Intrp 一回目:13.0(ms)
二回目以降:0.9(ms)
二回目以降:3.3(ms)
二回目以降:0.9(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 Thread 実行時間
ダイナミックJavaステップ - 5、メソッド -3
ダイナミックJavaステップ - 3、メソッド -2
• new RtThread()
– JIT
一回目:3.9(ms)
– Intrp 一回目:2.6(ms)
• new Thread()
– JIT
一回目:3.0(ms)
– Intrp 一回目:2.1 (ms)
二回目以降:1.8(ms)
二回目以降:1.9(ms)
二回目以降:1.8(ms)
二回目以降:1.9(ms)
Threadの起動(Cont’d)


ロック
• new RtThread()
– JIT
一回目:31回
– Intrp 一回目:19回
• new Thread()
– JIT
一回目:17回
– Intrp 一回目:11回
ロックを除いた実行時間
• new RtThread()
– JIT
一回目:3.1(ms)
– Intrp 一回目:2.3(ms)
• new Thread()
– JIT
一回目:2.7(ms)
– Intrp 一回目:1.9(ms)
二回目以降:5回
二回目以降:5回
二回目以降:3回
二回目以降:4回
二回目以降:1.8(ms)
二回目以降:1.8(ms)
二回目以降:1.7(ms)
二回目以降:1.7(ms)
ちなみに

rt_thread_create
• 一回目
– 233μS
• 二回目以降
– 129μS
まとめ
 時間属性記述方法は?
 インプリ上の問題 - Deprecated()
 JITの影響
 Class Loadの影響
 Cacheなどによる影響
 GC
ダウンロード

Kaffe-1.0.b1-rt の問題点について