微内核与第二代微内核

第一代微内核

 

微内核的概念是由Richard Rashid在卡内基梅隆(Carnegie-Mellon)大学开发Mach操作系统时提出的,目标是建立一个基于消息传送(message passing)机制的最小内核,以便在此基础上建造对其它操作系统的模拟层来模拟其它操作系统的特性。以Mach微内核为例,该微内核提供了进程管理、线程管理、内存管理、通信和I/O服务的功能。在Mach微内核基础上,建立了一些运行在用户态进程中的操作系统模拟程序,用来模拟4.3 BSDSystem VHP/UXMS-DOS等操作系统的特性。这些模拟程序使得Mach操作系统能够支持许多运行于其它操作系统上的应用程序,如图1所示。所以微内核设计带来的一个重要优点是大大提高了操作系统的兼容性(compatibility) -- 使得基于微内核的操作系统能够模拟其它操作系统的特性,从而支持许多运行于其它操作系统上的运用程序。

 

1. Mach微内核对其它操作系统的模拟

 

 

微内核设计带来的另外一个重要优点是提高了操作系统的扩充性(extensibility)。微内核设计的一个目标就是内核只提供对操作系统绝对必要的功能,而把其它属于传统操作系统内核部分的功能留给用户态进程来实现。以Mach操作系统为例,传统上属于操作系统内核功能的文件、目录服务都放在用户态进程实现了。本质上说,微内核可以被看作是对传统操作系统共性的进一步抽象,从某种意义上说可以被称作是“操作系统的操作系统”。这种进一步的抽象使得内核只提供机制,而把实现策略留给用户态进程 -- 或者说,服务程序。当新的硬件设备或软件技术出现时,只需要增加或修改服务程序即可,而不必象传统操作系统那样必须修改内核设计。微内核设计的这个优点在一个最有影响力的基于微内核的操作系统-- Windows NT的发展历史上得到了充分的体现:从Windows NT的第一版(3.1)开始到最新的Windows XP,其内核的改动远远小于传统操作系统如Unix

 

另外,由于微内核对操作系统作了进一步抽象,基于微内核的操作系统更容易去掉一些不必要的特性从而被剪裁成一个较小的系统。也就是说,微内核设计使得操作系统有较好的灵活性(flexibility)。在基于微内核的操作系统上,所有的处理器相关的代码都被封装在微内核中,从而使得操作系统有较好的移植性(portability):因为微内核体积较小,所以移植工作也较少。微内核系统的可靠性(reliability)也较好,这是由于体积较小的内核可以得到更多的测试。同时,一些属于传统操作系统内核部分的功能是由服务程序实现的,所以一旦发生故障不至于导致系统的崩溃。最后,由于微内核设计基于消息传送机制,所以能更容易支持网络通信。

 

第二代微内核

 

总的来说,微内核设计带来了良好的兼容性、扩充性、灵活性、移植性、可靠性和网络支持。但是,微内核设计有一个重要缺点:由于微内核操作系统使用进程来隔离系统组件,这些组件之间的通信使用了消息传递方式来实现一个组件对另一个组件的调用 - 这实际上是进行了一次RPC(例如在NT上是LPC)调用。但这种类似RPC的方式是通过进程间通信(IPC)机制实现的,其性能一般低于传统操作系统的系统调用的性能。由于微内核操作系统的类似RPC调用是通过消息传送机制实现的,而传统操作系统的系统调用一般是通过类似trap的方法实现。相比于trap方法,通过消息传送机制实现的这种RPC调用的方式较慢 - 微内核完成一次这样调用的操作较慢,这是由于需要创建消息、发送消息、进程切换等更多的步骤。这些步骤使得微内核操作系统的消息传送部分成为一个瓶颈,其性能大大低于传统操作系统的系统调用部分。例如,在Mach 3上,一个基于消息传送机制的类RPC调用在486-DX50上引入了230µs的开销,而一个传统Unix系统的系统调用在同一硬件上仅仅引入了20µs的开销。这就是说,传统Unix系统的系统调用比Mach 3的类RPC调用快10倍。这个巨大的差距明显地降低了许多运行在微内核操作系统上的应用程序的性能。例如,ChenBershad DEC-Station 5200/200上比较了应用程序在MachUltrix操作系统 (一个Unix变种)运行时的速度,发现相对于Ultrix操作系统Mach最多降低了这些应用程序66%的性能。测量表明至少73%的性能下降和RPCRPC相关活动有关。这些性能下降除了是由于消息传送机制过多的步骤引起外,还和微内核设计导致的过多用户态和核心态之间的切换以及过多的不同地址空间之间的切换有关。一个研究表明不同地址空间之间的切换导致较高的Cache未命中率(cache-miss rate)是导致性能下降的重要原因。

 

解决微内核设计性能问题的一个方法是扩大微内核并把一些关键的服务程序和驱动程序重新加入到内核中去,从而减少系统在用户态和核心态之间的切换以及系统在不同地址空间之间的切换。这方面的例子有Mach操作系统和Chorus操作系统。另一个特别有名的例子是Windows NT 4.0的设计:这个版本的Windows NT把本来运行在用户态的图形系统又重新加入到内核中,结果大大地提高了图形系统的性能。

 

