BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース リアルタイム Java の連載が Sun Developer Network に掲載

リアルタイム Java の連載が Sun Developer Network に掲載

Sun Developer Network に、Java とリアルタイムシステムについての二つの記事からなる連載が掲載されている。執筆は Sun の Brian Goetz 氏と、Robert Eckstein 氏だ。

ひとつ目の記事(リンク)ではリアルタイムプログラミングの概念と、それがどのように Java と関連しているのかが紹介される。執筆者たちは、標準の Java 実行環境をリアルタイムアプリケーションにもちいることができない理由を次のように述べている。
  • スケジューリングの遅延や時間精度の低さといった OS の問題
  • スレッドの優先順位に厳格な保証がないことや、優先順位逆転といったスレッドの優先順位にかんする問題
  • クラスローディングによる遅延
  • ガベージコレクションによる遅延
  • アプリケーションコードが時間的要件を認識できないこと
  • システム上にあるほかのプリエンプティブなアクティビティ
つづいて執筆者たちは RTSJ - Java リアルタイム仕様( Real-Time Specification for Java )を紹介する。RTSJ は JSR の栄光ある第一号(リンク)をかざっており、2002 年にファイナルリリースとなって以降、幾度ものメンテナンスリリースを経てきている。記事ではリアルタイム仕様によるスレッドに対する変更について説明されている。

真のリアルタイム環境ではスレッドの優先度がきわめて重要になる。すべてのタスクを時間どおりに完了させることのできるシステムなどないが、リアルタイムシステムでは、あるタスクが求められる期限内に完了しそうにない場合に、必ず優先度の低いタスクがあとまわしにされる。

RTSJ は少なくとも 28 段階の優先度を定義し、それらを厳格に実施することを求めている。しかしこの記事の最初のほうで述べたように、RTSJ の実装には複数の優先度をサポートするリアルタイム OS と、低優先度のスレッドが実行中でも高優先度のスレッドに処理が切り替わる機能が必要だ。

Goetz 氏と Eckstein 氏はつづけて「リアルタイムスレッド」という Java リアルタイム仕様における中心的な概念のひとつについて説明している。

加えて、RTSJ はリアルタイムなアクティビティとそうでないアクティビティをひとつの Java アプリケーションに混在させることができるように設計されている。アクティビティに与えられる時間的保証の度合いはそのアクティビティを実行しているスレッドの型が java.lang.Threadjavax.realtime.RealtimeThread かによって決まってくる。

  • 標準の java.lang.Thread クラス( JLT )によるスレッドはリアルタイムでないアクティビティのために利用できる。JLT スレッドでは Thread クラスに定義された 10 段階の優先度が利用できるが、時間内実行の保証はないので、リアルタイムのアクティビティには適さない。 
     
  • RTSJ では javax.realtime.RealtimeThread クラス( RTT )も定義されている。RTT はタイムスライシングではなく run-to-block によってスケジューリングされており、RTSJ が提供している、スレッドの強い優先順位付けを活かすことができる。スケジューラは、より高い優先度をもつ RTT が実行可能になったら現在の RTT をプリエンプションするということだ。
ひとつめの記事で触れられている最後の概念は、メモリ管理をサポートするためのさまざまな拡張だ。ガベージコレクションにからんだ遅延やオブジェクトアロケーションによる遅延を考慮し、メモリ領域は三つに分けられている。
  • 標準ヒープ - 標準の Java におけるのと同様のメモリ管理
  • 永久メモリ - ソフトウェア側で明示的に解放する必要のあるメモリ
  • スコープメモリ - 個々のライフサイクルの間だけ存在し、固定サイズの境界をもつメモリ
これら固有のメモリ領域をリアルタイムシステムに適したやり方で管理できるように、RealtimeThread を拡張した NoHeapRealtimeThread クラスが導入されている。

RTSJ は NoHeapRealtimeThread ( NHRT )とよばれる RTT のサブクラスを提供している。このサブクラスのインスタンスは GC がひきおこすやっかいな問題から守られている。NHRT クラスはハードリアルタイムアクティビティでの利用を目的としている。

予測可能性を最大化するため、NHRT はヒープの使用もヒープへの参照を操作することも認めていない。そうしなければスレッドが CG による一時停止の影響を受けてしまうし、それはタスクの制限時間オーバーを引き起こす可能性があるからだ。そのかわり NHRT はスコープメモリ永久メモリを使って、より予測可能性の高いやり方でメモリの割り当てを行う。

ソフトウェアが特別なメモリ領域を使っているとしても、メモリのクリティカルでない別のセクションで GC によるリソースの使用から影響を受けることは避けられない。そのため、連載のふたつ目の記事(リンク)ではガベージコレクションにかんする問題にフォーカスをあて、リアルタイム Java システムで利用可能なさまざまな GC のアプローチについて説明し、Sun の商用リアルタイム Java システムである Java RTS(リンク) を紹介している。ふたつ目の記事で説明されているガベージコレクションアルゴリズムは次の 4 つである。
  • Work-Based GC - オブジェクトのアロケーションがトリガーとなって実行される GC
  • Time-Based GC - 一定の時間間隔で実行される GC
  • Henriksson's GC - クリティカルなスレッドとそうでないスレッドを区別する Work-based GC
  • Java RTS Real-Time GC ( RTGC ) - Java RTS で使用されている Henriksson's GC をさらに柔軟に、粒度を細かくした GC

現在、いくつものリアルタイムシステムが利用可能である。Sun Java RTS(リンク) と IBM Websphere RT(リンク) はいずれもリアルタイムシステム用の RTSJ 準拠プラットフォームだ。また、Oracle Weblogic Real Time(リンク) は標準の Java で構築されたツールセットで、信頼性に対して RTSJ が与えてくれる保証を完全に実現してくれるわけではないが、ある一定の時間内においてより予測可能性の高いシステムの実現を約束してくれる。

原文はこちらです:http://www.infoq.com/news/2008/07/realtime_java

この記事に星をつける

おすすめ度
スタイル

BT