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

时间:2019-07-10 14:20:35

标签: kernel runtime

我正在阅读此Docker教程:

  

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

     

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

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

我发现的内核定义:

  

内核是操作系统的最低级别。内核是操作系统的主要部分,负责将命令转换为计算机可以理解的内容。

我发现的运行时定义:

  

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

1 个答案:

答案 0 :(得分:2)

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

详细说明:

运行时

引用的定义不是“运行时”的很好定义。在软件构建环境中,运行时是指软件将您构建的软件,解释并执行的指令(逐项)执行。

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

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

操作系统和加载

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

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

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

如您所见,运行时通常是堆叠在一起的:您可以拥有运行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虚拟机中运行其容器,该虚拟机充当可以加载映像的运行时。