经典对白(Andy(AndrewS. Tanenbaum)VS linus):
老一点的操作系统都是宏内核的,也就是说,整个操作系统是一个运行在核心态的单独的a.out文件,这个二进制文件包含进程管理、内存管理、文件系统以及其他。具体实例包括UNIX、MS-DOS、VMS、MVS、OS/360、MULTICS等。
微内核,大部分的内核服务运行在单独的进程中,它们之间是通过消息进行通讯的。内核的主要任务是,处理消息传递,中断处理,底层的进程管理,及可能的I/O操作。它尽可能的保持内核尽量小,将多数的服务都运行在内核之外。比如内存管理,文件系统等。其中心思想是将内核按功能模块进行分解,不同的功能分别运行在自己的地址空间中,一个功能的崩溃不会影响其他模块的正常运行。而内核只是负责消息传递,进程调度等最基本的服务。设计思想:除了是必须放在内核空间中运行的东西,否则就让它去用户空间。内核只做最最简单的工作:访问硬件,进行个进程间通讯,从而保证内核足够的灵活,精炼。一个微内核的操作系统,其实是一个功能精炼的内核,加上一堆程序,比如文件系统、显卡驱动、网卡驱动、声卡驱动等都是普通的进程。
假设某进程要读取一个文件。首先通过内核告诉进程 FS (独立的进程),然后 FS 再通过内核告诉驱动程序(独立的进程),驱动程序读取硬盘,返回结果。这样一来,一项工作的完成编程多个功能模块协同完成,进程间通信是至关重要。
宏内核,内核中所有的服务均运行在内核空间,不同功能模块之间的通信是直接调用相应模块的函数完成,不存在运行空间的变换导致的上下文切换的开销还有消息传递及处理返回等的开销,运行效率更高。但是一旦有某个模块崩溃,则整个kernel也就无法工作。宏内核的内核功能模块运行全部在统一个内核空间,运行的效率是要比微内核高的。宏内核是一个静态的不可分割的二进制文件,不过现在集成了可加载特性,对于不使用的模块亦可按需加载。
微内核为了达到减少开销而向单内核倾斜让内核管理较多的东西。而Linux作为单内核也在灵活性方面向微内核倾斜。
代表性的成果:
微内核中有执行效率非常高的内核(L4)
单内核中也有灵活性很高的内核(Linux)。