如何区分 z/OS 上的 Java 和 z/OS 上的 Linux 上的 Java?

How to distinguish Java on z/OS from Java on Linux on z/OS?

在 IBM Z 系统上 z/OS 上的 Java 和 Linux 上的 Java 是否可以通过 os.name and/or os.arch属性? z/OS 的 UNIX 服务怎么样,它有独特的 Java 分布吗?

更新 1

我的理解是 z/OS 使用点或冒号 (?) 作为路径组件分隔符,而 Unix-like 子系统使用斜线。我的期望是 z/OS 有 Java,它使用 z/OS 具有的任何本机 C 库和可执行文件格式,使用 dot/colon 作为分隔符,而 z/OS IBM Z 上的 UNIX 子系统和 Linux 使用 POSIX 兼容的 C 库并使用 ELF 作为可执行格式。我希望有两种不同的 JRE,一种用于 z/OS Linux,另一种用于 z/OS UNIX 服务子系统。我的期望是 ELF 文件格式 header 中的 EI_OSABI 字段对于 Linux 和 z/OS UNIX 子系统是不同的,因此应该有两个不同的 Java 发行版.

是否有 z/OS Java 在任何 Unix-like 子系统之外运行?

试图概述 Linux,尤其是 Z 系统上的 Linuxz/OS 不同(或不同)。我需要简化很多才能使其保持合理的简短。

更新 1:更改了一些措辞以使其更加清晰,并更正了拼写错误。

Linux,以及 Z 系统上的 Linux

Linux 是一个 UNIX-like 操作系统,最初是为基于 Intel 的系统开发的(我认为)。后来,它可用于其他硬件平台,IBM Z Systems 硬件就是其中之一。在 IBM 大型机硬件或 IBM Z Systems 上 运行 的 Linux 对于 System Z[= 称为 Linux 89=],或 IBM Z 上的 Linux;为简洁起见,我将其称为 zLinux

Linux 是 Linux,无论它 运行 在什么平台上。这主要适用于:安装方式、配置方式、运行 方式、API 提供的内容等。在硬件配置或引导方面可能存在差异。对于 zLinux.

尤其如此

由于 API 是相同的,它在 应用程序级别 上提供源代码可移植性。在这种情况下,我认为 Java JVM 是一个应用程序。简化这意味着,您获取源代码,运行 通过为目标平台生成二进制文件的编译器,您就完成了。

您可以选择做的是针对目标平台的代码优化,可能会加快速度。从这个意义上说,zLinux 的 Java JVM 在幕后的工作方式可能与英特尔 PC 平台的 Java JVM 不同(我实际上不知道,如果这是是否如此)。但这对 Java 应用程序无关紧要。

运行 UNIX 上的程序(例如 Linux)

一个程序 运行 在 UNIX 系统上 运行 作为 进程 运行。简而言之,术语 process 包括控制结构和虚拟地址 space(内存,进程映像)。对于 运行 另一个程序,某些程序已经 运行ning 需要 fork(),然后 exec()。这将为该程序创建一个新进程。

UNIX内核做进程管理(程序运行s作为进程),dispatching/undispatchingonto/from一个处理器,内存管理,文件系统管理,优先级管理,用户和组管理使用数字 uid 和数字 gid 等

z/OS

z/OS 是 IBM 的大型机操作系统之一,运行 在 IBM Z Systems 硬件上。尽管 Z 系统上的 运行ning 与 zLinux 一样,但 z/OS 与 Linux 或 UNIX 系统没有太多共同之处。安装、配置和 运行ning z/OS 完全不同。

z/OS MVS(没有 z/OS UNIX 系统服务)

MVS,诞生于 1964 年,是任何 z/OS 系统的组成部分。这有点像内核之于 UNIX 系统。 MVS 提供了 APIs 程序 运行ning on z/OS call。我在这里称这样的程序为MVS程序。这些 API 与 UNIX API 完全不同。因此,即使硬件相同,二进制文件也不可交换。您不能轻易地将 UNIX 程序移植到 z/OS MVS 程序;你必须从头开始重写。

MVS做任务管理(程序运行作为任务),dispatching/undispatchingonto/from一个处理器,内存管理,数据集管理( MVS 不理解“UNIX 文件系统”)、优先级管理、使用字母数字用户标识和字母数字组名等的用户和组管理等

z/OS UNIX 系统服务

在1990年代初期,IBM希望更容易将流行的UNIX程序移植到z/OS,因此添加了UNIX APIs,并将这部分(最终)称为z/OS UNIX 系统服务,简称z/OS UNIX。它于 1994 年问世。z/OS UNIX 是 z/OS(也称为 OMVS)的另一个组件。它不是一个完整的 UNIX 内核,只是在 MVS 的基础上增加了 UNIX 所需要的,MVS 所没有的,最重要的是进程管理、数字 uid 和 gid,以及一个 UNIX-like 文件系统。

IBM 添加了成为 xOpen 和 Posix 兼容操作系统所需的一切。现在,您不必在 z/OS 上将 UNIX 程序重写为 运行,您可以或多或少地轻松移植它。仍然有一些差异需要处理,最重要的是可怕的 EBCDIC - ASCII 差异。但是 API 调用是 1:1,前提是该程序仅使用兼容的 APIs。

运行 z/OS

节目

节目一共有三种:

  1. 对UNIX一无所知的程序,只使用MVSAPIs,处理MVS数据集I/O。我们称它们为 MVS 程序.
  2. 从 UNIX 移植过来的程序,或者由只懂 UNIX 而对 MVS 一无所知的人编写的程序,只能使用UNIX APIs,并为 I/O 处理 UNIX 目录和文件。我们称它们为 纯 z/OS UNIX 程序。 (好吧,这个类别实际上并不存在,请参阅下面的 *)。
  3. 同时了解 MVS 和 z/OS UNIX 的程序调用 MVS 和 z/OS UNIX APIs,并处理 MVS 数据集以及 UNIX 目录, 和文件。我们称它们为 混合模式 pograms.

*) 每个程序都需要内存,每个程序最终都希望在处理器上运行。内存管理和任务管理是由 MVS 提供的,而不是 UNIX 内核,所以在不知不觉中,程序在幕后调用了 MVS APIs。结论:没有所谓的“纯 z/OS UNIX 程序”。这只剩下类别 1 和类别 3。

所有这些程序都存储为程序对象,并作为成员驻留在加载库(数据集)中,或者作为 UNIX 文件系统中的文件。当 运行 时,可执行文件从任一源加载到 MVS 地址 space,并作为 任务 启动。所有程序都作为 MVS 任务进行管理,具有所有 MVS 属性,加上上面的案例 3,还具有 UNIX 属性(进程 id、uid、gid 等)。

类型 1 的程序在 运行 调用 UNIX API 时立即变为类型 3。因此,不存在诸如墙、边界或子系统之类的东西。都是MVS程序,也可能同时是UNIX程序。

Java 在 z/OS

运行 在 z/OS 上的 Java JVM 也不例外。它已被移植到 z/OS,因为这更容易,作为 z/OS UNIX 程序(好吧,“混合模式程序”,你现在应该知道了)。它针对硬件 在许多方面 z/OS 的细节进行了优化。但是对于 Java 应用程序来说并没有什么不同。 Java 应用程序不是二进制文件,因此在任何 Java JVM 上都是相同的 Java byte-code 运行(有例外)。