内核是操作系统中非常重要的一部分,也是操作系统的核心。内核管理系统资源。内核向上连接到应用程序,向下连接到硬件。它是应用程序和硬件之间的桥梁。内核又可以分为宏内核和微内核。宏内核和微内核最大的区别是宏内核的用户服务和内核服务存放在同一个地址空间,都由内核管理,而微内核的用户服务和内核服务存放在不同的地址。在空间上,下图可以很好地说明这一点。其实这里宏内核的翻译有点牵强。其实应该叫单核或者单核。在这种单核设计中,内核是一个很大的整体,可以说是一个很大的进程。在这个大进程中,所有的内核服务都运行在同一个地址空间中,函数之间的调用环节很少。沟通简单高效。微内核的功能被划分为独立的进程,进程之间通过IPC进行通信,模块化程度高,一个服务的故障不会影响到另一个服务。但是由于模块化的影响,函数之间的调用链路太长,进程之间不直接通信,而是通过内核服务相互通信。从内核大小来看,微内核的大小更小,只包括与用户进程相关的服务,而单核的大小则远大于微内核。这个比较好理解,因为宏内核合并了太多的服务和服务。驾驶。在执行效率上,微内核由于涉及跨模块调用,执行效率相对较慢,而宏内核由于直接调用函数,执行效率较高。微内核模块化后易于扩展,因为内核空间和用户空间是相互隔离的,在用户态应用程序崩溃后内核中的数据一般不受影响(应用程序运行在用户空间)。宏内核的可扩展性差。经过上面的描述,我们很容易将宏内核和微内核的特性想象成软件开发中的单体架构和微服务架构。单体架构最大的特点就是函数调用方便,几乎没有调用环节。一个项目解决所有问题。项目包括数据库驱动、各种拦截器、控制器、权限控制,可扩展性很差。但是微服务架构之间的调用链路会比较长,模块之间职责分离又相互依赖,比如权限控制模块、路由模块、总线通信模块等。可扩展性比较强。这两种不同的核心架构有不同的支持者,就像有人认为单体架构好,有人认为微服务架构模型好一样。这就像争论编程语言一样。Python、Go、Java或其他语言哪个更好?谁更厉害,谁最终会开玩笑地称PHP是世界上最好的语言。所以,这些辩论是没有实际意义的,但有趣的是,这种辩论常常让人想起过去几年CPU领域RISC和CISC之间的争斗。现代成功的CPU设计包括这些技术中的任何一种,就像Linux内核是微内核和宏内核的混合体一样。可能有人认为Linux是一个宏内核结构,但实际上Linux不仅仅是一个纯粹的集成内核。为什么Linux要采用单核(这里的单核有点合适)结构?我想有以下几个因素。在Linus看来,单核的开发和选型更容易,因为避免了消息传递架构、计算模块加载方式等相关工作。而Linux诞生的原因是Linus对MINIX(一种类UNIX操作系统)只允许用于教育方面非常不满。再加上Linus对操作系统很感兴趣,所以开始写Linux操作系统,所以我认为当时Linus开发Linux是出于兴趣,没有进行细致周到的设计,也没有考虑其可扩展性。当然,这只是我粗略的猜测。这和我们大学的毕业设计是一样的。你在毕业设计中会考虑你做的系统的可扩展性吗?除非你想把它作为一个产品来做,但何必呢?另一个原因是足够的开发时间。Linux没有开发时间限制,也没有发布时间表。任何限制只能由内核单独修改和扩展。核心单体设计,内部完全模块化,修改或添加都不是很困难。关键是没有必要为了追求小的未经证实的可维护性增加而重写Linux内核。Linus反复强调,为了利益而牺牲速度是不值得的。Linux是吸取了微内核精华的宏内核结构。Linux支持模块化设计,抢占式内核,支持内核线程,动态加载内核模块的能力。不仅如此,Linux还避免了其微内核设计的性能损失,允许一切运行在内核模式下,直接调用函数而无需消息传递。所以总的来说,Linux是一个模块化的、多线程的、内核可调度的操作系统。模块化设计:Linux支持动态加载内核模块。虽然Linux内核也是单核的,但是它允许一些内核代码在需要的时候动态删除和加载。可抢占性:Linux内核支持抢占。与传统的UNIX不同,Linux内核具有让运行在内核中的任务优先执行的能力。UNIX产品中只有Solaris和IRIX支持抢占,传统的UNIX内核大多不支持抢占。在Linux中,实用主义得到了完美的体现。如果一个功能没有价值或者是一个糟糕的主意,它就不会被实现。相反,在Linux的发展过程中,形成了一种值得称赞的务实态度:任何改变都必须针对现实中实际存在的问题,需要完整地设计和实现,正确简洁。如果Linux是纯微内核设计,则移植到其他体系结构会更容易。现实情况是,Linux内核移植虽然不是很简单,但绝非不可能。