但是,扩大内核的方法大大削弱了微内核思想带来的优点 – 扩大的内核降低了系统的扩充性、灵活性和可靠性。与扩大内核的思路相反,解决微内核性能问题的另一条思路是进一步减少内核的大小并对RPC调用进行直接优化。这种思路导致了被称为第二代微内核的一些新的内核设计的出现。在这些新的微内核中,L4微内核是一个著名的例子。

 

L4微内核

 

L4微内核的核心功能是支持一个基于消息传送的IPC原语,以便在此基础上实现高性能的RPC机制。在486-DX50上,L4实现了一个RPC调用开销仅用10µs的性能。相比之下,在Mach操作系统上一个RPC的调用开销为230µs,而在Unix上一个RPC的调用开销为20µs。也就是说,L4IPC比第一代微内核的IPC20倍以上,甚至比传统操作系统的IPC还要快。

 

除此之外,L4微内核还提供了地址空间管理原语和线程管理原语。L4的地址空间管理原语负责内存地址空间的映射,支持三个操作:GrantMapFlush。基于这些操作,L4可以支持由不同的用户进程以不同的策略来映射页面。L4的线程管理原语使得线程调度能够由用户进程以不同的策略来实现,从而支持用户态的线程调度器。由于L4微内核仅仅以7个系统调用接口就实现了以上功能,所以只占用了12K内存。相比之下,一个典型的第一代微内核占用300K内存以支持140个系统调用接口。

 

L4微内核的另一个特点在于它的中断处理方式:L4微内核把硬件中断处理成IPC消息。微内核把硬件当作是一些能够发送IPC消息给相关处理代码的线程,而把中断服务程序当作是一些正在接收这些IPC消息的线程。当一个硬件中断发生时,微内核会为这个中断产生一条消息并把此消息发送到和此中断相关联的用户进程中,然后由用户进程中的负责接收这条IPC消息的线程来处理这个硬件中断。这样,内核只负责产生中断消息,而不用涉及到具体的中断处理,从而使得中断处理的具体策略和内核隔离开来。这种处理方式使得设备驱动程序可以运行在用户态,其中断服务代码的大体结构如下:

driver thread:

do

wait for (msg, sender);

if sender = my_hardware_interrupt

then read/write I/O ports;

reset hardware interrupt

else …

endif

enddo

 

 

其它第二代微内核级的设计

 

Exokernel微内核

 

相对于L4微内核,Exokernel微内核是一个更加激进的设计。Exokernel微内核的核心观点是:只要内核还提供对系统资源的抽象,就不能实现性能的最大优化 -- 内核应该支持一个最小的、高度优化的原语集,而不是提供对系统资源的抽象。从这个观点上来说,IPC也是一个太高级的抽象因而不能达到最高的性能。Exokernel微内核的核心是支持一个高度优化的原语名叫保护控制转移(protected control transfer, PCT)PCT是一个不带参数的跨地址空间的过程调用,其功能类似于一个硬件中断。在PCT的基础上,可以实现高级的IPC抽象如RPC。在MIPS R3000处理器上,一个基于PCTRPC实现了仅10µs的开销,而在同一硬件上运行的Mach RPC95µs[1]

 

Rambler内核

 

Rambler操作系统不同于传统操作系统:它没有传统操作系统的严格意义上的内核。如果一定要定义一个内核的话,它的IPC/HAL模块就扮演着传统内核的角色,可以被系统几乎所有的部分调用。系统核心通过支持跨地址空间和跨计算机的远程方法调用,在全系统的各个部分架起了一座桥梁。在Rambler系统中,所有的远程调用都是通过OCP协议进行的。

 

在Rambler操作系统中也有一个内核态进程,但和传统操作系统的内核有很大不同的:Rambler的内核进程只是一个运行在内核态的地址空间。 在这个内核态地址空间中有什么系统部件,是不可预知的,取决于处理器的体系结构。在目前的80386的实现上,内核进程包含了中断管理器、地址空间管理器、8237A DMA控制器驱动模块、OCP根地址空间和一些系统的启动代码。但这些部件的位置随时可以因系统的实现策略和处理器体系结构的需要而改变。例如在其它处理器平台上,地址空间管理器可能被放在一个特定的用户态地址空间中,而不必运行在内核态。又如,在Rambler后继版本的实现中,OCP根地址空间可能会放在在用户态地址空间中,而启动代码会被抛弃。

 

所以,Rambler内核进程实际不同于传统操作系统的内核。而传统操作系统内核的主要功能被Rambler系统的各个子系统代替了。 如:进程管理被地址空间管理器(可能运行在用户态)所替代;进程切换被IPC模块的调用切换所代替;线程管理由IPC/HAL模块和应用程序运行环境所替代; IPC模块的一部分是运行在用户态的;虚拟内存系统可以作为运行在用户态的系统服务,甚至嵌入到应用程序中作为私有的External Pager;设备驱动程序一般运行在用户态地址空间中; 存储系统(包括传统文件系统)运行在用户态地址空间甚至嵌入到应用程序中。

 

因而从某种意义上说,Rambler 操作系统可以被认为是一种无核设计。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值