王道操作系统,视频链接:1.4 操作系统体系结构(下)

操作系统结构表

操作系统结构表
图中标记有五角星的为重要内容,其中红色是新内容,黄色是之前讲解过的大内核与微内核内容。

分层结构

操作系统被分为多层,最底层是硬件,最高层是用户接口,每层可调用更低一层。

  • 优点:
    1. 便于调试和验证,自底向上逐层调试验证。
    2. 易扩充和易维护,各层之间调用接口清晰固定。
  • 缺点:
    1. 仅可调用相邻低层,难以合理定义各层的边界
      比如A需要调用B,B也可能调用A,这样边界就不明确。
    2. 效率低,不可跨层调用,系统调用执行时间长。
      比如A要直接调用D,但是分层结构只允许A调用B,B调用C,C再调用D,这样就很费时间。

模块化

将内核划分为多个模块,各模块之间相互协作
内核=主模块(进程、内存等)+可加载内核模块(驱动等)
主模块:只负责核心功能,如进程调度、内存管理
可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核

  • 优点:
    1. 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发
    2. 支持动态加载新的内核模块(如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
    3. 任何模块都可以直接调用其他模块,无需采用消息传递进行通讯,效率高。
  • 缺点:
    1. 模块间的接口定义未必合理、实用
      比如初始定义了休眠接口,最后发现实际上设备具有多级休眠的特性,要么绕过这个接口重新定义(破坏封装性,引入非标准私有入口(Private Entry Points)),要么改接口塞入更多的参数(接口表面积膨胀(Interface Surface Bloat),增加认知负担),这就会让接口变得臃肿不堪。
    2. 模块间相互依赖,更难调试和验证
      比如相互调用,当一个模块出了问题,不知道是调用的模块有问题,还是调用后有问题。理论来说,分层结构也是一种模块化思想,但是它严格定义了调用方向,比这里的模块化更好维护。

宏内核、微内核

宏内核:

  • 所有的系统功能都放在内核里(宏内核结构的OS通常也采用了“模块化”的设计思想)
  • 优点:性能高,内额内部各种功能都可以直接相互调用
  • 缺点:
    1. 内核庞大功能复杂,难以维护
    2. 大内核种某个功能块出错,就可能导致整个系统崩溃
      微内核:
  • 只把中断、原语、进程通信等最核心的功能放入内核。进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态。
  • 优点:
    1. 内核小功能少,易于维护,内核可靠性高。
    2. 内核外的某个功能模块出错不会导致整个系统崩溃。
  • 缺点:
    1. 性能低,需要频繁地切换用户态/核心态。
    2. 用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信。

外核

  • 内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全(也就是给了你A空间,你就不能用B空间,A空间是你的,别人就不能轻易越界来用A空间)。
    比如:普通操作系统给进程分配的空间是经过抽象的,也就是看起来可能是连续的,实际上可能空间是离散存储的。但是外核分配的是未经抽象的硬件资源,假设进程需要随机访问自己被分配的空间,但是实际上被分配的空间离散程度很高,就可能导致在不同的存储空间,在不同的块中反复横跳,导致效率降低,而分配未经抽象的硬件资源就可以保证分配的空间一定是连续的,避免这个问题。

  • 优点:

    1. 外核可直接给用户进程分配“不虚拟、不抽象”的硬件资源,使用户进程可以更灵活地使用硬件资源。
    2. 减少了虚拟硬件资源的“映射层”,提升效率。
      因为抽象的空间要转化为物理的空间需要有一定开销。
  • 缺点:

    1. 降低了系统的一致性。
      比如有些程序分配虚拟地址,有些分配物理地址,前者需要翻译,后者不需要,这就违背了一致性,也就会导致后面的系统变复杂。
    2. 使系统变得更复杂。

    本节考试只会考简单的选择题,合理分配时间。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