第1章Linux内核简介之Linux内核和Unix内核的比较

1.4 Linux内核和传统Unix内核的比较

        由于所有的Unix内核都同宗同源,并且提供相同的API,现代的Unix内核存在许多设计上的相似之处。Unix内核几乎毫无例外的都是一个不可分割的静态可执行库。也就是说,Unix必须以巨大的、单独的可执行块的形式在一个单独的地址空间中运行。Unix内核通常需要硬件系统提供页机制MMU以管理内存。这种页机制可以加强对内存空间的保护,并保证每个进程都可以运行在不同的虚拟地址空间。早期的Linux系统也需要MMU支持,但有一些特殊版本并不依赖于此。这是一个简洁的设计,因为它可以使Linux系统运行在没有MMU的小型嵌入式系统上。现实之中,很简单的嵌入式系统都开始具备内存管理单元这种高级功能了。

单内核与微内核设计之比较

        操作系统内核分为两大阵营:单内核和微内核。

        单内核是简单的设计,在1980年之前,所有的内核都设计成单内核。所谓单内核就是把它从整体上作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。这样的内核通常以单个静态二进制文件的形式存放在磁盘中。所有内核服务都在这样一个大内核地址空间上运行。内核之间的通信是微不足道的,因为大家都运行在内核态,并处在同一地址空间:内核可以直接调用函数,这与用户空间应用程序没有什么区别。这种模式的支持者认为单模块具有简单和性能高的特点。大多数Unix系统都设计为单模块。

        微内核并不作为一个单独的大过程来实现。相反,微内核的功能被划分为多个独立的过程,每个过程叫做一个服务器。理想情况下,只有请求特权服务的服务器才运行在特权模式下,其它服务器都运行在用户空间。所有的服务器都保持独立并运行在各自的地址空间上。因此,就不可能像单模块内核那样直接调用函数,而是通过消息传递处理微内核通信:系统采用进程间通信机制IPC,因此,各个服务器之间通过IPC机制互通消息,互换服务。服务器的各自独立避免了一个服务器的失效祸及到另一个。模块化的系统允许一个服务器为了另一个服务器而换出。

        因为IPC机制的开销多于函数调用,又因为会涉及到内核空间与用户空间的上下文切换,消息传递需要一定的周期,而单内核中简单的函数调用没有这些开销。结果,基于微内核的系统都让大部分或全部服务器位于内核,这样就可以直接调用函数,消除频繁的上下文切换。

        Linux是一个单内核,Linux内核运行在单独的内核地址空间上。Linux吸取微内核的精华:引以为豪的是模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。Linux还避其微内核设计上性能损失的缺陷,让所有事情都运行在内核态,直接调用函数,无须消息传递。Linux是模块化的、多线程的以及内核本身可调动的操作系统。

        Linus和其他内核开发者设计Linux内核时,并没有完全彻底地与Unix诀别。认识到,不能忽视Unix的底蕴(特别是Unix的API)。由于Linux并没有基于某种特定的Unix,Linus和其他开发者对每个特定的问题都可以选择已知最理想的解决方案,在有时,也可以创造一些新的方案。Linux内核与传统的Unix系统之间存在一些差异:

        Linux支持动态加载内核模块。尽管Linux内核也是单内核,可是允许在需要时动态地卸载和加载部分内核代码。

        Linux支持对称多处理器机制,尽管许多Unix的变体也支持SMP,单传统的Unix并不支持SMP机制。

        Linux内核可以抢占。与传统的Unix变体不同,Linux内核具有允许在内核运行的任务优先执行的能力。在其他各种Unix产品中,只有Solaris和IRIX支持抢占,但是大多数Unix内核不支持抢占。

        Linux内核并不区分线程和其他的一般进程。对内核来说,所有的进程都一样-只不过是其中的一些共享资源而已。

        Linux提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统sysfs。

        Linux体现自由。现有的Linux特性集就是Linux公开开发模型自由发展的结果。如果一个特性没有任何价值或者创意很差,没有任何人会被迫去实现它。Linux已经形成了一种值得称赞的态度:任何改变都必须要能通过简洁的设计以及正确可靠的实现来解决现实中确实存在的问题。于是,许多出现在某些Unix变种系统中,如内核换页机制等都被摒弃了。

        总之,不过Linux和Unix有多大的不同,Linux都打上了Unix的烙印。


猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/81028920
今日推荐