运行时和内核之间的区别?

Jwa*_*622 3 kernel runtime

我正在阅读这个 docker 教程:

\n
\n

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

\n

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

\n
\n

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

\n

我找到的内核定义:

\n
\n

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

\n
\n

我找到的运行时的定义:

\n
\n

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

\n
\n

roo*_*oot 10

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

长解释:

运行时

引用的定义并不是“运行时”的一个很好的定义。在软件构建环境中,运行时是指软件获取您构建的软件、解释它并(通常)逐条指令地执行它。

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

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

操作系统和加载

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

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

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

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

Docker运行时

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

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

首先,docker 需要设置一个容器(设置覆盖文件系统和控制组等内容)。

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

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

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

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