Linux 为什么还要坚持使用宏内核
1个回答
2016-10-25 · 知道合伙人数码行家
关注
展开全部
作者:WDan
链接:https://www.zhihu.com/question/20314255/answer/18183075
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
作为一个在System方向实验室待过的同学来稍微补充一下这个问题的答案。
@冯东@王垠 的答案更多是从Monolithic Kernel和Micro Kernel的设计角度比较优劣,这个话题争论的时间比较久,也需要蛮长篇幅来说。就本问题来说,“Linux为什么坚持使用Monolithic Kernel”和设计优劣还是有一定区别的。
@詹健宇 的回答与本主题较为贴近,Linus Torvalds与Andrew S. Tanenbaum(当时System研究领域的大牛 Modern Operating System一书的作者,也是今天System界领军人物Frans Kaashoek的老师)有过一场关于Linux设计是否过时的争论(https://groups.google.com/forum/#!topic/comp.os.minix/wlhw16QWltI%5B1-25-false%5D),当时学术界主流观点是Monolithic Kernel只有在效率上相对Micro Kernel有优势,并且已经有学者的研究结果表明Micro Kernel的效率经过优化并不比Monolithic Kernel差。从设计角度,当年Linus在讨论中也一定程度上同意了这个观点。
那么为什么Linus还是采用Monolithic Kernel作为Linux的设计模型呢?首先,Linux本身在实现之初仅仅作为Linus一个业余项目而存在。而Monolithic Kernel由于不需要处理消息队列等等原因从实现角度来说比Micro Kernel更为方便,我个人认为这是Linus采用Monolithic Kernel的原因之一。其他原因可能是他本人从情感上喜欢这一架构,也可能他顺延模仿的Unix或者认为现有Micro Kernel消息传递的实现代码很ugly。但这些原因并不是重点,重点在于他的作品与采用Micro Kernel的Minix相比,它的易用性更好。
Minix为了尽可能兼容更多的硬件设备,做到更加全面的兼容性,在实现上尽量避免利用单一某种处理器的新特性,这也是导致其效率不高的原因之一。而Linux则认为操作系统只需要对用户态程序保持统一的API即可保证兼容性,底层硬件的驱动等支持可以扩充,并且工作量不大。在编写Linux的开始阶段,仅支持在当时使用人数占多数的i386架构,但在内存管理,网络等模块上实现均优于Minix,因此取得了大量用户的支持,并最终流行。
回到这个问题,Linux保持Monolithic Kernel设计的原因是,Linux在这种架构上可以实现的足够好(现在的Linux Kernel也证明了这一点),即使费很大力气切换到Micro Kernel架构并不会获得什么优势。同时,这些不代表Micro Kernel从今天的角度来看设计就劣于Monolithic Kernel。通过种种途径的优化总可以变得完善。Nokia的Symbian系统也统治了一段时间。所以归根到底,决定一款产品是否成功的要素不仅仅取决于它的设计,也在于它的实现。很有意思的是,计算机领域往往经过完善设计的产品最终结果都是失败了,像UNIX赢了Multics,设计很好的Lisp并没有C语言流行, 又像同设计OSI的愿景最后由TCP/IP协议完成。这篇Worse is Better就是说的这个道理:Worse Is Better
另外@王垠可能对System领域了解不是很深:) 操作系统保护内存的原因并不是因为C语言的限制。操作系统设计的目的是为了方便用户态程序不用过于关心硬件的底层细节,为用户态程序提供各种系统资源的抽象。而内存隔离的目的一是为了用户态程序不影响其他用户态程序的状态,二是为了操作系统本身的安全性,状态不被用户态程序所修改。而C语言的指针操作只是对内存访问的一种直接描述罢了,并不是C语言影响了操作系统或者处理器的设计。其他动态类型检查的比较,由于我对程序语言领域没有很多了解,所以没有办法评论。最后补充一下宏内核的宏的意思是大,即将内存管理,文件系统等模块均置于内核态,所以是Monolithic,而不是Macro这个宏:)
链接:https://www.zhihu.com/question/20314255/answer/18183075
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
作为一个在System方向实验室待过的同学来稍微补充一下这个问题的答案。
@冯东@王垠 的答案更多是从Monolithic Kernel和Micro Kernel的设计角度比较优劣,这个话题争论的时间比较久,也需要蛮长篇幅来说。就本问题来说,“Linux为什么坚持使用Monolithic Kernel”和设计优劣还是有一定区别的。
@詹健宇 的回答与本主题较为贴近,Linus Torvalds与Andrew S. Tanenbaum(当时System研究领域的大牛 Modern Operating System一书的作者,也是今天System界领军人物Frans Kaashoek的老师)有过一场关于Linux设计是否过时的争论(https://groups.google.com/forum/#!topic/comp.os.minix/wlhw16QWltI%5B1-25-false%5D),当时学术界主流观点是Monolithic Kernel只有在效率上相对Micro Kernel有优势,并且已经有学者的研究结果表明Micro Kernel的效率经过优化并不比Monolithic Kernel差。从设计角度,当年Linus在讨论中也一定程度上同意了这个观点。
那么为什么Linus还是采用Monolithic Kernel作为Linux的设计模型呢?首先,Linux本身在实现之初仅仅作为Linus一个业余项目而存在。而Monolithic Kernel由于不需要处理消息队列等等原因从实现角度来说比Micro Kernel更为方便,我个人认为这是Linus采用Monolithic Kernel的原因之一。其他原因可能是他本人从情感上喜欢这一架构,也可能他顺延模仿的Unix或者认为现有Micro Kernel消息传递的实现代码很ugly。但这些原因并不是重点,重点在于他的作品与采用Micro Kernel的Minix相比,它的易用性更好。
Minix为了尽可能兼容更多的硬件设备,做到更加全面的兼容性,在实现上尽量避免利用单一某种处理器的新特性,这也是导致其效率不高的原因之一。而Linux则认为操作系统只需要对用户态程序保持统一的API即可保证兼容性,底层硬件的驱动等支持可以扩充,并且工作量不大。在编写Linux的开始阶段,仅支持在当时使用人数占多数的i386架构,但在内存管理,网络等模块上实现均优于Minix,因此取得了大量用户的支持,并最终流行。
回到这个问题,Linux保持Monolithic Kernel设计的原因是,Linux在这种架构上可以实现的足够好(现在的Linux Kernel也证明了这一点),即使费很大力气切换到Micro Kernel架构并不会获得什么优势。同时,这些不代表Micro Kernel从今天的角度来看设计就劣于Monolithic Kernel。通过种种途径的优化总可以变得完善。Nokia的Symbian系统也统治了一段时间。所以归根到底,决定一款产品是否成功的要素不仅仅取决于它的设计,也在于它的实现。很有意思的是,计算机领域往往经过完善设计的产品最终结果都是失败了,像UNIX赢了Multics,设计很好的Lisp并没有C语言流行, 又像同设计OSI的愿景最后由TCP/IP协议完成。这篇Worse is Better就是说的这个道理:Worse Is Better
另外@王垠可能对System领域了解不是很深:) 操作系统保护内存的原因并不是因为C语言的限制。操作系统设计的目的是为了方便用户态程序不用过于关心硬件的底层细节,为用户态程序提供各种系统资源的抽象。而内存隔离的目的一是为了用户态程序不影响其他用户态程序的状态,二是为了操作系统本身的安全性,状态不被用户态程序所修改。而C语言的指针操作只是对内存访问的一种直接描述罢了,并不是C语言影响了操作系统或者处理器的设计。其他动态类型检查的比较,由于我对程序语言领域没有很多了解,所以没有办法评论。最后补充一下宏内核的宏的意思是大,即将内存管理,文件系统等模块均置于内核态,所以是Monolithic,而不是Macro这个宏:)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询