操作系统中的抽象概念

时间    

多个任务不能同时使用同一个时分复用的部件,但每个任务在使用时都可以得到这个部件的全部,因此需要将时间合理地分配给它们。典型的时分复用的部件是处理器,它又包括中央处理器和协处理器。

空间    

多个任务可以同时使用同一个空分复用的部件,但每个任务在使用时都无法得到这个部件的全部,因此需要将空间合理地分配给各个任务。典型的空分复用的部件是存储器,它又包括内存和外存。

原则    由需求决定。

设计    操作系统的高层次抽象描述,描述各个组件的逻辑功能

实现    操作系统的低层次具体描述,描述各个组件的具体实施

策略    操作系统中对资源管理的方法和政策。

机制    操作系统为实现策略使用的工具和手段

图灵机模型

存储带TAPE   

读写头HEAD   

状态寄存器   

控制规则表    

通用图灵机

将任意图灵机及其输入作为输入的图灵机,它可以模拟任何图灵机的运行。

重要性

存储程序架构(冯・诺依曼模型)思想的原点。         
存储的程序即为其它图灵机的状态描述与转换规则。         
存储的数据即为其它图灵机所使用的数据。

计算机系统:硬件+软件

软件    

主要包括系统软件用户软件。在工程实现中,一般分主板固件、操作系统、中间件和应用程序四个主要部分。

硬件    

包括运算器、控制器、存储器、输入设备和输出设备。
在工程实现中,一般分微处理器、存储器和输入输出设备三个主要部分,之间用系统总线连接。

指令执行的流程

取值 译码 执行 回写

数据在存储器中的表示

单字节直接存

多字节分大小端(大段正常)

汇编指令集合

算术运算数传输 处理串位控转移

8086段式内存管理

逻辑地址    程序中引用的16位地址,也叫偏移量或有效地址。

线性地址    经段式内存管理机制转换后,8086 CPU要实际访问的20位地址,也叫物理地址

地址生成算法    线性地址=(段寄存器值<<4)+逻辑地址

8086寻址

数据传送寻址    指令的操作数是数据时,查找数据的方法
控制转移寻址    指令的操作数是转移地址时,查找转移地址的方法
端口寻址    指令的操作数是一个端口时,查找端口地址的方法

寻址方法分类    

寄存器寻址:数据位于一个寄存器内。         
存储器寻址:数据位于一个存储器单元内。         
立即数寻址:数据携带在指令内部。

输入输出设备

外设接口

数据寄存器    存放外设和主机间传送的数据         
状态寄存器    保存外设或接口的状态信息         
命令寄存器    保存CPU发给外设或接口的控制命令

信息交换

直接交换    外设总是准备好接受或发送数据,主机直接读写         
查询(轮询)    在读写前查询外设是否准备好,主机再读写         
中断        外设通过中断主动通知主机准备好,主机再读写         
成组传送    由DMA控制器读写设备,CPU不干涉,性能最高。

问题一:什么情况下会产生这个需求?为什么?单道程序计算机有这个需求吗?多道程序计算机呢?

多道程序并发执行的环境中

  • 单道程序计算机:无此需求,因无并发。

  • 多道程序计算机:有强烈需求,以防止程序间干扰。

问题二:隔离策略由谁负责?隔离策略需要什么机制设计?策略由操作系统负责,还是由应用程序负责?软件机制有可能吗?硬件机制有可能吗?

  • 策略由操作系统定义与管理

  • 机制由操作系统通过软件或硬件实现

  • 硬件机制提供更强、更底层的隔离保障,软件机制更灵活但可能被绕过。

  • 可以实现,Java虚拟机以及WASM沙盒。

问题三:这些机制设计对应的实现被什么客观条件限制?

不能太慢 不能太贵

处理器特权级

用户模式    执行应用程序的模式,不允许直接访问系统的敏感资源。
内核模式    执行操作系统的模式,可直接执行敏感指令和访问敏感资源。
特权指令    能对敏感资源进行操作的指令,仅能在内核模式下执行

问题一        特权级可以通过什么机制互相切换?         

方法一    中断机制         
方法二    专用指令机制 问题二        

用户程序使用什么方法调用操作系统?         

使用上述两种机制之一。         
之后陷入操作系统内核,执行被操作系统接管

相比8086,为何AMD64要切换到内核栈且多压栈了SS和RSP?         

