操作系统结构
随着操作系统的不断增多和代码规模的不断扩大,提供合理的结构对提升操作系统的安全与可靠性来说变得尤为重要。
1.分层法
指将操作系统分为若干层,最低层位硬件,最高层为用户接口,每层只能调用紧邻它的低层的功能和服务(类似于计算机网络高层使用低层的服务)
优点:
-
便于系统的调试和验证,简化了操作系统的设计和实现。我们可以从第一层开始向上进行调试,当我们发现到达某一层出现了错误的时候,那么这个错误大概就是在这一层的。
-
易扩充和易维护,在系统种增加,修改或替换一层种的模块或整个一层的时候,只要不改变相应层间的接口,就不会影响其他层
问题:
-
合理定义各层比较困难,系统不够灵活
-
效率较差,操作系统每执行一个功能,通常要自上而下的穿越很多层,效率较差
2.模块化
将操作系统按功能划分为若干个具有一定独立性的模块。每个模块都具有某方面的管理功能,并规定好各个模块之间的接口,使得各个模块可以互相通信。
还可以将一个模块进一步细分为具有一定功能的子模块,对于每个子模块同样规定好各个子模块之间的接口。
在模块划分的时候,如果将模块划分的太小,虽然能够降低模块本身的复杂性,但是会使得模块之间的联系过多,使得系统显得比较复杂;如果划分的太大,又会增加模块内部的复杂性。此外,在划分模块的时候,要充分考虑模块的独立性问题,因为模块独立性越高,各模块间的交互就越少,系统的结构也就越清晰。
衡量模块的独立性主要有两个标准:
-
内聚性:模块内部各部分间联系的紧密程度。内聚性越高,模块独立性越好
-
耦合度:模块间互相联系和互相影响的程度。耦合性越低,模块独立性越好
优点:
-
提高了操作系统设计的正确性,可理解性,可维护性
-
增强了操作系统的可适应性
-
加速了操作系统的开发过程
问题:
-
模块间的接口规定很难满足对接口的实际需求
-
各个模块设计者齐头并进,每个决定无法建立在上一个已验证正确的决定的基础上,因此无法找到一个可靠地决定顺序。(过于理想主义)
3.宏内核(大内核,单内核)
将系统的主要功能模块都作为一个紧密联系的整体运行在核心态,从而为用户程序提供高性能的系统服务。
问题:随着体系结构和应用需求的不断发展,需要操作系统提供的服务越来越复杂,大内核的高性能优势由于不断扩大的内核变小了,这个时候就出现了微内核技术。
4.微内核
指将内核中最基本的功能保留在内核,而将那些不需要在核心态执行的功能移到用户态执行,从而降低内核的设计复杂性。而那些被移出内核的操作系统代码根据分层的原则被划分成了若干个服务程序,它们之间的运行相互独立,而它们之间的交互则借助微内核进行。
微内核将操作系统划分为两大部分:微内核和多个服务器。
微内核是指能实现操作系统最基本功能的小型内核,通常包括:
-
与硬件处理紧密相关的部分
-
一些基本功能
-
客户与服务器之间的通信
操作系统中的绝大部分功能都放在微内核外的一组服务器中实现,运行在用户态,客户与服务器之间需要借助微内核提供的消息传递机制来实现交互。而这些服务器是作为进程来实现的。
微内核结构中,为了实现高可靠性,只有微内核运行在内核态,其余模块都运行在用户态,一个模块中的错误只会让这个模块崩溃,而不会让系统崩溃。
微内核通常具有以下的功能:
-
进程(线程)管理。进程之间的通信功能是微内核的OS最基本的功能,此外还有进程的切换,进程调度,以及多处理机之间的同步等功能。(机制放在核内,策略放在核外)
-
低级存储器管理。微内核中只配置最基本的低级存储器管理机制。
-
中断和陷入处理。微内核OS将与硬件紧密相关的一小部分放入微内核,此时微内核的主要功能是捕获所发生的中断和陷入事件,并进行中断相应处理,在识别中断或陷入的事件后,再发送给相关的服务器来处理。
微内核操作系统将进程管理,存储器管理以及I/O管理这些功能一分为二,属于机制的很小一部分放入微内核,而绝大部分放入微内核外的各种服务器实现。
优点:
-
扩展性和灵活性。由于许多功能从内核内分离出来,当我们想要修改某些功能的时候,只需要在相应的服务器中修改就可以了,或者再增加一个专用的服务器,而无需改动内核的代码
-
可靠性和安全性。模块崩溃只会影响到该模块,而不会影响到内核。
-
可移植性。与CPU和I/O硬件有关的代码都在内核里面,而其他的服务器都和硬件平台无关,所以将操作系统移植到另一个平台上要花的代价相对较少
-
分布式计算。客户和服务器之间,服务器和服务器之间的通信采用消息传递机制,这就使得微内核系统能很好的支持分布式系统和网络系统。
问题:性能问题,因为相对于宏内核,微内核需要在用户态和核心态之间来回的切换,操作系统的执行开销偏大。故宏内核适合那些对运行速度要求较高的领域,而微内核适合于需要高度可靠性的领域
5.外核
任务是为虚拟机分配资源,并检查这些资源的企图,以确保没有机器会使用他人的资源。
外核所作的只是保持多个虚拟机彼此之间不发生冲突
优点:
-
减少了映射层,虚拟机监控程序不需要维护一张用来重映像磁盘地址的表格。外核只需要记录已经分配给各个虚拟机的有关资源就好。
-
将多道程序(外核内)于用户操作系统代码(用户空间内)加以分离,而相应的负载并不重