本书主要讲述使用Java RTS进行Java实时编程的各类主题。主要内容包括3个部分:第一部分“实时计算概念”,明确定义计算领域中的实时概念,并讨论了许多实时应用程序设计和开发的理论;第二部分“高级Java RTS”,提供充足的示例代码来说明Java RTS的内部运作机制及其使用;第三部分“使用Java RTS”,讨论了实际的案例研究。
Sun公司的Java实时系统(Java RTS)在多个广泛的环境中得到了实践验证,其中包括金融、控制系统、制造和防务。Java RTS和RTSJ标准(JSR-001)消除了对于复杂、专用的实时语言和操作系统的需要,利用Java超常的生产率和为人所熟知的特点,节省了资金。
在实时Java编程中,Sun公司的两位实时编程专家介绍了开发者成功使用Java RTS及其API所需要的深入知识和实际代码示例,并阐明了用任何RTSJ兼容的环境进行实时编程的基础。
本书的内容包括:
Eric J. Bruno Sun公司系统工程师,专门从事于金融界的Java RTS。他是《Dr. Dobb’s》期刊的撰稿编辑,并撰写在线Java博客。
Greg Bollella 博士、Sun公司杰出工程师,领导实时Java研发。他是JSR - 001、Java实时规范(RTSJ)的规范组组长,并曾经领导在Java社区进程下的实时Java专家小组。他撰写了多部图书、文章,以及有关实时计算的专业论文。
实时原理和概念,以及实时应用设计和开发的独特要求。
如何把Java应用于实时环境。
垃圾回收和Java SE回收器。
使用Java RTS API尽可能高效地解决实际实时系统问题。
当前领先的Java RTS开发和调试工具。
实时垃圾回收、线程、调度和分派。
新的RTSJ内存模型。
异步事件处理和异步控制转移。
作者简介:
使用Java RTS进行实时Java编程
“要实现伟大的理想,需要两件事:一个计划和不太足够的时间。”
——伦纳德·伯恩斯坦(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变化的更新。
计算机\程序设计
使用Java RTS 进行实时Java 编程
面向开发者和架构师的Java RTS 权威指南
· 面向转向实时系统领域的Java开发者和架构师,以及转向Java的实时系统开发者。
· 从头至尾逐步分析应用示例,确定其限制并讨论解决它们的API和设计模式。
· 作者为实时Java标准过程的前任组长和华尔街实时系统的顶级开发者。
Sun公司的Java实时系统(Java RTS)在多个广泛的环境中得到了实践验证,其中包括金融、控制系统、制造和防务。Java RTS和RTSJ标准(JSR-001)消除了对于复杂、专用的实时语言和操作系统的需要,利用Java超常的生产率和为人所熟知的特点,节省了资金。
在实时Java 编程中,Sun公司的两位实时编程专家介绍了开发者成功使用Java RTS 及其API所需要的深入知识和实际代码示例,并阐明了用任何RTSJ兼容的环境进行实时编程的基础。
主要内容包括:
· 实时原理和概念,以及实时应用设计和开发的独特要求。
· Java如何被应用于实时环境。
· 垃圾回收和Java SE回收器。
· 使用Java RTS API 尽可能高效地解决实际实时系统问题。
· 当前领先的Java RTS开发和调试工具。
· 实时垃圾回收、线程、调度和分派。
· 新的RTSJ内存模型。
· 异步事件处理和异步控制转移。
(美)Greg Bollella Eric J. Bruno:作者简介 Eric J. Bruno,Sun 公司的系统工程师,专门从事于金融界的Java RTS。他是《Dr. Dobb 's》期刊的撰稿编辑,并撰写在线Java博客。Greg Bollella,博士、Sun 公司的杰出工程师,领导实时Java研发。他是JSR - 001,Java实时规范(RTSJ)的规范组组长,并曾经领导在Java社区进程下的实时Java专家小组。他撰写了多本图书、文章,以及有关实时计算的专业论文。
田思源 等译:暂无简介
将广泛使用的Java应用于实时领域,是一项有益的探索。
Java因其自身特点,如垃圾回收和即时编译,并不适合实时应用。从另一个角度看,Java广大的用户群和成熟的开发环境,对于降低实时系统采用专用语言和操作系统环境所造成的开发门槛,有着相当的吸引力。
Java实时规范(RTSJ,也称为JSR001)和Java实时系统(Java RTS)是在这个方向的一个尝试,并取得了不错的进展。
目前,Java RTS还有其局限,例如,不支持硬实时。
本书介绍了实时系统的基本原理和概念、Java的垃圾回收、如何使用Java RTS的API 解决实际问题、实时垃圾回收、线程调度和分派、新的RTSJ内存模型,以及异步事件处理和异步控制转移。
本书第三部分给出了一个用Java RTS实现的证券交易系统的例子,以及从从非实时Java到RTS的转变过程和它们之间的差别。同时,还介绍了开发用到的有关工具,主要包括基于Netbeans和Eclipse的集成开发环境、线程调度展示台和Java RTS Dtrace 探针。
本书基于RTSJ 102和Java RTS 21。Java RTS 22已于2009年9月发布。
希望能看到Java RTS的进一步发展和真正的实际应用。
在翻译过程中,得到了机械工业出版社华章分社的朋友陈冀康的大力帮助,在此表示感谢。
最后,我要感谢外甥女妞妞对我的支持和帮助。
由于时间有限,书中难免存在译释不当之处,恳请读者批评指正。
译者
2009年岁末于西山
译者序
前言
致谢
作者简介
第一部分实时计算概念
第1章实时系统概述
11实时系统质量
12可预见性和确定性
121确定延迟
122确定抖动
123硬实时与软实时
124等时实时
125实时与实快
126实时与吞吐量
127任务完成价值
13实时计算
131高速公路类比
132高速公路类比——添加优先车道
14实时调度
141调度约束
142调度算法
143实时操作系统
144RTPOSIX操作系统扩展
15参考资料
第2章实时与Java SE
21Java是实时语言吗
211无界定延迟和抖动的来源
212缺乏严格的线程优先级
22垃圾回收
221究竟什么是垃圾回收
222常见的垃圾回收算法
23Sun Java SE 6 HotSpot中的垃圾回收
231Java对象世代
232回收器
233内存分配
234安全点
235未来:垃圾优先( G1)
24实时垃圾回收算法
241基于工作的垃圾回收
242基于时间的垃圾回收
243汉瑞克森的垃圾回收
244Sun公司的Java实时系统中的RTGC
25Java的困境
第3章Java实时规范
31实时 Java 基础
32RTSJ内部机制
321调度
322内存管理
323资源共享
324异步事件处理(AEH)
325控制的异步转移
326物理内存访问
33可选的RTSJ工具
34实时Java 的未来
第4章Sun Java实时系统
41Java RTS程序设计的前奏
411操作系统支持
412Solaris与实时
413Linux与实时
42安装Java RTS
421Solaris 上的安装
422Linux上的安装
43确定性指南
431使用实时线程
432调整实时垃圾回收器
433关键预留内存
434处理器绑定
435编译Java RTS代码
436解释RTGC统计
437使用RTSJ的时钟 API
44命令行选项
441RTGC相关选项
442与内存相关的选项
443线程相关的选项
444异步相关选项
445编译器和解释器选项
446Java RTS优化选项
第二部分高级Java RTS
第5章线程、调度与新内存模型
51可调度对象
511实时调度器
512SchedulingParameters
513发布参数
52实时线程
521使用RealtimeThread
522使用NoHeapRealtimeThread
523实现周期线程
524错过最后期限处理程序
525实现非周期性线程
53内存模型
531内存访问规则
532作用域内存
533物理内存
第6章同步
61资源共享
611优先级倒置控制
612行动中的优先级继承
62非等待线程通信
621使用WaitFreeWriteQueue
622使用WaitFreeReadQueue
第7章实时时钟API
71Clock API
72Java RTS高精度时间操作
73叠加的股票数据提供的例子
第8章异步事件
81异步事件处理
82创建一个异步事件处理程序
821内部应用程序事件
822约束异步事件处理程序
823与事件触发计数一起工作
824处理POSIX事件
825指定内存区域
83基于时间的事件
831一次性定时器
832周期定时器
第9章异步控制转移和线程终止
91异步控制转移
911实现可中断代码
912实现Timed操作
92异步线程终止
第10章实时垃圾回收器内部机制
101RTGC操作理论
1011并发标记
1012并发清扫
1013并发清零
102RTGC内存分配
1021堆布局
1022线程局部分配缓冲器
1023对象分裂
1024数组分裂和缓存
103RTGC策略
1031全时RTGC策略
1032隔离的RTGC策略
1033基于时间的RTGC策略
1034孤立的RTGC策略
第三部分使用Java RTS
第11章证券交易系统
111股票市场
1111限价订单
1112止损订单
112交易系统实现
1121系统架构
1122交易引擎
113Java SE版本
1131MarketManager类
1132OrderManager类
114Java RTS 版本
115Java RTS 没有堆的版本
1151OrderManager类
1152MarketManager类
116应用程序配置
第12章Java RTS工具
121Java RTS开发
1211使用NetBeans插件进行远程调试
1212替代的开发环境
122线程调度展示台(TSV)
1221TSV日志文件格式
1222使用TSV日志文件
1223记录应用程序的事件
1224用TSV查看器工作
123Java RTS DTrace探针
1231用于Schedulable的DTrace探针
1232用于内存的DTrace探针
1233用于线程的DTrace探针
1234用于AsyncEventHandlers的DTrace探针
1235用于编译的DTrace探针
1236用于RTGC的DTrace探针
1237用于类加载的DTrace探针
1238用于VM活动的DTrace探针
1239特定应用程序的DTrace探针
参考文献