为什么操作系统不是用java编写的?

时间:2015-04-11 16:23:28

标签: java

到目前为止,所有操作系统都是用C / C ++编写的,而Java中没有。有大量的Java应用程序,但不是操作系统。为什么?

5 个答案:

答案 0 :(得分:8)

因为我们已经拥有操作系统,主要是。 Java并不是设计用于在裸机上运行,​​但这并不像最初看起来那么大。由于C编译器提供了编译为特定指令的内部函数,因此Java编译器(或JIT,在此上下文中区别没有意义)可以做同样的事情。处理GC和内存管理器的交互也有点棘手。但它可以做到。结果是一个内核,它有95%的Java并且可以运行jar。下一步是什么?

现在是编写操作系统的时候了。设备驱动程序,文件系统,网络堆栈,以及使计算机可以执行操作的所有其他组件。 Java标准库通常严重依赖系统调用来完成繁重的工作,因为它必须这样做,因为运行计算机是一件痛苦的事情。例如,编写一个文件涉及以下层(至少,我不是操作系统的人,所以我肯定错过了一些东西):

  1. 文件系统,必须为文件找到空间,更新其目录结构,处理日志,最后决定需要写入哪些磁盘块以及按什么顺序编写。
  2. 阻止层,必须安排并发写入和读取以最大化吞吐量,同时最大化公平性。
  3. 设备驱动程序,它必须让设备保持高兴并将其放在正确的位置以使事情发生。当然,每个设备都以自己特殊的方式打破,需要自己的驱动程序。
  4. 所有这一切都必须正常工作,并保持十几个线程访问磁盘的性能,因为磁盘本质上是一堆巨大的共享可变状态。

    最后,你已经拥有了Linux,除了它不能正常工作,因为它没有在功能和性能方面投入太多精力,而且它只运行Java。可能你从单个地址空间和没有内核/用户空间的区别中获得了性能,但是增益不值得付出努力。

    有一个特定语言操作系统有意义的地方:虚拟机。让底层操作系统处理运行计算机的困难部分,租户操作系统处理将虚拟机转换为执行环境。 BareMetalMirageOS遵循此模型。你为什么要这样做而不是使用Docker呢?这是一个很好的问题。

答案 1 :(得分:3)

确实有一个JavaOS http://en.wikipedia.org/wiki/JavaOS

这里讨论为什么没有很多用java Is it possible to make an operating system using java?

编写的操作系统

简而言之,Java需要在JVM上运行。 JVM需要在OS上运行。使用Java编写OS不是一个好的选择。

操作系统需要处理使用java无法实现的硬件(除了使用JNI)。这是因为JVM只提供了可以在Java中使用的有限命令。这些命令包括添加,调用方法等。但是处理硬件需要命令直接操作reg,内存,CPU,硬件驱动程序。 JVM中不直接支持这些,因此需要JNI。这是回到开始 - 仍然需要使用C / assembly编写OS。

希望这有帮助。

答案 2 :(得分:3)

对于操作系统,您需要工作真正的低级别。这是Java的痛苦。你确实需要,例如无符号数据类型,Java只有签名数据类型。您需要具有驱动程序所期望的内存对齐的struct个对象(并且没有像Java这样的对象标头添加到每个对象)。

即使Java本身的关键组件也不再用Java编写。

这绝不是一件临时的事情。越来越多的东西会在本机代码中重写,以获得更好的性能。 HotSpot VM为性能关键的本机代码添加了“内在函数”,并且正在开展工作以降低本机调用的总体成本。

例如 JavaFX :之所以比AWT / Swing快得多,是因为它包含/使用了大量的本机代码。它依赖于本机代码进行渲染,例如如果你添加“webview”浏览器组件,它实际上是使用webkit C库来提供浏览器。

Java做的很多事情都很好。它是一种结构良好的语言,带有梦幻般的工具链。 Python编写起来要紧凑得多,但它的工具链很麻烦,例如:重构工具令人失望。 Java闪耀的地方是在运行时优化多态性。 C ++编译器需要进行昂贵的虚拟调用 - 因为在编译时不知道将使用哪种实现 - Hotspot可以积极地内联代码以获得更好的性能。但对于操作系统,您不需要这么多。您可以负担得起手动优化呼叫站点和内联。

答案 3 :(得分:1)

这个答案并不意味着以任何方式详尽无遗,但我想就(非常广泛的)主题分享我的想法。

虽然理论上可以在纯java中编写一些操作系统,但实际问题却使这项任务变得非常困难。主要问题是没有(当前最新且可靠的)java编译器能够将java编译为字节代码。所以没有现成的工具可以让我在java中完全编写一个完整的操作系统,至少就我的知识而言。

Java旨在在java虚拟机的某些实现中运行。存在Windows,Mac,Linux,Android等的实现。语言的设计强烈地基于JVM存在的假设并且将在运行时为您做一些魔术(想想垃圾收集,JIT编译器,反射等。 )。这很可能是这种编译器不存在的部分原因:所有这些功能都将在哪里出现?编译成字节码?这是可能的,但在这一点上,我认为这很难做到。甚至Android,其SDK纯粹基于Java,在Linux内核上运行Dalvik(支持该语言子集的JVM版本)。

答案 4 :(得分:1)

使用Java的一个主要好处是抽象出许多您通常不需要关心的低级细节。它是构建操作系统时所需的详细信息。因此,虽然你可以通过解决这个问题来编写一个用Java编写的操作系统,但它会有很多限制,而且你花了很多时间来与语言及其初始设计原则作斗争。