详细介绍什么是实时JAVA
2008-01-05 08:30:35 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

我在一家投资银行工作了许多年 , 我的经验告诉我,在金融软件中出现的绝大多数问题是由于缺少实时支持导致的。许多大型的金融IT系统工作于java平台,程序运行时一个不在计划中的的两秒的垃圾收集将导致成千上万美元的损失。更糟糕的是,垃圾收集通常发生在程序负载很高的情况下,这时候程序对执行过程中的中断更为敏感。同样的情况也发生在其他高科技产业中,这就是为什么需要仔细研究实时JAVA规范及其实现的原因。
有些人可能会认为JAVA和实时是不同环境中的两个概念,实际上,最老的JSR之一(确切的说是第一个JSR)就是关于扩展JAVA平台的实时特性的。然而,任务提交的顺序并不保证它的实现的顺序;Sun只是在最近才实现了实时性,但这并不意味着它是一个低优先级的特性;实际上,这是一个非常复杂并且是一个完整的工作。但是实时的要求与JAVA的本身的要求兼容吗?有很多问题就不得不提了,如GC的语义学 ,同步,线程调度以及high-resolution的时间治理。在本文中,我们将逐一解释这些名词。
版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:michaelzyy;michaelzyy
原文:http://www.matrix.org.cn/resource/article/2006-11-28/JAVA+Real+Time_72f1a994-7e38-11db-babc-9753a314dd4b.Html
要害字:Java;Real time
实时是什么意思呢?
Greg Bollella ,是Sun公司的一个杰出的工程师,实时JAVA规范的作者之一,它说,实时意味着“能够可靠的可猜测的推测和控制程序逻辑的时间行为的能力。”实时并不像许多开发者想的那样,意味着速度,而是意味着当需要对现实世界的事件作出反应时,它的行为是可猜测的和可靠的。实时的电脑总是在限定的期限之内作出反应。取决与所设定的的期限,大量的系统可以被称作是实时的。
很多程序不能答应即使是一秒的延迟;他们包括之前提到的金融软件,飞机控制软件,核电站控制软件等等。所以,这些并不完全是对速度要求很高的,尽管实时平台的设计师会努力使得程序变快。显而易见,标准的JAVA平台并不符合这些实时系统的要求,这也写入了J2SE和J2EE的许可证协议中,这些协议明确的声明JAVA不能用于核电站设施软件和防卫系统等等。
实时JAVA
开发实时应用程序需要一个能够答应开发者正确的控制程序的运行时间以及程序在现实中的行为PI集合和语义。因此JAVA的实时版本必须提供一些JVM的增强以及一个适合实时程序的API集合。毫不希奇,在JAVA中添加实时的特性最大的障碍在于它的垃圾收集器。Sun最近发布的JAVA实时版本RTS1.0中就包含了一个革命性的核心的实时的垃圾收集器。尽管它的第一个实现中并没有包含这样一个垃圾收集器(将在下一个release版本中将增加)。JAVA RTS 提出了其他一些问题,保证线程调度的确定性,overhead同步,锁排队治理,类初始化以及最少的中断反应延迟。JAVA RTS仅仅针对于合适的操作系统,这就意味着只有诸如QNX这样的的实时操作系统才适合去实现一个这样的JVM。
实时JAVA规范的第一个官方商业实现版本是在Solaris 10,工作在Ultrasparc硬件上,并且要求J2SE 1.4.2作为基础。未来的版本将会支持JAVA 5 以及其他的一些平台。美国海军,Raytheon公司和波音公司已经开始使用SUN的JAVA实时系统。当然,SUN的JAVA实时系统并不是第一个实时JAVA的实现。一些嵌入式系统的厂商已经在他们的系统中实现了一些实时的特性,不过他们的实现只是涵盖了一些具体的需要,并不符合JSR-1规范的要求。这对于那些使用JAVA平台并需要实时JVM的开发人员来说是个好消息。
这些听起来都不错,可是从一个开发人员的角度来看,这又意味着什么呢?要改变现有的程序使其使用RTS的API需要些什么改变呢?我们可以摆脱垃圾收集导致的中断这样一个主要的问题吗?很不幸,所有的一切并不是那么简单。仅仅简单的安装一个RTS的扩展包,把java.lang.Thread实例改名交javax.realtime.RealtimeThread并不能把一个程序变成一个实时的应用程序。
不过,这仍然是一个很好的开端,至少你可以获得一个革命性的实时的垃圾收集器。不得不提的是现有的J2SE的程序将可以成功的在JAVA 实时系统下运行 因为RTSJ规范只是JAVA语言规范和JAVA虚拟机规范的一个子集。它并不答应那些可能会破坏现有程序的语义扩展。
为了使得实时的垃圾收集器可猜测,程序员必须了解它的程序是如何从堆中要求内存的,因为垃圾收集器和程序都要用到它。程序产生垃圾,然后垃圾收集器将垃圾清理成空闲的内存,它们需要在堆中进行。因此,你必须告诉垃圾收集器关于你的程序产生垃圾的速度等一些信息,这样它可以明白自己需要多快的进行垃圾收集。如何获取那些数字可能是有点tricky,但是不管你做什么,你必须得考虑内存的使用。
假如运行RealtimeThread不是足够的,在修改完大骂之后,垃圾收集器的停顿将仍然很长或者无法猜测。你可能需要使用一个execution context而不是RealtimeThread,例如javax.realtime.NoHeaPRealtimeThread.它可以通过使用内存而不是JAVA堆来获得可猜测的特性,例如immortal memory 和 scoped memory,后面我们将讨论他们。获得可猜测性当然需要代价的:典型的情况是牺牲了系统的平均性能。
JAVA RTS的新特性
让我们来看一下JAVA RTS平台中增加了哪些新特性。
*直接内存存取.JAVA RTS 答应对物理内存的直接存取,这与J2ME很像。不要惊异,JAVA实时系统主要针对的平台就是嵌入式系统。这就意味着现在你可以创建用纯JAVA写的设备驱动了。尽管内存存取并不是一个实时系统的直接要求,许多应用程序还是需要对物理内存做存取。JAVA RST定义了一个新的类,这个类答应程序员对物理内存做字节级别的存取,同时这个类还答应在物理内存中创建对象。有人可能会认为JAVA支持物理内存存取就是放弃了原有的主要的原则-可靠性和安全性,并向C语言又靠近了一步。但这并不是问题的所在,JAVA通过控制内存边界和数据内容来实现了一个强大的安全保护措施。
*异步交流。JAVA RTS 提供了两种异步交流的形式:异步事件处理和异步传输控制。异步事件处理意味这开发者可以计划对来自JVM外部的事件的反应。异步传输控制为一个线程提供了安全的中断另一个线程的方法。
*High-resolution timing.有很多具体描述High-resolution timing的方法,包括绝对时间和相对时间。时间的调度和度量能够具有一个纳秒级准确度。
*内存治理。有两种新的内存区域可以帮助防止由于在实时应用程序中传统的垃圾回收导致的无法预期的延迟。Immortal memory 和 scoped memory。Immortal memory保存对象而不摧毁他们,直到程序结束。这就意味着在Immortal memory中创建的对象必须像C 程序那样仔细的分配和治理。scoped memory仅仅被用于当一个进程在一个特定的范围里工作的情形。当这个进程离开这个范围的时候,对象将自动被摧毁。Immortal memory和scoped memory都不会被垃圾收集的,因此可以通过使用它们来避免垃圾收集的影响。JAVA RTS也为使用内存区域的线程提供了内存分配预算的功能的有限支持。当线程被创建的时候,每个实时线程的最大内存区域消费和最大的分配率可以是指定的。
*实时线程。正如先前所提到的,JAVA RT支持两种新的线程模型:实时线程(javax.realtime.RealtimeThread) 和非堆实时线程(javax.realtime.NoHeapRealtimeThread).这两种线程类型都是不能被垃圾收集中断的。这些线程具有28个级别的优先级,并且和标准的JAVA不同,他们的优先级是严格的增强的。实时线程是同步的,并且并不受限于所谓的优先级颠倒(priority inversion),在这种priority inversion情况下,假如一个低优先级的线程拥有一个高优先级的线程所需要的资源,将会阻止了这个高优先级的线程的运行。测试证实JAVA RTS完全避免了priority inversion,这对于紧急任务来说是很重要的。
更多精彩
赞助商链接