进入内核模式时,必须修改FLAGS/CS/RIP以关中断而且跳转到中断服务程序。我们可以把它们的原值保存在栈上。但此时的SS:RSP是指向用户空间的不可信的值,不能在内核模式对它进行操作

系统调用、中断和陷阱

系统调用    

一种机制设计,允许应用程序通过受限的方法调用操作系统内核,向内核请求功能处理。

中断:不可预测 陷阱:可预测

操作系统的分类

批处理系统(提高CPU利用率 缺乏交互)

批处理系统:把计算任务批次整理,然后逐一执行。

分时系统(可以交互 但存在资源分配问题 且实现复杂)

批处理虽然效率高,但有个致命伤:用户无法干预

分时系统:同时装入多个任务,每个任务分配一定的时间和空间运行

分时系统的核心是交互性,通过时间片轮转实现多用户同时在线。

实时系统

实时:为了确定性,必须准时,追求平均响应时间短

微内核系统

微内核:为了可靠性,把系统拆散,坏了能修,常用于高端实时系统。

代价:虽然系统更稳定(一个服务挂了不影响内核),但服务之间需要频繁通信(反复通信),导致性能下降

操作系统结构演进:从简单到灵活的隔离逻辑

模式 保护域 OS角色(管理 协调) 资源调用

本质上是隔离机制从“无”到“有”、从“粗”到“细”、从“集中”到“分布”的过程

一、库结构(单核结构):无隔离的“合作模式”

特点是“无内核/用户模式区分”,所有程序都在同一个“保护域”里运行。

  • 特点        
    无区分“无内核模式与用户模式区分        
    同域:所有应用程序以及内核都在同一个保护域。         
    资源可用:应用程序可以随时对任何资源做任何操作。         
    程序合作:应用程序间为合作关系,操作系统的角色偏重协调而非管理
  • 代价:一错全崩
二、宏内核结构(通用设备):首次引入“保护域”

到了桌面电脑、必须防止程序间互相干扰。于是出现了宏内核结构,区分用户和内核

  • 特点 
    有区分。         
    每个应用程序在不同域。         
    内核的所有功能位于同一个保护域。         
    应用程序必须请求内核完成敏感资源操作。         
    应用程序间为合作或竞争关系,操作系统的协调和管理并重
  • 优点:程序间互相隔离,一个程序崩溃不会直接影响其他程序(比如浏览器崩溃不会让Word也崩溃)。
  • 缺点:但内核有bug会挂掉。
三、微内核结构 把宏内核中的部分程序拆为守护进程

宏内核内核东西太多,崩了完蛋,拆点功能出来,变成用户态的“守护进程”

  • 隔离升级:内核只保留最基础的功能,其他功能拆为“服务进程”
    有区分,每个应用程序在不同的保护域。         
    内核除基本功能外,其它功能拆解为守护进程。         
    应用程序必须请求守护进程中的策略分配敏感资源。         
  • 代价:程序间通信会增加开销,但换来的是极高的可靠性和灵活性。
四、外核结构:暴露硬件资源给应用程序

有些场景(如高性能计算、实时系统)对性能要求极高,连微内核的“服务进程通信”开销都嫌大。外核结构的思路更激进:内核只负责“分配硬件资源”,具体怎么用,交给应用程序自己决定

  • 去抽象化:传统内核会把硬件“抽象”成统一的接口,外核直接把硬件“暴露”给应用程序。比如,应用程序可以直接操作硬盘的扇区,不需要经过文件系统的抽象层。
    有区分,每个应用程序在不同的保护域。         
    内核仅负责硬件资源分配与管理功能。         
    应用程序必须自行分配到的硬件资源完成功能。
    去抽象化    将硬件资源直接暴露给应用程序以获得最大性能增益。
五、其他结构:虚拟机与多内核的“扩展”
  • 虚拟机结构:本质是“用软件模拟硬件”,每台虚拟机跑自己的操作系统。隔离性最强(不同虚拟机完全独立),但开销也大(需要模拟硬件)。
  • 多内核结构:每个核心跑一个内核实例,内核间通过通信协作。
总结:操作系统结构的选择,是“隔离性”与“性能/复杂度”的权衡
  • 库结构:无隔离,适合简单设备(性能最高,可靠性最低)。
  • 宏内核:基础隔离,适合通用设备(平衡性能与可靠性)。
  • 微内核:细粒度隔离,适合高可靠场景(可靠性最高,性能稍低)。
  • 外核:极致性能,适合特定高性能场景(灵活性最高,开发难度最大)。

Logo

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

更多推荐