Linux内核与微内核体系结构相比如何?


38

我曾经读过一次,微内核体系结构的一个优点是您可以停止/启动网络和文件系统之类的基本服务,而无需重新启动整个系统。但是考虑到当今的Linux内核(是否总是这样?)提供了使用模块来达到相同效果的选项,那么微内核的(剩余的)优势是什么?



1
您可以阅读有关MicroKernel与Monolithic内核的辩论。oreilly.com/openbook/opensources/book/appa.html本文中,Andrew Tanenbaum支持Microkernel,而Linus Torvalds支持Monolithic内核。
不丹2015年

Answers:


35

整体内核相比,微内核以更少的代码在最内部,最受信任的模式下运行需要更少的代码。这有很多方面,例如:

  • 微内核允许随意加载和卸载非基本功能(例如未连接或未使用的硬件的驱动程序)。这在Linux上可以通过模块实现。
  • 微内核更强大:如果非内核组件崩溃,它将不会占用整个系统。错误的文件系统或设备驱动程序可能会使Linux系统崩溃。除了编码实践和测试之外,Linux没有其他方法可以缓解这些问题。
  • 微内核具有较小的可信计算基础。因此,即使是恶意的设备驱动程序或文件系统,也无法控制整个系统(例如,最新USB小工具的来源可疑的驱动程序将无法读取硬盘)。
  • 前面提到的结果是,普通用户可以加载自己的组件,这些组件将成为单片内核中的内核组件。

Unix GUI通过X窗口提供,这是用户区代码(视频设备驱动程序(的一部分)除外)。许多现代的unice允许普通用户通过FUSE加载文件系统驱动程序。某些Linux网络数据包过滤可以在userland中完成。但是,设备驱动程序,调度程序,内存管理器和大多数网络协议仍仅是内核。

Tanenbaum-Torvalds辩论是有关Linux和微内核的经典文章(如果有过时)。二十年后,人们可以说Linux朝着微内核结构发展的步伐非常缓慢(可加载模块在早期出现,FUSE则在最近出现),但是还有很长的路要走。

另一件事发生了变化,虚拟化在台式机和高端嵌入式计算机上的重要性越来越高:出于某些目的,相关的区别不在于内核和用户域之间,而在于虚拟机管理程序和来宾OS之间。



1
那是非常好的理论。如果设备因某种原因被楔住,则该系统就是吐司。如果驱动程序在操作过程中崩溃,则不重新启动驱动程序将使系统恢复到功能状态。如果您要获得任何性能,则驱动程序必须是多线程的,并且“一个调度程序”的优势完全丧失了。要获得性能,您必须避免(成本越来越高)内存副本和上下文切换...,并且“模块化”丢失了。查看一些微内核的大小,您会发现它们的大小和复杂性与包含驱动程序的单片内核相当。
vonbrand

15

与用户空间相反,微内核将系统处于内核模式的时间限制为绝对最小。

如果在内核模式下发生崩溃,则整个内核将关闭,这意味着整个系统将关闭。如果在用户模式下发生崩溃,则该过程将关闭。Linux在这方面很强大,但是任何内核子系统仍然有可能有意或无意地覆盖任何其他内核子系统的内存。

微内核概念在用户空间中放置了许多传统上是内核模式的内容,例如网络和设备驱动程序。由于微内核并不能真正承担很多责任,因此这也意味着它可以更简单,更可靠。通过简单而愚蠢的方式来思考IP协议通过将复杂性推到边缘并让核心变得精瘦和卑鄙而真正导致网络健壮的方式。


5

感谢您发布阅读材料的链接!布伦特·W(Brent W)的抽象观点是合理的,并且在一定程度上,我对克里斯托夫·L(Christoph L)对微内核同步机制中过于复杂的关注表示同情。但是,我认为后者可能会忽略基于消息的事件循环。由于事件循环彼此之间不共享内存,因此不需要锁定,并且由于(IMO)它们使自己具有声明式编码样式,因此可以显式定义一致的算法(lambda演算的重点...)-我通常会编写应用程序代码,但是这个Q一直是一种愉快的学习体验
人类机器人,

1

