单体内核 VS 微内核
当前流行的操作系统内核的设计方式中,一称为单体内核,又称为宏内核,也就是说内核本身只是一个程序,而内核所有的功能都是链接在这个程序的内部,如果某个进程要使用某个功能的话,将是进入内核空间,然后调用相对应的功能函数来实现的。一般我们所常见的 类Unix系统都是采用单体内核的方式设计的,比如传统的UNIX, 现在大行其道的Linux,以及商业化非常成功的SUN Microsystem推出的Solaris。
当一个操作系统内核作为一个程序的时候,有着许多的不足之处。我们都知道驱动程序是工作在内核中的,当前设计硬件的厂商多余牛毛,每一种硬件设备都必须配以驱动程序,而在单体内核的设计中,驱动程序又必须是和操作系统内核编译在一起的,硬件设备更新日新月异,每天都有新的硬件出现,每天都有更新版本的驱动产生,这样操作系统的发行商为了支持这些硬件每天都在编译新的操作系统内核,然后重新发布操作系统,这何其烦也?而且操作系统内核镜像文件会变的何其庞大?
其二,单体内核的操作系统镜像是作为一个程序运行的,并且是常驻在物理内存之中,当你安装并运行了这个操作系统后,你会发现你系统的物理资源都完全被你根本就没有,或者一辈子都适用不到的硬件设备的驱动程序占据着,而留给你的资源却寥寥无几,此时你有何感想?
微内核,恰恰不会吹灰之力就解决的上述的问题。
微内核是在上个世纪七八十年代提出来的一种操作系统的设计方式,微内核本身只提供最基本的操作系统的功能,比如进程调度与消息传递等,其他的功能由其独立的模块提供,每个独立的功能模块都可以是一个进程。当我们需要使用某个功能的时候,我们只需要在运行的操作系统里安装这个模块,并且运行对应服务,当这个功能不再需要的时候,我们可以停止这个服务,这样这个功能模块将不占据系统内存和处理器的资源,而不会破坏当前的系统正常运行,各功能模块与微内核之间是彼此独立的,这样即使功能模块崩溃的时候,系统也不至于挂机。
当一个进程如果需要使用某个功能,就会向微内核发一个消息请求,微内核转发这个请求到对应的功能模块的进程,然后把结果通过微内核再返回给请求进程。如果这个功能模块不存在,那么这个请求也将失败。此时我们可以在系统运行的情况下,安装这个功能模块,可能是一个驱动,也可能是一个服务进程。这样这个模块就可以为其他进程服务了。
所以,微内核设计方式带来的优势:
1) 模块化的方式设计操作系统,模块的设计者只需要关注自己的功能模块。
2)操作系统的更新时,除了微内核本身,可以动态的更新其他的功能模块
3)在系统运行的时候,可以根据需要动态的使能/禁止对应的模块,以释放计算机的资源。
当前商业上使用较多的微内核方式设计的操作系统有风靡全球的Windows系统,用于图像处理的Mac OS系统,以及在实时嵌入式领域独领风骚的WindRiver VxWorks系统。
从上面的描述看来,模块化设计的微内核操作系统似乎是大势所趋,但是单体内核方式设计的Linux, Solaris却未在市场竞争中甘拜下风? 这是为何呢?
深入研究,就会发现,其一,微内核在性能上有不可避免的弱点,因为一个进程需要使用某个功能模块的时候,需要通过消息机制来传输。这里涉及到消息传递进程切换的时间,这比函数调用的消耗大的多。其二, Unix的程序员向来都是天赋甚高的一类怪才,灵机一动,就会想到难道在单体内核中就不能实现类似于微内核的模块的方法吗?
答案当然是肯定的,可以,这样我们既满足了动态的添加功能模块,删除功能模块,又可以利用函数调用带来性能上的优势。下面一节,我们就初窥Linux 内核模块的行径。
联系客服