【问题标题】:Why operating systems are not written in java?为什么操作系统不是用java编写的?
【发布时间】:2015-06-17 06:41:15
【问题描述】:

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

【问题讨论】:

  • 许多操作系统都是用 C 或 C++ 以外的语言编写的。人们在之前 C 和C++ 编写操作系统。不过,对于这个用例,Java 似乎是一个特别糟糕的选择。
  • 已经有Jx了。奇怪的是,Java 的可变对象实例和通过 类加载 实现的黑白安全性以及整数溢出之类的东西并不安全 足够 我推荐它来实现安全的操作系统,乍一看似乎最适合。

标签: java


【解决方案1】:

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

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

  1. 文件系统,它必须为文件找到空间,更新其目录结构,处理日志,最后决定需要写入哪些磁盘块以及以什么顺序写入。
  2. 块层,它必须调度并发写入和读取以最大限度地提高吞吐量,同时最大限度地提高公平性。
  3. 设备驱动程序,它必须保持设备运行良好并将其插入正确的位置以使事情发生。当然,每个设备都以自己的特殊方式损坏,需要自己的驱动程序。

所有这一切都必须正常工作并在十几个线程访问磁盘时保持高性能,因为磁盘本质上是一大堆共享的可变状态。

最后,你得到了 Linux,只是它运行得不太好,因为它没有在功能和性能上投入那么多精力,而且它只运行 Java。您可能会通过使用单一地址空间而不区分内核/用户空间来获得性能,但所获得的收益并不值得付出努力。

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

【讨论】:

    【解决方案2】:

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

    这里是讨论为什么没有很多用java编写的操作系统Is it possible to make an operating system using java?

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

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

    希望这会有所帮助。

    【讨论】:

    • 看来这应该是一条评论。此外,JavaOS 已停产
    • 在我看来,必须对操作系统的某些部分使用汇编并不能否定操作系统的其余部分 是用另一种语言(Java、C#、等等)。我还没有看到一个操作系统(甚至是基于 C 或 C++ 的操作系统) 至少包含一点汇编代码。它几乎不需要整个事情“回到开始”。另外,请记住:没有什么能阻止您将 Java 编译为机器码。
    • 我记得在 2000 年代末,VMWare 尝试推出一种直接在 ESX 服务器上运行 JVM 的技术,中间没有任何 SO。
    【解决方案3】:

    对于操作系统,您需要在底层工作。这在 Java 中是一个痛苦。你确实需要例如无符号数据类型,而Java只有有符号数据类型。您需要 struct 具有驱动程序期望的内存对齐的对象(并且没有像 Java 这样的对象头添加到每个对象)。

    甚至 Java 本身的关键组件也不再用 Java 编写。

    这绝不是暂时的。越来越多的东西被用本机代码重写以获得更好的性能。 HotSpot VM 为性能关键的本机代码添加了“内在函数”,并且正在努力降低本机调用的总体成本。

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

    Java 在很多方面做得非常好。它是一种结构良好的语言,具有 fantastic 工具链。 Python 写起来更紧凑,但它的工具链是一团糟,例如重构工具令人失望。 Java 的亮点在于在运行时优化多态性。在 C++ 编译器需要进行昂贵的虚拟调用的地方——因为在编译时不知道将使用哪个实现——Hotspot 可以积极地内联代码以获得更好的性能。但是对于操作系统,您不需要这么多。您可以手动优化调用站点和内联。

    【讨论】:

      【解决方案4】:

      使用 Java 的主要好处之一是可以抽象出许多您通常并不真正需要关心的低级细节。这是构建操作系统时需要的那些细节。因此,虽然您可以解决这个问题以用 Java 编写操作系统,但它会有很多限制,并且您会花费大量时间与该语言及其初始设计原则作斗争。

      【讨论】:

        【解决方案5】:

        此答案并不意味着详尽无遗,但我想分享我对(非常广泛的)主题的想法。

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

        Java 被设计为在 Java 虚拟机的某些实现中运行。存在适用于 Windows、Mac、Linux、Android 等的实现。该语言的设计强烈基于 JVM 存在并且会在运行时为您做一些魔术的假设(想想垃圾收集、JIT 编译器、反射等)。 )。这很可能是这样的编译器不存在的部分原因:所有这些功能将去哪里?编译成字节码?这是可能的,但在这一点上,我相信这将很难做到。即使是纯基于 Java 的 SDK 的 Android 也可以在 Linux 内核上运行 Dalvik(支持该语言子集的 JVM 版本)。

        【讨论】:

          猜你喜欢
          • 2010-11-08
          • 2012-02-06
          • 2020-02-10
          • 1970-01-01
          • 1970-01-01
          • 2017-06-03
          • 1970-01-01
          • 2010-11-21
          • 2018-04-26
          相关资源
          最近更新 更多