只需看一下x86体系结构,单片内核仅使用 0和3。但由于上下文切换较少,它可能比以前更快。

x86戒指


x86环结构只是过度设计。没有实际用途(虚拟机除外,但是使用越来越多...)
vonbrand

1
  1. 整体内核比微内核要老得多。它在Unix中使用,而微内核的概念出现在1980年代末。

  2. 具有单块内核的OS的示例是UNIX,LINUX,而具有微内核的OS的示例是QNX,L4,HURD和最初的Mach(不是MacOS X),后来被转换为混合内核。甚至MINIX也不是纯粹的微内核,因为其设备驱动程序被编译为内核的一部分。

  3. 整体内核比微内核。第一个Mach微内核比单块内核慢50%。像L4这样的更高版本仅比整体内核慢2%或4%

  4. 整体内核通常很庞大,而纯微内核的尺寸必须很小,甚至可以放入处理器的一级缓存(第一代微内核)中。

  5. 在单片内核中,设备驱动程序驻留在内核空间中,而在微内核中,设备驱动程序驻留在用户空间中

  6. 由于设备驱动程序驻留在内核空间中,因此单片内核的安全性不如微内核(驱动程序中的故障可能导致崩溃)。微内核比单片内核更安全,因此它们被用于许多军事设备。

  7. 单片内核使用信号和套接字来确保IPC,而微内核方法则使用消息队列。在1 的微内核的代执行不力IPC所以他们对上下文切换缓慢。

  8. 向单片系统添加新功能意味着重新编译整个内核,无需重新编译即可添加新功能或补丁


在(4)中,您正在比较苹果和西瓜。微内核本身(通过设计)仅包含最少的功能,而单内核包含更多功能。(6)是一个很好的理论,它取决于片段的开发能力以及真实 IPC机制的泄漏程度(对于性能,它不能是真正的“消息传递”)。注释(7)意味着对“消息队列”的处理非常复杂,因此主要是忽略了它们的优点。对于(8),在例如Linux的情况下,当然可以编译独立于内核的模块。实际上,这通常是为驱动程序开发而完成的。
vonbrand '16

0

Windows NT(当前Windows系统的基础内核)最初是一种非常普通的微内核设计。由于性能问题,越来越多的“用户区”代码迁移到“微内核”中……如今,它的微内核结构已成为残余。


-1

情况是linux内核是单片和微内核的混合体。在纯整体实现中,运行时不会加载任何模块。


9
不是。动态加载模块的事实并不会改变它们以完整的内核特权运行并且作为整体内核的一部分的事实。
vartec

3
对于混合设计,更重要的是一些驱动程序(用于USB,扫描仪,打印机和图形)是在用户空间而不是内核中实现的。区别尚不明确,Linux可以说是混合内核,因为其中包含libusb,sane,cups和mesa-不是因为存在insmod和rmmod。
Maciej Piechotka 2011年

-1

术语monolithic kernelmicrokernel不能被认真比较,因为它们描述了内核设计的不同方面(结构与大小)。

一个典型的整体内核是SunOS-4.x内核,而Linux仍与之相似,因为您手动配置了基本内核的内容。

Solaris内核(从1992年的2.1开始)不再被称为单片内核,因为所有驱动程序均按需自动加载,并且在初始引导过程中仅加载了一小部分。

SunOS-4.x和Solaris(SunOS-5.x)和Linux都是单上下文实现。它们的整个代码在单个MMU上下文中运行。

Mac OS X基于Mach并作为多上下文实现运行,其中多个进程由MMU上下文分隔。在此概念中,驱动程序位于单独的进程和单独的MMU上下文中。

许多人将Mac OS X称为“微内核系统”,但是基本内核可能不小于Solaris的基本内核。

如此看来,这将是更好谈谈single context kernelsmulti context kernels


1
MacOS在微内核上运行(基本上是单块的)BSD垫片。那里根本没有分离成单独的过程,也不是真正的微内核设计。
vonbrand

1
因此,您承认使用至少两个所谓的内核进程的设计。microkernel无论如何,该术语 是错误的,因为它通常用于应称为的事物multi context kernel
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.