当前位置: 首页 > 建站技术 > 编程语言 > 正文

  • 标签
  • 源码
  • 特效
  • 微内核优势明显、好处突出,但为何 Linux 却没有用微內核?


    linus 在技术选型上很务实,可以把当年『微内核』的 hype 换成『区块链』感受一下。理念俘获到了大公司,但是落地败给现实。GNU Hurd 走微内核十二十年没落地,这不是偶然的。

    整体大于部分之和,拆分一时爽集成火葬场,使用通信技术拆分整体的复杂性之所以不能如意的一大原因是,通信本身的复杂性反而可能高于问题本身。本来简单的单体问题一个循环跑完,拆出去后通信对面的进程堵了怎么搞?Martin Fowler 把分布式叫做『Complexity Booster』,然后设计分布式系统的第一定律就是不搞分布式系统。搞微内核是什么体验?考古不容易,但我觉得现在人可以互联网公司里搞微服务感受一下。

    I claim that you want to start communicating between independent modules

    no sooner than you absolutely HAVE to, and that you should avoid splitting

    things up until you really need to, because that communication complexity

    often swamps the complexity of the actual pieces involved in it.

    Linus

    有好处就肯定有坏处。微内核的坏处,光性能损耗一条就够了。那么多驱动运行在非0态,每次进程调度导致 TLB 刷新,调度后运行稍微多些代码,又导致L1、L2 失效。

    我也很喜欢微内核,但是还是觉得现在通用的体系结构无法高效使用,期待新的架构体系能为我们提供又稳定,性能又高的微内核系统。

    宏内核实现上更简单。PS:现代微内核(win、osx)中服务都运行在系统态,根本没有“多次陷入内核”,驱动、文件系统bug都会导致系统崩溃,比如win蓝屏。微内核更多指消息机制,提供基本的调用接口;而宏内核Linux一个模块export_symbol后,其他模块就能调用。类比RISC,CISC。实际上先进思想都相互融合了,已经没有上述传统的区分。例如,Linux编译后内核本身能小于8MB(跟win内核kern大小接近),大部分作为模块。再如,Linux的FUSE、User space driver等,岂不是传统微内核中的概念。



    Linux 单内核 的设计主要存在几个问题

    1. Linux设计之初的单内核思想使得它同80x86的处理器架构紧紧绑定在了一起,这导致Linux的移植性低于Minix。
    2. 代码的错误取决于代码大小。一般而言工业代码每千行会出现10个错误。将越多的代码放到内核,内核的出错可能性也越大。
    3. 操作系统的设计不应该因为某些代码中偶然出现的错误影响到整个内核的运行。

    而基于Tanebaum的质疑,Linus也给出了自己的回答。他承认在理论和美学方面上,微内核是领先于单内核的,而他也承认Minix的移植性从某些方面是要好于Linux。但他解释说Linux的Intel x86架构的绑定是因为Linux只不过源于他的操作系统实验而已。但是由于他简化了Linux的API接口,并且使其更具有移植性,事实上 “linux is more portable than minix.”。

    事实上,正是由于单内核和微内核各有优缺点,这场争论一直持续到现在。单内核和微内核在当前各有其应用,例如,微内核的windows,symbian,教学专用的Minix,单内核的Linux等。

    在效率上而言,单内核是要超过微内核的。可以想象一下,在windows桌面移动一下鼠标就要发送几十条消息,就要陷入到内核之中多次。操作系统的管态用户态转变是代价很高的,这个对操作系统有一点点常识的人都能知道。而Linux则不需要,因为大部分内核代码都在内核态执行,不需要通过消息传递的方式通讯,也不需要大量的用户态内核态转化开销,因此效率要高很多。

    至于在代码错误影响方面,微内核的错误容忍度一般是要好于单内核的。微内核可以将大部分的设备驱动包括文件系统都放入到用户空间中,内核中只运行很小一部分代码,例如Minix只有3200行的C代码和800行的底层代码在内核中。用户空间中的模块出现的错误会导致模块崩溃,但不会导致内核故障。而单内核架构内核代码庞大,一旦其中出现任何故障,可能会直接导致内核崩溃。

    我自己也写过微内核的小型操作系统,包括简单的shell等等。消息处理是微内核比较重要的模块,编写代码的过程中保证消息传递的成功,我就觉得已经成功了50%。而Linux的单内核架构编写就需要注意很多问题,各种控制资源竞争的自旋锁让人会让痛不欲生的。

    总而言之,Linux使用单内核并不说明单内核好于微内核。而微内核在某些方面强于单内核也并不说明Linux就应该使用微内核。

    b.t.w : Linus最后也给Tanenbaum发过邮件为这场争论做了Apologize。毕竟Linus是看了Tanenbaum的操作系统教程和Minix源码才学写的Linux。而Tanenbaum的X86很快会过时,Linux很快会淘汰的语言也被时间证明是错误的。或许有一天Linux也会被微内核的更新的操作系统所替代了呢~



    微核

    当开始编写Linux内核时,有一个公认的关于如何编写可移植系统的学派。传统的看法是,您必须使用微内核样式的体系结构。

    对于像Linux内核这样的单片内核,内存被分为用户空间和内核空间。内核空间是实际加载内核代码的地方,是为内核级操作分配内存的地方。内核操作包括调度、进程管理、信令、设备I/O、分页和交换:其他程序所依赖的核心操作。因为内核代码包含与硬件的低级交互,所以单片内核似乎是特定于特定体系结构的。

    微内核执行的操作集要小得多,形式也更有限:进程间通信、有限的进程管理和调度,以及一些低级I/O。微内核似乎不那么具体到硬件,因为许多系统细节都被推到用户空间。微内核体系结构基本上是一种抽象过程控制、内存分配和资源分配细节的方法,以便到另一个芯片组的端口需要最少的更改。

    因此,当1991年开始在Linux上工作时,人们认为可移植性来自于微内核方法。你看,这是当时计算机科学家的研究宠儿。然而,我是一个务实的人,当时我觉得微内核(a)是实验性的,(b)明显比单片内核复杂,(c)执行明显比单片内核慢。在实际操作系统中,速度非常重要,因此当时的大量研究资金都花在了对微内核的优化上,以使其能够像普通内核一样快速运行。有趣的是,如果你读过这些论文,你会发现,当研究人员在微核上应用他们的优化技巧时,实际上这些技巧同样可以很容易地应用到传统的内核上,以加速它们的执行。

    事实上,认为微核方法本质上是一种不诚实的方法,目的是为了获得更多的研究资金。我并不认为这些研究人员故意不诚实。也许他们只是愚蠢而已。或欺骗。我的意思是,这是非常真实的。这种不诚实来自于当时研究界追求微核话题的巨大压力。在计算机科学研究实验室,你在研究微核或者你根本就没在研究微核。所以每个人都被迫做出这种不诚实的行为,甚至设计Windows NT的人也不例外。

    幸运的是,从来没有感到追求微核的压力。赫尔辛基大学(University of Helsinki)从60年代后期开始做操作系统研究,那里的人们不再认为操作系统内核是一个研究主题。在某种程度上,他们是对的:操作系统的基础,以及通过扩展Linux内核,在70年代早期得到了很好的理解;在那之后的任何事情在某种程度上都是自我满足的练习。

    如果希望代码是可移植的,那么不应该为了实现可移植性而创建抽象层。相反,应该聪明地编程。从本质上讲,试图使微内核可移植是浪费时间。这就像制造一辆特别快的汽车,在上面安装方形轮胎。将一件必须快速完成的事情——内核——抽象出来的想法本质上是适得其反的。

    当然,微核的研究还不止于此。但问题的很大一部分在于目标的不同。许多微核研究的目的是为一个理论理想设计,设计出一个能够在任何可想象的体系结构中尽可能便携的设计。有了Linux,不必为这样一个崇高的目标而奋斗。感兴趣的是现实世界系统之间的可移植性,而不是理论系统。


    关注创业、电商、站长,扫描方便乐网站微信二维码,定期抽大奖。

    【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至2723741405@qq.com,我们将及时沟通与处理。本站内容除非来源注明方便乐,否则均为网友转载,涉及言论、版权与本站无关。

    本文永久链接:http://www.fangbianle.com/news/show-255657.html

  • 营销
  • 创业
  • 电商
  • 微商
  • AppsFlyer携手百度搜索推广oCPC持续赋能移动营销
    选择新网络推广的优势
    优秀的营销策划人,需要做对三件事
    移动营销:得让消费者自己寻找东西
    网络推广为什么越来越难做?
    最适合中国的10种营销策略
    后流量时代 陌陌的移动营销新方式
    2018年有这些免费的网络推广方法