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

3
我正在阅读这篇Docker教程:
重要的是要注意,Docker容器不在自己的虚拟机中运行,而是共享Linux内核。与虚拟机相比,容器使用更少的内存和CPU。但是,Docker需要Linux运行时。在非Linux平台上(如macOS和Windows 10),实现使用单个Linux虚拟机。容器共享此系统。
我想知道Linux内核和Linux运行时之间的区别。
我找到了内核的定义:
内核是操作系统的最低层。内核是操作系统的主要部分,负责将命令转换为计算机可以理解的内容。
我找到了运行时的定义:
运行时是程序正在运行(或可执行)时。也就是说,当你在计算机上启动一个程序时,对于该程序来说,它是运行时。在某些编程语言中,某些可重用的程序或“例程”被构建并打包成“运行时库”。当任何程序在运行时,这些例程都可以链接和使用。
1个回答

9

简而言之:Linux内核是一种运行时,与其他操作系统的运行时没有区别。

长话短说:

运行时

引用的定义并不是“运行时”的定义。在软件构建的背景下,运行时是指将您构建的软件解释并逐条执行(通常)的软件。

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

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

操作系统和加载

运行时还有从文件中加载程序并以可解释的形式呈现的作用。

当您在C中构建程序时,它会被编译成机器代码,由硬件(CPU)直接执行,不需要任何软件进行解释。这样的程序有时被称为“本地”程序。但是,C标准库通常不随软件捆绑在一起,必须独立存在于运行代码的机器上,并且它们有时也被称为“C运行时”,部分原因是它们包含每个C程序的引导代码。

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

正如您所看到的,运行时经常是堆叠的:您可以在Intel x86硬件上运行MacOS内核,在运行虚拟机程序的Linux虚拟机。

Docker运行时

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

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

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

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

这两件事都属于“程序加载”类别,这是运行时的职责之一。

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

在MacOS等操作系统上,这些技术不存在(据我所知),因此为了运行docker容器,docker需要在Linux虚拟机中运行其容器,该虚拟机作为可以加载映像的运行时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接