线程化和同步是 Java 编程语言的核心特性,Java 语言规范(JLS)中对二者作出了描述。RTSJ 用多种方式扩展了 JLS 的核心功能。(参见 参考资料 中关于 JLS 和 RTSJ 的链接。)例如,RTSJ 引入了一些新的实时(RT)线程类型,它们必须遵守比普通 Java 线程更加严格的调度策略。另一个例子是优先级继承,它是一种锁定策略,定义了锁竞争时如何管理锁同步。
理解对优先级和优先级序列的管理有助于理解 RTSJ 针对线程化和同步所作的更改。优先级也是 RT 应用程序使用的一种重要工具。本文通过讨论如何管理线程优先级和优先级序列来描述 RTSJ 线程化和同步。讨论了开发、部署和执行 RT 应用程序(包括使用 IBM WebSphere Real Time 开发的应用程序,参见 参考资料)时应该考虑的一些方面。
理解普通的 Java 线程
JLS 中定义的线程称为普通 Java 线程。普通 Java 线程是 java.lang.Thread 类的一个实例,该类拥有从 1 到 10 的 10 个优先级别。为了适应大量的执行平台,JLS 在如何实现、调度和管理普通 Java 线程的优先级方面提供了很大的灵活性。
WebSphere VMs on Linux(包括 WebSphere Real Time)使用 Linux 操作系统提供的本地线程化服务。您可以通过理解 Linux 的线程化和同步来学习 Java 的线程化和同步。
Linux 线程化和同步
Linux 操作系统发展至今已经提供了不同用户级别的线程化实现。Native POSIX Thread Library(NPTL)(参见 参考资料)是 Linux 最新版本的战略性线程化实现,由 WebSphere VMs 所使用。NPTL 与它的前任相比优势在于 POSIX 兼容性和性能。在编译时可通过系统的头文件获取 POSIX 服务。可在运行时通过 libpthread.so 动态库和底层 Linux 核心支持获取 POSIX 服务。Linux 核心可以根据静态控制(如线程优先级级别)和系统中执行的线程的某些动态条件下来执行线程调度。
POSIX 允许您创建具有不同线程调度策略和优先级的 POSIX 线程(pthreads)以满足不同应用程序的需求。下面是三种此类的调度策略:
SCHED_OTHER
SCHED_FIFO
SCHED_RR
SCHED_OTHER 策略用于传统用户任务,如程序开发工具、办公应用程序和 Web 浏览器。 SCHED_RR 和 SCHED_FIFO 主要用于具有更高的确定性和时限需求的应用程序。SCHED_RR 和 SCHED_FIFO 之间的主要区别是 SCHED_RR 分时间片 执行线程,而 SCHED_FIFO 则不是这样。SCHED_OTHER 和 SCHED_FIFO 策略用于 WebSphere Real Time,并在下面作出了更加详细的描述。(我们不介绍 SCHED_RR 策略,WebSphere Real Time 没有使用它。)
POSIX 通过 pthread_mutex 数据类型提供锁定和同步支持。pthread_mutex 可以使用不同的锁定策略创建。当多个线程需要同时获取同一个锁的时候,锁定策略常常会影响执行行为。标准的 Linux 版本支持单个的默认策略,而 RT Linux 版本还支持优先级继承锁定策略。我们将在本文的 同步概述 一节对优先级继承策略作更详细的描述。
Linux 调度和锁定用来管理先进先出(FIFO)队列。