内核是操作系统十分重要的组成部份,同时也是操作系统的核心。内核管理着系统资源,内核向下联接着应用程序,向上联接着硬件,它是应用程序和硬件的桥梁。
内核可以进一步的界定,分为宏内核和微内核。
宏内核和微内核最大的区别就是linux windows,宏内核的用户服务和内核服务都保存在相同的地址空间中,它们都由内核进行统一管理,而微内核的用户服务和内核服务会保存在不同的地址空间中,右图可以挺好的解释这一点。
虽然这儿的宏内核翻译过来有点牵强,当然应当叫单内核或则单核。在这些单核的设计中,内核是一个大的整体,可以说是一个大进程linux内核移植流程,在这个大进程中,所有内核服务都运行在一个地址空间中,函数之间的调用链路少,直接通讯简单高效。
而微内核的功能会界定为独立的进程,进程之间通过IPC进行通讯,高度模块化,一个服务的故障不会影响另一个服务。不过因为模块化的影响,函数之间调用链路偏长,进程之间不会直接通讯,而是通过内核服务相互通信。
从内核大小前面来讲linux内核移植流程,微内核的规格更小,只包含用户进程相关的服务linux格式化命令,而单核的规格要比微内核大的多,这点比较好理解,由于宏内核融入了太多服务和驱动。
从执行效率上来说,微内核的执行效率相对较慢,由于涉及到跨模块调用,而宏内核执行效率高,由于函数之间会直接调用。
在微内核模块化以后,它很容易扩充,由于内核空间与用户空间互相隔离,在用户态下(运行在用户空间中的应用程序)应用程序崩溃后通常不会影响到内核中的数据。宏内核的可拓展性较差。
经过里面那些描述以后,我们很容易把宏内核和微内核的特点想像成软件开发中的单体构架和微服务构架。
单体构架最大的特征就是函数调用便捷,几乎不存在调用链路,一个项目解决所有问题,项目中包含数据库驱动、各种拦截器、控制器、权限控制,可拓展性十分差。
而微服务的构架之间的调用链路会比较长,模块之间的职责分离而且互相依赖,例如权限控制模块、路由模块、总线通讯模块。可拓展性比较强。
这两种不同的内核结构有不同的支持者,就和有些人觉得单体构架好,有些人觉得微服务构架模式好。
这如同对编程语言的争辩一样,你说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内核移植其实不是很简单,但也绝非不可能完成的事情。