【问题标题】:On virtual machines like JVM and CLR, is there something similar to an operating system, which provides programming APIs?在 JVM 和 CLR 等虚拟机上,是否有类似于操作系统的东西,提供编程 API?
【发布时间】:2018-01-19 23:51:26
【问题描述】:

JVM 和 CLR 是虚拟机。与裸机计算机类似,它们提供虚拟机语言。

在真正的计算机上,我们有提供系统调用和 API 的操作系统。例如,著名的《Advanced Programming Unix Env​​ironment》一书描述了 Unix 和 Linux 提供的 API。但是,Windows 提供不同的 API。

在像 JVM 和 CLR 这样的虚拟机之上,有什么东西

  • 扮演操作系统的角色,并且

  • 提供编程 API?

如果在 JVM 和 CLR 等虚拟机上没有任何东西扮演操作系统的角色,那么是什么提供类似于操作系统 API 的编程 API(例如 Java、C# 中的 API)?

注意:我问的是虚拟机及其之上,而不是它们的底层。虚拟机不是在它们之上运行一些虚拟操作系统吗?如果没有,为什么没有这个需求?

谢谢。

【问题讨论】:

  • 这两个虚拟机都运行在底层操作系统上,不是吗?您不能将它们中的任何一个安装在具有空白的格式化硬盘驱动器的系统上并运行任何东西。 (来吧,试试吧。我们会等的。)
  • 我询问的是虚拟机及其之上,而不是它们的底层。虚拟机不是在它们之上运行一些虚拟操作系统吗?
  • 是的,他们有。您提到了 Java 和 CLR 虚拟机,我特别提到 这两个虚拟机都运行在底层操作系统上。哪一部分不清楚?
  • 您没有回答的是:是否有虚拟操作系统在虚拟机之上运行?虚拟机是裸机的虚拟化,什么是虚拟机上运行的真实操作系统的虚拟化?如果没有,为什么没有这种需要?
  • 没有。 下面有一个操作系统在运行,它提供底层功能。例如,在 Windows 上运行的 CLR 会路由到 WIndows 操作系统的底层功能,而在 Linux 上运行时会路由到 Linux 内核中的功能。您将 Java/CLR VM 与创建虚拟化硬件的 计算机 VM 混淆了。它们不是一回事。

标签: jvm virtual-machine clr


【解决方案1】:

虚拟机有two kinds个:系统虚拟机和进程虚拟机。系统虚拟机提供完整指令集的虚拟化,包括用户模式指令和内核模式指令,因此它们可以运行操作系统。进程虚拟机虚拟化用户模式指令,通常还有一些系统调用(例如用于管理线程、内存和文件的系统调用),因此只能运行应用程序或进程。也就是说,在单个进程虚拟机之上,可以运行单个应用程序或进程。 JVM 和 CLR 是进程虚拟机。

虽然理论上确实可以开发一个OS 以在进程虚拟机上运行,​​但这实际上没有用,因为将在该操作系统上运行的程序的性能会很糟糕,因为过度分层软件。

通常,系统和进程虚拟机本身不被视为操作系统。但是,进程虚拟机不一定需要操作系统才能运行,也可以在裸机计算机上运行。 .NET Micro Framework 是此类 VM 的一个示例。 Such VMs are sometimes called operating systems。一些virtual ISAs 或其子集已完全在类似于x86 和ARM 的硬件中实现。人们可以开发操作系统来运行它们。由于性能低下,它们几乎从未在工业中使用。

【讨论】:

    【解决方案2】:

    “操作系统”是一个大而模糊的毛球。你得到了 hal、内核、用户空间……我们是否也计算了一些用户空间库(通常是 libc)?

    通过眯眼,您可以在 JVM/JRE 中找到一些类似的概念,但通常 JVM 运行在真正的操作系统之上,因此不会重新实现所有方面,而是简单地提供与平台无关的抽象,而不是您可以使用的设施几乎可以在所有系统上找到。

    例如现在Thread 通常只是本地操作系统线程的java表示,但是JVM 可以选择在用户空间和sun的JVM中实现线程调度在 1.1 时期确实回来了,而其他一些 JVM 在今天仍然如此。

    【讨论】:

      【解决方案3】:

      我将从Java的角度回答这个问题,因为我对.Net没有深入的了解。但是,从这个角度来看,我会假设 CLR 和 JVM 是相似的。

      让我们从操作系统开始。这样做的目的是抽象出特定于硬件的接口,并为进程提供运行时环境。

      操作系统使用设备驱动程序为类似设备(如处理器、内存、磁盘驱动器、网卡等)提供统一的接口。操作系统使用系统调用来允许用户级代码与这些设备进行交互。如果您使用 C 编写代码,您将调用“打开”,然后在调用“关闭”之前对设备进行“读取”和“写入”。 'ioctl'(IO 控制)系统调用也经常用于设备控制。每个操作系统都提供一组标准的系统调用(您可以在 Intel 或 ARM 处理器上运行 Linux,但每个发行版都有相同的系统调用集)。顺便说一句,这也是 Docker 的工作方式,它使用一组标准的系统调用使容器能够毫无问题地从一个平台移动到另一个平台。

      操作系统还提供同时运行多个进程的能力。对于较新的多核机器,这确实可以并行发生,但操作系统也使用调度在多个进程或线程之间共享 CPU。通过非常快速地切换进程或线程,这给人的印象是事情是同时发生的,即使在单个处理器上也是如此。

      现在让我们看看 JVM,它是一个用户级进程(从操作系统的角度来看,就像任何其他用户应用程序一样)。这旨在从 Java 应用程序中抽象出 CPU 和操作特定功能。 Java 编译器生成的字节码不包含任何系统调用。如果您查看字节码指令集(在 Java 虚拟机规范中定义),您会发现这些指令提供了许多熟悉的低级功能,例如加载寄存器、位操作等。此外,还有许多更高级且与 Java 更具体相关的指令;像调用静态方法的调用静态方法,monitorenter。 monitorexit 用于锁定、newarray 等。

      JVM 获取这些字节码,并将它们从独立于 CPU 和操作系统的形式(虚拟机的形式)转换为运行 JVM 的特定 CPU 架构和操作系统的指令。在某些情况下,这可能是一对一的映射(例如按位运算符),但通常要复杂得多,并且涉及使用系统调用来打开文件、访问网络接口等。JVM 还使用操作系统来处理应用程序创建的线程。在 Java 操作系统(如 Windows 95)的早期,没有进程内线程的概念,因此 JVM 必须提供它自己的实现(这被称为绿色线程,性能很差)。

      总而言之,JVM 获取它正在执行的类文件的平台无关字节码,并将它们转换为适当的本机 CPU 指令和系统调用,以使应用程序运行。 JVM 不提供任何传统的操作系统服务,它只是使用它们。

      【讨论】:

        猜你喜欢
        • 2017-12-26
        • 2010-10-11
        • 2023-01-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        相关资源
        最近更新 更多