关于 NSPR¶
NetScape 可移植运行时 (NSPR) 为非 GUI 操作系统的设施提供了平台独立性。这些设施包括线程、线程同步、普通文件和网络 I/O、间隔计时和日历时间、基本内存管理 (malloc 和 free) 以及共享库链接。
历史¶
该库的大部分用途,也许在 Gromit 环境中的主要用途,是为 Java VM 提供基础,或多或少地映射 Sun 为将 Java VM 移植到各种平台而定义的 *sys 层*。NSPR 在某些方面超出了此要求,并且由于它也是 Netscape 生产的大多数服务器的平台独立层。因此,预期并建议将现有代码重构,甚至可能重写,以便使用 NSPR API。提供一个用于将外部开发的代码移植到 Netscape 的平台不是目标。
在撰写本文时,当前一代的 NSPR 被称为 NSPR20。第一代 NSPR 最初是为了满足将 Java 移植到各种主机环境的要求而构思的。NSPR20 是 1996 年开始的一项工作,建立在最初的想法之上,尽管原始代码所剩无几。(“NSPR20”中的“20”并不表示“版本 2.0”,而是表示“第二代”。)许多概念已经改革、扩展和成熟。如今,NSPR 仍然可能适合作为 Java 下的平台相关层,但其主要应用是支持完全用 C 或 C++ 编写的客户端。
工作原理¶
NSPR 的目标是在广泛的操作系统环境中提供统一的服务。它力求不导出 *最低公分母*,而是利用其运行的每个操作系统的最佳功能,并仍然在广泛的主机产品中提供统一的服务。
线程¶
线程是 NSPR 的主要功能。业界提供的线程种类繁多。NSPR 虽然远非完美,但确实提供了一个单一的 API,客户端可以对其进行编程并期望获得合理一致的行为。操作系统提供的功能从根本上不理解线程的概念到包括复杂、可扩展和高效的实现。NSPR 尽可能地利用系统提供的功能。NSPR 的目标是 NSPR 在访问这些适当的系统功能时尽可能减少开销。
线程同步¶
线程同步松散地基于 C.A.R. Hoare 在 *Monitors: An operating system structuring concept*,Communications of the ACM,17(10),1974 年 10 月中描述的监视器,然后由 Xerox Mesa 编程语言(“Mesa Language Manual”,J.G. Mitchell 等,Xerox PARC,CSL-79-3(1979 年 4 月))正式化。此机制提供了 NSPR 实现的基本互斥 (mutex) 和线程通知功能(条件变量)。此外,NSPR 提供了更适合 Java 使用的同步方法。类似 Java 的功能包括监视器 *重入*、隐式和紧密绑定的通知功能以及能够动态关联同步对象的功能。
I/O¶
NSPR 的 I/O 是一个稍微增强的 BSD 套接字模型,允许任意分层。它最初旨在仅导出同步 I/O 方法,依靠线程为复杂应用程序提供所需的并发性。这种操作方法是首选,尽管可以将网络 I/O 通道配置为传统意义上的 *非阻塞*。
网络地址¶
NSPR 的一部分涉及网络地址的操作。NSPR 定义了一个以互联网协议 (IP) 为中心的网络地址对象。虽然该对象未声明为不透明的,但 API 提供了允许和鼓励客户端将地址视为多态项的方法。这方面的目标是在 IPv4 和 IPv6 之间提供迁移路径。为此,可以将 ASCII 字符串(DNS 名称)转换为 NSPR 的网络地址结构,而无需考虑寻址技术是 IPv4 还是 IPv6。
时间¶
计时功能有两种形式:间隔计时和日历函数。
间隔计时器基于一个自由运行的、32 位的、平台相关的分辨率计时器。此类计时器通常用于为 I/O 指定超时、等待条件变量和其他基本的线程调度。由于这些计时器具有有限的命名空间并且是自由运行的,因此它们可以随时包装。NSPR 不提供 *纪元*,但期望客户端处理此问题。计时器的 *粒度* 保证在 10 微秒到 1 毫秒之间。这允许大约 12 小时的最小计时器 *周期*。但是为了处理环绕问题,只能使用一半的命名空间。因此,计时器可用的最小可用间隔略小于六小时。
日历时间是 64 位有符号数字,单位为微秒。日历时间的 *纪元* 是格林威治标准时间 1970 年 1 月 1 日午夜。负时间扩展到 1970 年之前的年份,正数则向前扩展。使用 64 位允许大约在 -30000 年到 30000 年之间表示时间。有一个结构化表示(*即展开*视图)、获取主机系统当前时间的例程,以及在 64 位和结构化表示之间进行转换。此外,还有例程将最知名的 ASCII 形式转换为 64 位 NSPR 表示形式。
内存管理¶
NSPR 提供 API 来执行基本的 malloc、calloc、realloc 和 free 函数。根据平台的不同,这些函数可能几乎完全在 NSPR 运行时实现,或者只是调用到主机操作系统的提供的简单垫片。
链接¶
对链接(共享库加载和卸载)的支持是 NSPR 功能集的一部分。在大多数情况下,这仅仅是对各种平台提供商提供的设施的平滑处理。
未来发展方向¶
NSPR 适用于编写需要移植到多个平台的线程应用程序的平台。
NSPR 功能完整,并已进入持续工程模式。随着操作系统供应商发布其操作系统的新版本,感兴趣的参与者将使 NSPR 迁移到这些新版本。