在像JVM和CLR这样的虚拟机上,是否有类似于提供编程API的操作系统?

问题描述:

JVM和CLR是虚拟机。与裸机计算机机器类似,它们提供虚拟机器语言。在像JVM和CLR这样的虚拟机上,是否有类似于提供编程API的操作系统?

在真正的计算机上,我们有操作系统,它们提供系统调用和API。例如,着名的高级编程Unix环境描述了Unix和Linux提供的API。但是,Windows提供了不同的API。

像JVM和CLR虚拟机的顶部,有一些东西,

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

  • 提供编程API?

如果没有什么玩像JVM和CLR虚拟机操作系统的角色,什么提供的编程API(如那些用Java,C#,...)类似的OS API?

注意:我正在询问有关虚拟机的信息,而不是其中的底层。虚拟机不在其上运行一些虚拟操作系统吗?如果没有,为什么没有这样的需求?

谢谢。

+0

这两个虚拟机都在底层操作系统上运行,不是吗?您不能只将它们中的任何一个安装在带有空白格式化硬盘驱动器的系统上并运行任何东西。 (继续,试试吧,我们会等的) –

+0

我在询问关于虚拟机的信息,而不是基于它们。虚拟机不在其上运行一些虚拟操作系统吗? – Tim

+0

是的,他们这样做。您提到了Java和CLR虚拟机,并且我特别指出*这两种虚拟机都在底层操作系统*上运行。什么部分不明确? –

“操作系统”是一个很大的模糊的毛发球。你有hal,kernel,userspace ......我们是否也计算一些用户空间库(通常是libc)呢?

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

例如,这些天Thread通常是本机操作系统线程只是Java表示,但是一个JVM 可以选择实现在用户空间线程调度,并在Sun的JVM那样期间的1.1倍和一些其他JVM回来还是做今天。

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

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

操作系统使用设备驱动程序为类似设备(如处理器,内存,磁盘驱动器,网卡等)提供统一接口。操作系统使用系统调用来允许用户级代码与这些设备进行交互。如果您使用C语言编写代码,则在调用“close”之前,您将调用“open”,然后“读取”和“写入”设备。 'ioctl'(IO控制)系统调用也用于设备控制。每个操作系统都提供一组标准的系统调用(您可以在英特尔或ARM处理器上运行Linux,但每个发行版都有相同的系统调用)。顺便说一句,这也是Docker的工作原理,它使用一组标准的系统调用来使容器从一个平台移动到另一个平台而没有任何问题。

该操作系统还提供了同时运行多个进程的能力。对于更新的多核心机器,这确实可以并行发生,但操作系统也使用调度在多个进程或线程之间共享CPU。通过非常快速地切换流程或线程,即使在单个处理器上,也会产生同时发生的情况。

现在我们来看看JVM,这是一个用户级进程(从操作系统的角度来看,就像任何其他用户应用程序一样)。这已被设计为抽象出CPU并从Java应用程序中运行特定的功能。 Java编译器生成的字节码不包含任何系统调用。如果您查看字节码指令集(在Java虚拟机规范中定义),您会发现这些指令提供了许多熟悉的低级功能,例如加载寄存器,位操作等。另外,还有很多更高级别的指令,更具体地涉及Java;像invokestatic这样的在类上调用静态方法的东西,monitorenter。 monitorexit锁定,newarray等。

JVM需要这些字节码,并将它们从CPU和操作系统无关的形式(虚拟机的形式)转换为运行JVM的特定CPU架构和操作系统的指令。在某些情况下,这可能是一对一的映射(对于像位运算符这样的东西),但通常可能更加复杂,并且涉及使用系统调用来打开文件,访问网络接口等.JVM还使用OS来处理由应用程序创建的线程。在Java早期的操作系统(如Windows 95)中没有线程的概念,因此JVM必须提供它自己的实现(这被称为绿色线程并且执行得非常糟糕)。

总结JVM需要它正在执行的类文件的平台中性byt代码,并将它们转换为本机CPU指令和系统调用以使应用程序运行。 JVM不提供任何传统的OS服务,它只是使用它们。

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

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

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