我是 unikernels 的新手,以下链接对我理解它们没有多大帮助:
术语“unikernel”和“microkernel”意味着不同的东西,并不是两个真正的两个对立面或两个你需要选择的选择:
“微内核”是一个较旧的术语,是一种内核设计,与单片相比核心。在单体内核中,顾名思义,整个内核是一个单独的程序,它实现了用户应用程序所需的内核 API(例如,Unix 系统调用、线程、进程、文件系统等)。相比之下,在微内核设计中,我们有一个“微内核”,一个非常小的内核,它实现了一个小的 API(例如,执行线程、权限和消息传递的一个非常基本的概念),并且在它之上内核的一个更大的部分,它实现了应用程序所需的完整 API——实际的文件系统、行为类似于 Unix 进程的进程、系统调用等等。在 1990 年代初期,学术界认为编写单片内核变得太难也太容易出错了,而微内核是未来的发展方向,但是后来出现了 Linux(它是一个单片内核)并将这个结论变成了一个笑话。今天,您不应该根据内核是使用微内核还是单片内核来选择内核。这是用户很少关心的实现细节。
“unikernel”是一个较新的概念。传统内核以能够在同一物理机器上复用许多不同的用户和应用程序而自豪。1974 年有关 Unix 的著名论文被称为“UNIX 分时系统”,因为分时(即多路复用多个用户和应用程序)是操作系统最重要的目标之一。但是今天,关注虚拟机而不是物理机,有一种不同的方式(即管理程序)可以将物理机拆分为不同的虚拟机。所以很多时候,每个虚拟机只运行一个属于一个所有者的应用程序。这提供了一个运行精简内核的机会,它不需要支持传统内核支持的很多东西:无需支持不同用户之间的隔离;无需支持数千个驱动程序(所有已知的虚拟机管理程序都需要一小部分);无需支持不同进程之间的隔离。
修剪所有不必要的东西使内核更小,这对于快速部署新虚拟机、降低内存使用和提高性能来说是一个很大的好处。例如,您可能听说最近,Linux 内核被修补以修复当代 CPU 中的“熔毁”漏洞。该修复会减慢 Linux 上的系统调用和上下文切换速度,这是必需的,因为没有它,一个进程可以读取其他进程的内存。但是如果我们知道没有其他进程——只有一个应用程序在 VM 上运行——我们不在乎。因此,一个 unikernel 不需要通过崩溃解决方法来减慢自己的速度。系统调用可以和函数调用一样快,上下文切换要快得多,等等。
像OSV一些unikernels例如,做了以上,并提供一个内核,其模仿所述应用程序的传统的内核(即,Linux的),但没有不支持的功能,例如多个用户或多个分离的过程(虽然未隔离的线程被支持) . 其他 unikernel 甚至更进一步寻求精简内核,并为每个应用程序提供不同的内核构建,其中包含该特定应用程序所需的特定功能。例如,要运行 TCP 应用程序,您可以使用仅支持 TCP 协议而不支持 UDP 的内核。您可以将此视为内核和应用程序链接在一起以形成一个统一的内核应用程序,该应用程序直接在管理程序上运行。
何时以及为什么使用 unikernel(上述任何变体的)是一个悬而未决的问题。当然,如果使用少量磁盘或内存是一个问题,那么 unikernel 是一个不错的选择。如果您担心安全性并计划审核您的代码,那么 unikernel 需要审核的代码要少得多。在需要快速启动的应用程序中(例如,实现“功能即服务”),unikernel 允许非常快的启动,明显少于 1 秒,因为启动时执行的“通用”内容要少得多,并且专注于您的应用程序真正的内容需要。这些示例还可以告诉您何时不应该考虑使用 unikernel:如果您的应用程序无论如何都使用了大量磁盘和内存(例如,数据库应用程序),那么稍微减少内核大小将无济于事. 如果您的应用程序运行数小时,快速启动并不重要。如果您的应用程序使用许多操作系统功能,那么我上面描述的许多更专业的 unikernel 可能无法提供您的应用程序所需的所有功能。
一句话,(应用程序 + unikernel)称为在虚拟机管理程序(云)上运行的工作负载,相当于嵌入式世界中在裸机上运行的独立应用程序。
当应用程序(工作负载)不使用大部分操作系统和设备驱动程序服务时,云中的 Unikernel 会更好。
Unikernel 仅使用内核使用的功能进行编译,而不是像微内核那样使用必要的功能,因此尺寸很小。
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |