------------------------------------------
專題報導 >> Java即時規範(RTSJ)之程式規劃:與首席工程師Greg Bollella的對話─
Part 1
--------------------------------------------------------
■ 文章索引(註1)
==============================
大家都知道,即時程式規劃正受到質疑,但是在Sun Microsystems首席工程師Greg Bollella領導之下,事情有了改變。「Java即時規範 (RTSJ)」採用高度工程化以及最佳化的系統平台:HotSpot JVM,並且將之修改,如此不僅能維持其對於非即時程式的價值,同時能夠輕鬆契合實體系統的即時程式規劃。
Greg Bollella之前任職於IBM,領導隸屬於Java Community Process (JCP) 標準組織之下的Real-Time for Java Expert Group,進而發展出RTSJ。他於2000年時加入Sun Microsystems實驗室,目前是Real-Time Java小組的首席工程師。Greg Bollella攻讀北卡羅來納大學校堂山分校電腦科學博士班時,他的學術論文就是即時排程原理與即時系統實施。
我們於延攬到他之後才在RTSJ的發展上有所突破,搭配Sun Java Real-Time System,這套第一套商業實施的Java Specification Request (JSR) 1。
問:RTSJ試圖解決哪些基本問題?
答:不管何時只要電腦控制著實體裝置,就需要通常具有三種互動部分:感應、控制與致動的控制系統。「感應」表示環境內有感應器,來測量實際數量:溫度、壓力、溼度、力量等等。「控制」從這些感應器中取得數值,並建立輸出指令給所謂的致動器。「致動器」是實際上對環境產生衝擊的物品。具備感應器、控制機構以及致動器的控制系統無所不在。火車、飛機、汽車、交通號誌燈、財務交易系統 (不管您相不相信,這些交易引擎就是一套實體控制系統)、晶片製造機等等。
若您要控制某些東西,必須確定感應與指揮之間的時間受限於某些最大量,例如:當您嚐試控制其他事物時,此時就無法從網路下載,因為這樣您要控制的事項將會失敗。這與現今所使用的系統有基本上的差異。
問題在於,像是網路與商業計算交易及效能這些一般計算成功與否都以速度為準。在控制方面,當您必須操縱實體裝置,夠快並不代表夠好,因為也必須可以預測,這在一般用途機器內並不容易。
--------------------------------------------------------------------------------
■ Sun Java Real-Time System (Java RTS)
Sun Java Real-Time System(註2)是第一套商業實施的Java Specification Request (JSR)1,Java即時規範(RTSJ)。Java RTS可讓即時應用程式設計師完全發揮Java語言生態系統的優點,而仍舊能維持目前即時發展平台的可預測性。這表示即時元件可同時存在並且共享單一系統上的資料。
Java RTS也將即時程式規劃的世界帶給目前正在使用Java技術的設計師,來建立影響現實世界的應用程式。對於支持者而言,Java RTS提供一種相當可預測、低潛在性以及現代軟體架構,將Java技術的核心價值帶給所開發應用程式將廣為人們使用的設計師。
Java RTS 1.0已經上市(僅限Solaris 10 SPARC),並且Java RTS 2.0正在開發當中。
問:RTSJ當中最重要的創新為何?並且誠如某些人所宣稱受到挑戰?
答:人們都將焦點放在有範圍的記憶體、永久記憶體以及No Heap Real time Thread上,但是在即時資源回收的使用方面也有所創新,這屬於另一項完整的RTSJ子系統,同樣也能賦予您非常好的可預測能力 – 優於傳統Java程式設計師所慣用的,在幾毫秒範圍內具有暫停時間。這就相當重要,因為許多客戶都認為即時資源回收不失為一項好主意。
RTSJ具備三種執行範圍可供設計師使用,賦予變動的可預測能力與效能,並且粗略由下列三種執行緒類型所定義:java.lang,Thread、javax.realtime.RealtimeThread (RTT)以及javax.realtime.NoHeapRealtimeThread (NHRT)。RTT需要即時GC來取得可預測能力,NHRT藉由使用非一般Java堆積記憶體(像是永久與第二記憶體)來取得可預測能力,NHRT具有最佳的可預測能力(由統稱為「最大潛在性」的方式所測量)。
設計師使用有範圍的記憶體以及非堆積執行緒,這是比常用Java程式設計模型還是困難的程式設計模型,不過比傳統即時模型簡單。有了RTSJ,您就必須特別留意特定記憶體區域內的記憶體消耗與物件建立,如此才不會發生例外情況。
如此即時程式規劃是一項挑戰,不過我們將它變簡單了。運用NHRT內有範圍的記憶體,讓即時程式設計師輕易從C或C++遷徙至RTSJ。
--------------------------------------------------------------------------------
「即時程式規劃是一項挑戰,不過我們將它變簡單了。」
Greg Bollella
Sun Microsystems首席工程師
--------------------------------------------------------------------------------
問:您是如何讓它變簡單的?
答:若一名Java程式設計師想要撰寫比往前所撰寫還要可以預測的程式碼,但是不縮減微秒潛在性範圍,則RTSJ的程式規劃模型就非常簡單。事實上,只需要做一項小改變 – 將您要撰寫的java.lang.Thread改變為javax.realtime.RealtimeThread。就是這項改變,您便擁有業界內最強大的即時資源回收系統。您獲得優先權逆轉廢止能力,並且取得嚴格、精確並且正確的優先權派遣技術。這些功能都有助於產生在表現方面歷久彌新的程式碼。
若要取得即時資源回收筒的可預測能力,因為資源回收筒與程式都同時在使用堆疊,所以您必須知道有關程式對於堆疊中記憶體的需求。程式會製造垃圾,資源回收筒可將垃圾轉換成可用的記憶體,並且必須在堆疊內互動。不過這並無法同時執行,兩者之間必須有某些「同步措施」。所以您必須告訴資源回收筒,程式製造垃圾的速度,這樣回收筒才知道自己的清理速度。要取得這些數據可能相當棘手,但是不管做什麼事,您都必須考慮到記憶體。
我們正嚐試讓人們使用快速並且輕易地使用RTSJ實施方式,並且不用擔心有範圍的記憶體以及更複雜的細節。我們鼓勵人們先嚐試即時資源回收系統,熟悉之後,再提供工具幫助他們分析程式的記憶體行為,如此就可推敲要如何要求資源回收筒產生可用的記憶體,這可能是他們所要的。
若這樣不足夠並且暫停時間仍就太多,或是對於程式的瞭解不足,並且從資源回收筒中獲得不可預測的暫停時間,則可使用NHRT以及有範圍的記憶體記錄下來。但是這通常只是簡單的低階控制迴圈。
--------------------------------------------------------------------------------
「我們嚐試讓人們快速並且輕易地使用RTSJ實施方式,並且不用擔心有範圍的記憶體以及更複雜的細節。」
Greg Bollella
Sun Microsystems首席工程師
--------------------------------------------------------------------------------
問:設計師應該瞭解有關RTSJ的其他技術挑戰與創新有哪些?
答:取得可預測能力需要犧牲,通常您所放棄的是平均整體效能,這方面我們無法做些什麼。我們嚐試在許多實施方面降低可以降低的整體成本,不過「天下沒有白吃的午餐」。
問:您可解釋RTSJ在應用程式邏輯內關於非同步事件的創新嗎?
答:在過去,應用程式邏輯透過處理器中斷應用程式邏輯、自行處理非同步問題、在任何排程或派遣機制的能見程度之下,來處理應用程式處理領域以外的非同步事件。程式設計師撰寫預期要執行並且在特定時間內完成的程式碼,但是所花時間超出預期。處理器會間歇忙於處理非同步函數,像是岔斷處理器或信號。RTSJ包含一種機制,其可移除這些非同步活動的隱藏屬性,將其呈現給排程與派遣機制。這樣就不會造成系統佔用CPU用於應用程式邏輯的週期時間,不過他們屬於RTSJ的排程系統內第一級公民,所以他們會得到應得的週期時間。
■ 2006年JavaOne年會軌道車程式規劃挑戰賽
==============================
問:告訴我們有關2006年JavaOne年會軌道車程式規劃挑戰賽。
答:有關2006年JavaOne年會,我們舉辦一場使用1/24比例電動馬達車繞行軌道競速的「軌道車程式規劃挑戰賽」。一般而言,這些小車透過小型手持控制器來控制,往下按可傳送電壓給車輛,讓它們跑的更快,放開就會減速。您駕駛車輛繞著複雜賽道前進。其挑戰性在於讓車子快速繞著軌道跑,不過在彎道時不能太快而摔出賽道。秘訣在於直線時要加速,過彎時要減速不要摔出賽道。
在年會中,我們安裝了大約100-200呎的賽道,並且埋入200個感應器。程式可偵測到車輛是否通過感應器,但是無法分辨是哪一個感應器。所有感應器都整合在一起,參加挑戰賽的程式設計師必須撰寫輪詢迴圈來收集感應器數據,並且持續監視車輛是否通過感應器。
然後程式賦予車輛適當的電壓,如此在直線上跑快一點,在彎道上慢一點。參賽選手將在實驗室內撰寫程式碼,然後然後到會場內安裝的機器上執行。我們將記錄下車子從起跑到通過終點所經過的時間,結束後取前十名頒獎。
提示:建立迴圈為每五毫秒的NHRT並讀取感應器數據。若您有這樣設計,因為並無任何延遲,所以就可拾取所有感應器數據。若您使用即時執行緒或Java執行緒,當資源回收筒提示,執行緒將會暫停,此時車輛可能已經通過一個感應器,這樣將不知道車子已經通過哪個感應器,而會給予錯誤的電壓,如此會使得車子在直線上速度太慢而浪費時間,或是在彎道上速度過快而摔出賽道。
我們將做此設定,如此設計師將使用其中包含一些執行緒會無根據產生垃圾的框架,這樣設計師必須要正確應付這些執行緒。
「即時」並不代表「快速」
■ 附註
==============================
註 1:http://java.sun.com/developer/technicalArticles/
註 2:http://java.sun.com/j2se/realtime/