“要实现伟大的理想,需要两件事:一个计划和不太足够的时间。”
——伦纳德·伯恩斯坦(Leonard Bernstein), 美国指挥家、作曲家
在写作本书时,实时编程的历史,特别是用Java实时编程,才刚刚开始。但是,我们预测,在不久的将来,实时Java,即来自Sun公司的Java实时系统(Java RealTime System,Java RTS),将主要用于实时应用领域,例如金融领域、关键控制系统、生产线、军事和其他政府系统等的软件。这个预测是在Java曾经处于被认为“太慢”而不适用于开发关键任务和其他企业系统时的阴影中作出的。
然而,正如Java已经迅速向世界证明它能够执行得足够好,即适应最苛刻的企业系统,Java RTS也正在向实时世界积极证明它自己。除去必要的、复杂的、专业的实时语言和操作环境,Java RTS为系统带来了Java语言的所有的优势和经验,并满足实时性要求。实际上数十年在实时领域进行研究得到的知识和经验,现在已经为每一个Java开发者唾手可得,仅需要对新的类库多一点理解。
在20世纪90年代末期,Greg Bollella在芝加哥出差时,有了推出一个Java实时版本的想法。不久之后,JSR001开始被使用,而规范处于早期阶段。该规范是由Greg领导,成员包含涉及实时调度理论、微处理器设计、嵌入式系统设计和语言设计等领域的众多精英。最后,制订的规范定义了Java在实时空间是如何使用的,Java RTS符合该规范,并得以实现。
定义“实时”
虽然本书的第1章全面讨论并定义了实时系统,但是最好在早期设置好场景,并商定确切的定义。实时编程的总体目标是确保系统执行其任务,在定义的最后期限之前,对现实世界的事件作出响应。无论最后期限以微秒或天来衡量,只要任务在需要的最后期限之前完成,该系统即被认为是实时的。这个简单的定义是计算机科学整个学科的基础,在学术界和工业界经过了数年的研究和发展。
换言之,现实世界的事件发生(如物体掠过一个传感器,或一个股票市场数据源变化的到来)时到代码完成处理该事件的时间的延迟应该是有界的。满足最后期限的能力必须在任何时间是可预测和有保证的,以便提供一个实时系统所需要的确定性。
满足实时系统的要求可能非常费力,以致创建出专门的编程语言、操作系统、系统框架和调度算法。人们划分不同的研究领域,使用成套的工具,甚至成立整个公司来解决实时问题。正是由于这些原因,Sun创建了Java实时系统。
Java的实时规范
Sun的Java实时系统是与Java实时规范(RTSJ)百分之百兼容的实现。RTSJ也叫做JSR001,是整个Java社区过程(JCP)被建立的第一个Java规范请求(JSR)。实时Java是许多第一中的第一,并且,通过建立JCP,它不仅为本身的目标(即 Java实时编程)铺平了道路,而且在语言特性方面为Java的发展奠定了基础。
RTSJ是一个标准,定义了Java应用程序在真实世界环境中的行为。它是由来自世界各地的许多公司的许多领域(例如,嵌入式系统设计、语言设计、操作系统设计、处理器设计、实时调度理论等)的专家创建的,是真正全球性的努力。首要目标不是确定用Java如何实现实时行为,而是完全不改变 Java语言。实现这一目标的重要性,如同数以千计的开发者现在所知道的,是要确保Java可用于实时领域,不需要妥协。
一个Java的实现能够称为“实时”,则必须符合RTSJ。任何其他都是非标准的,如Java社区作为整体所定义的。这确保了用Java开发的实时应用程序将能够运行在任何兼容RTSJ的JVM上,而且其在实时环境中的行为表现是已经定义的,而无需专门的扩展或者硬件。任何其他做法将违背Java建立的原则。Java RTS是符合RTSJ的,因而是基于标准的。
本书的重点和面向的读者
本书着重介绍Java RTS、它的API,以及用Java如何建立真正的实时应用。这样做的目的是,为读者提供用Java建立实时应用的实用知识和实例。只要有可能,将通过使用实际工作代码示例,提供关键教义和可视化图示,使复杂的概念清晰化。
虽然Java RTS是本书的重点,但是所有从本书获得的知识将是默认兼容于 RTSJ的。对于RTSJ的理解不是阅读本书的前提,但强烈建议你阅读这一规范,因为它是这里所介绍的内容的基础。你可以在http://wwwrtsjorg获得最新的规范和相关材料。
本书的主要读者是(各级)架构师和开发人员,他们需要用时间关键的代码建立应用。本书针对下面不同类型的开发者:
正在使用或没有使用Java RTS开发有实时要求的应用的Java开发者
有兴趣学习Java RTS的API并将其用于未来项目的Java开发者
希望使用Java用于实时应用开发的非Java实时应用程序开发者
.希望使用Java RTS部署在一个通用操作系统上(而不是专用的操作系统、平台或语言)的架构师和开发人员
对于这些开发者,Java RTS和RTSJ代表着不受限于专门的硬件、操作系统和语言的自由。当这种自由与Java的生产力和大的开发人员社区结合,Java RTS代表的是一个明智的商业选择和潜在的巨大资金的节省。
本书的结构
本书分为三个主要部分:
第一部分——实时计算概念:奠定了使用Java RTS的基础。它明确定义了计算领域中的实时概念,并讨论了许多实时应用程序设计和开发的理论。
这包括第1章至第4章。
第二部分——高级Java RTS:带你深入了解Java RTS的API,提供充足的示例代码来说明其内部的运作和Java RTS的使用。你将更深入地了解RTSJ适用于解决实际问题的原理。
这包括第5章至第10章。
第三部分——使用Java RTS:第三部分讨论了全面的案例研究,其中Java RTS用于解决实际实时系统的问题,以及用于开发和调试Java RTS应用程序的工具。
这包括第11章和第12章。
本书的章节划分如下:
第1章——实时入门:本章提供了实时系统的全面定义,然后将它们与高性能系统和高吞吐量系统进行比较。定义并探讨了其他关键术语,如可预测性、抖动、延迟和确定性。本章的后半部分包含了实时调度的高层次讨论。本章采用类比、说明和图示来解释这些概念,便于读者的理解。
第2章——实时与Java SE:本章探讨了在实时环境中使用标准的Java。出现的问题,如Java垃圾回收器的执行,以及即时编译器等,将作为麻烦的来源讨论。本章详细讨论Java SE 6和即将发布的Java SE 7中的垃圾回收,最后对实时垃圾回收算法进行概述。
第3章——Java实时规范:RTSJ定义了Java在实时空间的行为。事实上,RTSJ是第一个Java规范请求(JSR),并且是Java社区过程(JCP)形成的一大原因。该规范由Greg Bollella领导,包括来自世界各地的学术界和工业界的专家参与制订,现在叫做实时Java开发标准。本章提供了RTSJ的简要概述。
第4章——Sun Java实时系统:本章是我们对实时Java进行的探讨,首先讨论了Java RTS——Sun公司实现的RTSJ产品。阅读本章将帮助你在Solaris或Linux上建立并运行一个可工作的Java RTS系统。
第5章——线程、调度和新内存模型:作为第一个深入Java RTS的API的一章,这一章的重点是为你提供新的线程模型,以及RTSJ引入的不同内存模型。
第6章——同步:本章探讨Java RTS中的线程是如何同步的。还深入探讨Java虚拟机中所做的一些改进,以尽量减少内部同步多线程访问共享资源时的延迟。
第7章——实时时钟API:Java RTS提供对高精度定时器和确定性定时器对象的支持。在本章中,我们将研究实时时钟API,以及如何为确定性操作创建定时器对象。
第8章——异步事件:Java RTS让你更好地控制工作在一个系统中的调度。本章探讨可以用来在实时应用中控制事件处理的类。
第9章——异步控制转移和线程终止:在本章中,我们将探讨Java RTS为可调度对象从一个方法到另一个方法转移控制,终止任务提供的细粒度控制。
第10章——实时垃圾回收器内部机制:本章深入介绍实时垃圾回收器的内部工作原理,并介绍了它如何运行。充分理解RTGC如何工作,如何影响系统,以及如何进行调整,将帮助你建立更有效的Java RTS应用。
第11章——证券交易系统:本章探讨了Java RTS在类似于交易商、投资银行和金融世界交换使用的金融应用中的使用。在投资、银行、金融领域,由于垃圾收集造成的延迟引入错过重要市场事件的风险。由此造成的拖延可能直接转化为在这些市场的亏损。
第12章——Java RTS工具:本章讨论可用于开发和调试Java RTS应用程序的工具。
保持更新
没有一本书是完成的,像Java RTS这样的重要技术也不是一成不变的,它们会不断地演变。检查网站http://wwwericbrunocom/realtime,以获得更新和额外的内容,以及示例和许多案例研究的完整代码。我们也将让你保持对RTSJ,以及Sun公司的实现——Java RTS变化的更新。
致谢
“迟做总比不做好,但从来不迟做更好。”
——佚名
本书的写作历程始于2006年8月Greg Bollella在加州门洛帕克(Menlo Park)做的一个Java RTS简短讲座。我参加了这个讲座,这是更广泛的Sun培训课程的一部分,但是Greg的讲座,是我最感兴趣的部分。我过去做过实时系统的开发工作,但从来没用Java做过。Greg的关于最后期限、可预测性、Java的垃圾回收等的讨论令我好奇,引起了我在这个主题上的狂热兴趣。
和我一起参加这次讲座的还有Craig Ellis(我当时的经理),他立即给我和我的两个同事布置任务,构建证明概念的应用程序,我们将用它向其他人演示Java RTS。因此,我首先非常感谢Greg Bollella、Craig Ellis、Jim Clarke和 Jim Connors。两位Jim和我(被一些人称为“三友”)构思、设计、构建了在本书第11章使用的证券交易系统。如果没有这四个人的努力,本书不会存在。再一次真诚地感谢你们!
最后,非常感谢我的妻子Christine,还有我们的孩子,Brandon 和 Ashley。在完成第1章之前,我花了整整一年进行研究,虽然我试图尽可能少地影响家庭,我知道,有些时候我的时间被预先占用了。你们是最好的!我感谢上帝,它完成了。
——Eric JBruno,2009年3月
Eric做了这本书的绝大多数实际工作,因此我感谢他。当许多其他的工作出现并威胁要拉我走开时,他使我一直工作在这项任务上。Peter Dibble和Andrew Wellings也发表了编程和使用RTSJ的实现的书籍。这些书对RTSJ社区一直具有巨大的帮助作用,并且帮助了Eric和我。所以,我以我个人名义感谢Peter和Andy。这本书的工作也需要时间暂时脱离Sun公司的其他责任,所以对Java RTS团队的每个人——工程师、销售人员、营销人员和管理方表示我个人的感谢,容忍我有时不按时出席会议。
我的妻子Melinda和女儿Allie,她们也作出了贡献,并容忍了我反复无常的日程安排。感谢她们。
——Greg Bollella,2009年3月
当然,感谢并没有就此结束。作者在此感谢Greg Doench、Michelle Housley、Noreen Regina和在Pearson 的其他人在书的项目进行中不断给予指导,即使我们错过了一些重要的里程碑。此外,我们感谢来自以下诸位的鼓励:Vineet Gupta、Lino Persi、Dave Hofert、Dave Therkelsen、Tony Printezis、Gail Yamanaka、Gary Collins、Craig Ellis、Jim Connors、Jim Clarke、Ranbir Mazumdar、Steve Lipetz、Brent Loschen、Robert Rogers、Kevin Smith、Tom Harris、Dan Green、Scott Stillabower、Sekar Srinivasan、Tom Stanton、Greg Conk、Mike Genewich、James Allen、Jim Lipkis、Tom Karbowski、Dave Clack、Andy Gilbert和我们的家庭。
接着,我们要感谢Java RTS的技术队伍,他们把Java RTS做出来了,还回答了我们的很多问题。他们是Bertrand Delsart、Romain Guider、David Holmes、Olivier Lagneau、Carlos Lucasius、Frederic Parain和 Roland Westrelin。
另外,非常感谢那些审查书稿并提出了许多优秀的意见及建议的人们:David Holmes、Bertrand Delsart、Tony Printezis、Peter Dibble和Michael Thurston。如果没有你们,这本书也绝不会如此完整。
最后,没有Sun公司提供给员工的工作环境,所有这一切都没有可能。我们很自豪工作在一家这样的公司里。它专注于客户并解决问题需要的技术,其雇员为这两个方面努力。我们对Sun及其世界各地具有献身精神的员工们说一声:谢谢!