【问题标题】:Java runtime vs OS callsJava 运行时与操作系统调用
【发布时间】:2010-10-18 14:44:00
【问题描述】:

Java 运行时提供一组标准系统库供程序使用。这些库与操作系统的系统调用有什么相似之处,又有什么不同???

【问题讨论】:

    标签: java operating-system runtime


    【解决方案1】:

    java 的一半目的是让它独立于平台,所以它试图做的是提供一个无论其下的操作系统如何都保持不变的 api。

    如果操作系统功能不足,Java 会添加库代码来弥补。

    如果操作系统有一个不映射的实现,Java 会尽力映射它。

    如果新功能变得流行并且 Java 用户需要提供对其的访问权限,则可以创建一个新库,您可以通过该库访问新功能。如果这个库很受欢迎,它会在某个时候进行重组并添加到 Java SDK 中

    例如,一些并发库的实现变得流行起来,很快它们就被投票通过并添加到标准库中。这种情况经常发生。

    【讨论】:

      【解决方案2】:

      这显然取决于您运行的操作系统,因为每个操作系统的系统调用通常都不同:-)。

      也就是说,我相信 Java 主要是受到 Unix 约定的启发(并不奇怪,因为 Sun 是 Unix 供应商),所以一些 Java 系统库类似于 Unix 系统调用。

      例如java.nio.MappedByteBuffer 可能是受到 Unix 的 mmap() 调用的启发。但最终大多数概念都存在于大多数操作系统上,因此您无法真正说出是什么启发了什么。

      【讨论】:

        【解决方案3】:

        Java 的一些“低级”函数基本上是某些操作系统的“包装器” 系统调用。

        我没有看到“比较”两者的客观方式(和理由)。

        如果你对这个话题感兴趣,可以搜索Java源码 native 关键字,表示某些“隐藏” (主要是操作系统相关的)功能。

        【讨论】:

          【解决方案4】:

          与原生库相比,Java 的标准库通常具有相似的功能集,但有几个重要的区别。

          1. Java 是面向对象的,不管你喜欢与否。这样做的好处是某些概念更容易管理。例如,大多数与文件相关的操作都可以直接在 File 对象中找到。将此与 Posix 进行比较,其中 FILE 是一个句柄,实际上只是一个数字;进程的打开文件列表的索引。 Posix 方法非常接近操作系统的实际实现方式。但在 Java 中,您看不到、不知道或不在乎。
          2. Java 在某些情况下具有某些最低公分母行为。有许多 AWT API 就是它们的样子,因为 AWT 需要在许多不同的平台上是相同的。事实证明那是疯狂的,Sun 几乎弃用了大部分 AWT,因为支持平台同样意味着糟糕地支持每个平台。较新的库 Swing 几乎在纯 Java 中实现了所有内容,因此在跨平台方面做得更好,因此具有更丰富的 API。该 API 与本机窗口库非常不同。此外,Swing 集成得不太好,因为它使用的本机操作系统太少。
          3. Java 有一些本地库没有的限制。例如,您没有函数指针。因此,您有 ListenersRunnable 以及其他 Java 模式来执行 C++ 中涉及函数指针的事情。因此,任何需要这些功能之一的 API 在 Java 中都将与在本机操作系统中显着不同。

          因此,总而言之,Java 的库通常提供与本机操作系统类似的行为,有时甚至提供完全不同的行为,但最好将 Java 本身视为一个平台。有时您需要高级性能,例如 OpenGL 或超快速数据传输,在这种情况下,您需要特定的 Java API(Jogl、nio),但大多数时候您应该将 Java 视为自己的东西。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-08
            • 2013-02-01
            • 1970-01-01
            • 2015-04-16
            • 1970-01-01
            • 2011-05-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多