【问题标题】:Why can't we add maximum functionality in the Kernel of an operating system?为什么我们不能在操作系统的内核中添加最大的功能?
【发布时间】:2017-06-14 14:16:03
【问题描述】:

我正在阅读“Andrew S.Tanenbaum”的一本书,他在其中提到:

“MINIX 是最早的基于微内核设计的类 UNIX 系统之一。 微内核背后的想法是在内核中提供最少的功能以 使其可靠和高效。因此,内存管理和文件系统 被推送到用户进程中。”

这是否意味着“具有最大功能的内核”将不可靠和高效? 为什么会这样,请举个例子解释一下。

谢谢

【问题讨论】:

  • 在阅读该部分之前,作者如何在本书的上下文中定义“可靠”和“高效”这两个术语?
  • 另请阅读 Operating Systems: Three Easy Pieces 以及在此之前 operating systems 上的维基页面
  • monolithic kernels 的一个典型例子是Linux kernel,它在实践中相当成功、可靠且高效(并且具有很多 功能)。您应该尝试在自己的计算机上安装一些linux distribution
  • @BasileStarynkevitch 如果单片内核(具有更多功能)是可靠和高效的,那么为什么作者在书中说“......功能最少的内核是高效和可靠的”?
  • @BasileStarynkevitch 我认为真正引起争论的部分是哪一个是“更好”或“正确”的设计决策,而不是说,哪一个提供更多/更少的功能、性能和可靠性。例如,由于函数调用与 IPC 的开销减少,单片内核会更快,我认为没有人对此进行辩论。我在采访中看到 Torvalds 说的是,对于“现实世界”,你需要一个单片的 b/c 微控制器太慢了。虽然如此,但如果其他作者认为速度次要其他问题,那么将做出不同的决定。

标签: operating-system kernel computer-science


【解决方案1】:

我认为理解这个问题的一个微妙但重要的方面取决于如何定义“可靠”和“高效”这两个术语。对于这个答案,我将使用以下一般定义:

  • 可靠:很难或不太可能出现故障或以其他方式损坏/崩溃

  • 高效:需要最少的时间来完成某些任务,即使是以空间为代价

虽然不是每个人都会以相同的方式定义术语(例如在嵌入式系统中,使用最少的 空间 可能被认为更“有效”),但在大多数情况下,我认为用户倾向于速度。

微内核背后的理念是在内核中提供最少的功能,以使其可靠且高效。

我认为这里的重要部分是“最小功能”。拥有最少的功能意味着必须编写、读取和维护/调试的代码量少于包含更多内容的代码。

从这个意义上说,根据我上面的定义,更少的代码意味着内核整体更小,可能更简单,更容易使用。系统越简单,就越容易发现潜在/实际问题,从而使系统在这个意义上更“可靠”。这减少了新的隐藏错误进入代码库并在以后破坏某些东西的机会。

它还可以使其更“高效”(即更快),因为系统将需要更少的开销处理来保持自身正常运行。换句话说:你工作的越少,你花在工作上的时间就越少。

以此类推,假设您正在阅读一本书;完成这本书所需阅读的页数越少,故事情节就越容易理解,并且完成它的速度就越快。

这是否意味着“具有最大功能的内核”将不可靠和高效?

不一定,但这取决于“最大功能”的含义。例如,在内核中安装媒体播放器、电子邮件客户端和文字处理器是否有助于它实现“最大功能”?可能是。是否有意义?没有。

对于本次讨论,我将使用以下定义:

  • 最大功能:与尽可能多的硬件兼容

实际上,这意味着如果您将某个组件 A 换成某个其他组件 B(即网卡),机器应该继续正常工作,而不是拒绝启动。

从这个意义上说,内核可以在不完全牺牲“效率和可靠性”的情况下拥有“最大功能”。

需要添加代码,以便内核允许识别组件、加载它们的驱动程序等等,这将增加编写代码时引入错误的机会以及处理开销的数量照顾附加的功能。即便如此,大多数错误也只是暂时的。

因此,如您所见,需要权衡取舍。那么,微内核呢?

微内核专门寻求通过将不太关键的“服务”推到内核外部来管理这种权衡……这反过来意味着通常有能力使内核崩溃的东西(例如坏司机),因此整台机器也被推到外面。这限制了他们在行为不端时可能造成的干扰。

一旦在内核之外,它们作为用户空间应用程序(例如类似于记事本)而不是内核空间(例如单片内核中的显卡驱动程序)运行,并且如果这些服务或应用程序中的任何一个出现问题并且崩溃时,机器本身更有可能存活下来,而不是显示 BSoD 或同等情况。

例如,如果文本编辑器崩溃,则只有应用程序会关闭。如果在内核空间中运行的显卡驱动程序崩溃,那么您可能需要重新启动。

但正如我所提到的,这是一种权衡。例如,将内核功能移到用户空间确实会导致一些效率/速度损失。过去在内核空间的同一进程内的单片内核(例如Linux)中的简单函数调用现在需要通过与自身外部的多个独立任务进行进程间通信的开销,这需要它们之间进行更多的上下文切换,以及完成任务之前的时间。

以此类推,假设您正在阅读一本包含多个角色的书,这些角色在故事的关键点做出重要决定,但这本主要书只关注主要角色,以及这些决定对支持角色的后果在单独的支线故事书中处理。主书本身会更短更简单,但您必须不断在书之间切换才能真正阅读所有内容,这意味着您需要更多时间才能完成它。

希望这会有所帮助。

【讨论】:

  • 但是当您将系统功能(即文件管理)作为用户进程运行时,它们的安全性会降低吗?
  • @Ahti 我认为这取决于。需要在某些威胁模型的上下文中检查安全级别,但我们可以说,如果进程在用户空间而不是内核空间中运行,则 范围受到损害的过程造成的损害将更加有限。这就像将服务器进程作为root 与它自己的单独用户帐户(如apache)相比。如果用户apache 被入侵,则损害范围比root 用户被入侵时更有限。
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2021-04-14
  • 2016-04-25
  • 2020-09-06
相关资源
最近更新 更多