【问题标题】:Difference between runtime and kernel?运行时和内核之间的区别?
【发布时间】:2019-07-10 14:20:35
【问题描述】:

我正在阅读这个 docker 教程:

需要注意的是,Docker 容器不是在自己的虚拟机中运行,而是共享一个 Linux 内核。与虚拟机相比,容器使用更少的内存和 CPU。

但是,Docker 需要 Linux 运行时。 macOS 和 Windows 10 等非 Linux 平台上的实现使用单个 Linux 虚拟机。容器共享这个系统。

我想知道 linux 内核和 linux 运行时之间有什么区别。

我找到的内核定义:

内核是操作系统的最低层。内核是操作系统的主要部分,负责将命令翻译成计算机可以理解的东西。

我找到的运行时定义:

运行时是程序运行(或可执行)的时间。也就是说,当您启动在计算机中运行的程序时,它是该程序的运行时。在某些编程语言中,某些可重用程序或“例程”被构建并打包为“运行时库”。这些例程可以在任何程序运行时链接和使用。

【问题讨论】:

    标签: kernel runtime


    【解决方案1】:

    tl;dr:没有区别,Linux 内核是一种运行时。

    详细解释:

    运行时

    引用的定义不是“运行时”的一个很好的定义。在软件构建上下文中,运行时是软件获取您构建的软件,对其进行解释并(通常)逐条执行它。

    例如,当您为 Java 构建 jar 文件时,它们包含一种称为“Java 字节码”的语言的指令,而在 Java 程序运行时执行这些指令的运行时是 JVM。

    当您编写 Python 脚本时,执行这些 Python 指令的运行时是 Python 解释器。

    操作系统和加载

    运行时还具有将程序从文件加载到可以解释的形式的作用。

    当您用 C 语言构建程序时,它会被编译为机器代码,该机器代码不被任何软件解释,而是直接由硬件 (CPU) 解释。这样的程序有时被称为“本机”。但是,C 标准库通常不与您的软件捆绑在一起,它们必须独立存在于运行您​​的代码的机器上,这些有时也称为“C 运行时”,部分原因是它们包含每个 C 程序的引导代码.

    即使是这样的本机程序也被编译成本机可执行格式(Linux 使用的称为 ELF),操作系统内核必须知道如何将该格式读入指令并以 CPU 可以解释的方式加载它们 &执行它们。因此,操作系统也是运行时。 (请注意,虽然 OS 内核是 OS 的主程序,但通常其他程序也是此运行时的一部分,例如动态链接器。)

    如您所见,运行时通常是堆叠的:您可以让 Intel x86 硬件运行 MacOS 内核,运行虚拟机管理程序,运行运行 JVM 的 Linux 虚拟机。

    Docker 运行时

    现在,您将遇到的所有 docker 映像都是基于 Linux 的。这些镜像中安装的所有本机程序,包括 JVM 和 Python 解释器等运行时,都是为 Linux 编译的本机程序(即 ELF 可执行文件)。

    在 Linux 中运行 docker 容器时,需要发生两件事:

    首先,docker 需要设置一个容器(设置诸如覆盖文件系统和控制组之类的东西)。

    其次,docker 需要以某种方式让容器中的一些 (ELF) 可执行文件(例如 JVM 或您的本机容器化 C 程序)运行。

    这两件事都归于“程序加载”类别,这是运行时的责任。

    Linux 是唯一具有所有这些功能的操作系统内核 - 覆盖文件系统、控制组和 ELF 加载 - 由 docker 使用。

    在例如MacOS,这些技术不存在(AFAICT),因此为了运行 docker 容器,docker 需要在 Linux 虚拟机中运行其容器,该虚拟机充当可以加载图像的运行时。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2016-01-23
      • 2012-08-25
      • 2012-02-29
      • 2014-04-06
      • 2010-12-22
      • 1970-01-01
      • 2019-11-03
      • 2017-05-27
      相关资源
      最近更新 更多