木子的麦地

Back

1. 操作系统概述#

1.1 操作系统的基本概念#

操作系统的概念

  • 操作系统是控制和管理计算机系统软/硬件资源、合理调度任务与分配资源,并为用户及其他软件提供统一接口与运行环境的最基本的系统软件。

操作系统的功能和目标

  1. 操作系统作为计算机系统资源的管理者。
  2. 提供接口(向上层提供方便易用的服务):
    • 直接给用户使用的(用户可以直接使用):
      • GUI界面
      • 命令接口:
        • 联机命令接口:说一句做一句
        • 脱机命令接口:说一堆做一堆
    • 给软件或者程序员使用的:程序接口(系统调用):函数库本身不是操作系统接口,只是对系统调用的封装。
  3. 对计算机资源的扩充:裸机通过操作系统成为扩充机器/虚拟机。

操作系统的特征

  1. 并发:多个事件在同一时间间隔内发生,这些事件在宏观上同时发生,微观上交替发生。
    • 并行:多个事件同一时刻同时发生。
    • 单核CPU同一时刻仅运行一个程序,多程序并发。
    • 多核CPU同一时刻同时执行多个程序,多程序可并行。
    • 若运行程序多于核数,则并发性必然必不可少,所以并发性是操作系统一个最基本的特性。
  2. 共享:系统中的资源可供内存中多个并发执行的程序共同使用。
    • 互斥共享:一时段只允许一进程访问,例如摄像头。
    • 同时访问:一时段内多进程同时访问,例如硬盘、扬声器,但是往往宏观上同时,微观上交替。
    • 并发和共享是操作系统两个最基本的特征,二者互为前提。
  3. 虚拟:利用时分复用和空分复用,将物理实体映射为多个逻辑上的对应物。
  4. 异步:多道程序环境下允许多个程序并发执行。但由于资源有限,进程的执行并非连续,而是以不可预知的速度向前推进。

1.2 操作系统的发展历程#

手工操作阶段:未配置操作系统

  1. 人工操作方式:用户独占,全机资源利用率极低,CPU长时间空闲,计算能力未能充分发挥。
  2. 脱机IO方式:装带卸带在外围机完成,减少CPU空闲时间,CPU可直接从高速磁带读取或写入数据,提升IO效率。

批处理阶段

  1. 单道批处理系统:自动性、顺序性、单道性。
  2. 多道批处理系统:
    • 多道性,宏观并行,微观串行,多道程序共享CPU、内存、IO设备等资源,系统吞吐量大,各部件保持高负载状态。
    • 利用中断技术提高了IO设备利用率。
    • 缺乏交互能力,用户无法了解程序运行状态或进行干预,响应时间长。

分时操作系统

  • 处理器时间划分为很短的时间片,轮流给各用户程序使用,以人机交互为核心目的。
  • 特点:
    1. 同时性:允许多个终端用户同时使用同一计算机。
    2. 交互性:用户通过终端以人机对话的方式直接控制程序运行,并与程序进行交互。
    3. 独立性:各用户的操作相互独立,任意用户均感觉系统为其独占。
    4. 及时性:用户请求能在较短时间内获得响应,满足交互需求。

实时操作系统

  • 严格时间限制内完成关键任务,确定性高、可靠性强、时效性。
  • 分类:
    1. 硬实时操作系统:必须在规定截止时间前完成,例如飞机控制系统、导弹制导系统。
    2. 软实时操作系统:允许偶尔错过截止时间,例如订票系统、管理系统。

网络操作系统和分布式系统

  • 网络操作系统:支持资源共享与通信功能,数据传输。
  • 分布式系统:
    • 由多台计算机组成的集合,具有良好的可扩展性和容错能力,支持动态重组。它将一个任务分解为多个子任务,并行执行,协同完成。
    • 主要特点包括:
      1. 分布性
      2. 并行性
      3. 透明性

微机操作系统

  • 单用户单任务操作系统:仅允许一个用户登录并运行一个程序,例如早期的MS-DOS。
  • 单用户多任务操作系统:支持一个用户同时运行多个程序,系统通过时间片轮转实现任务切换,例如现代Windows系统。
  • 多用户多任务操作系统:允许多个用户通过终端或网络同时登录,例如Linux服务器版本。

1.3 操作系统的运行环境#

操作系统内核

  • 支撑功能包括时钟管理、中断机制以及原语。
  • 系统资源管理功能包括进程管理、存储器管理、设备管理。

处理机的双重工作模式

  • 用户态(目态)
  • 内核态(管态/系统态)
  • 通过一个模式位标识当前的运行模式,例如:0表示内核态,1表示用户态。
  • 系统加载用户程序后,CPU从内核态切换到用户态;而用户态通过中断或陷阱进入内核态。
  • 特权指令仅能在内核态执行,可访问全部地址空间,执行关键操作,如:
    1. 启动外设
    2. 设置系统时钟
    3. 关闭中断
    4. 修改模式
    5. 返回用户态
  • 非特权指令通常在用户态下执行,用于一般计算和数据处理,无法直接操作硬件或系统核心资源。
  • 若用户态程序试图执行特权指令,则硬件将产生非法指令异常。操作系统捕获异常后,会终止程序并重新调度。

中断和异常

  • 用户程序进入内核态唯一的合法途径就是中断或异常。当CPU运行用户程序时,一旦发生中断或异常,硬件会自动将处理器切换至内核态,并跳转至内核对应的处理程序。这一过程由硬件强制保障,确保了切换的安全性与原子性。
  • 中断(也称外中断):是指来自CPU执行指令外部的事件,通常用于信息输入输出,例如设备发出的IO结束中断、时间中断,表示一个时间片已到,用于系统计时、进程调度和启动定时任务。
  • 异常(也称内中断):是指来自CPU执行指令内部的事件,例如非法操作、地址越界、运算溢出、系统的缺页以及专门的陷入指令等引起的事件。异常一旦发生,就必须立即处理,不可被屏蔽。
  • 异常包括故障、自陷、终止。
  • 外中断包括可屏蔽中断和不可屏蔽中断。
  • 其中故障和自陷为软件中断,终止、可屏蔽中断、不可屏蔽中断为硬件中断。

中断和异常的处理过程

  • 当CPU在执行用户程序第I条指令时,若该指令引发异常,或在指令结束后检测到中断请求信号,则CPU会打断当前程序,转入相应的中断或异常处理程序执行。
  • 若问题可在处理程序中解决:
    1. 对于故障:通常在处理完成后,返回第I条指令重新执行。
    2. 对于自陷:在处理完成后,返回第I+1条指令继续执行。
    3. 对于终止: 比如硬件发生了不可恢复的致命错误。此时程序直接被操作系统终止,不返回。
    4. 对于中断:在处理完成后,返回第I+1条指令继续执行。
  • 若处理程序被判定为不可恢复的致命错误,则终止该用户程序。
  • 通常情况下,中断和异常的具体处理由操作系统完成。

中断与子程序调用的区别

  • 中断程序与待中断程序相互独立,无固定关联,而子程序与主程序属于同一程序的主从关系。
  • 中断的产生通常是随机的,而子程序调用由CALL指令显式触发,是程序员事先安排的。
  • 子程序调用完全由软件实现,而中断处理需要硬件电路支持才能完成。
  • 中断处理程序的入口地址由中断向量表直接提供,子程序的入口则由call指令中的地址码确定。
  • 调用中断处理程序和子程序均需保护程序计数器(PC)的内容:
    • 调用中断处理程序:由硬件在中断响应过程中自动保存。
    • 子程序调用:由call指令在执行时将当前PC压入栈中。
  • 响应中断时,需对同时到达的多个中断请求进行优先级裁决,子程序不用。

系统调用

  • 系统调用是操作系统提供给应用程序使用的接口,是一种特殊的子程序调用。
  • 系统调用按功能大致可分为:设备管理、文件管理、进程控制、进程通信、内存管理。
  • 系统调用必须由操作系统内核程序在内核态下完成,系统调用的核心目的是让应用程序能够安全地访问内核功能,与普通过程调用存在显著差异:
    • 运行状态不同:普通过程调用的调用者与被调用者运行在同一特权级;而系统调用的调用者运行在用户态,被调用者运行在内核态。
    • 状态转换不同:普通过程调用无需特权级转换,可直接跳转。系统调用需要通过软中断指令触发,先从用户态切换到内核态,再由内核态分配至相应的处理程序。系统调用执行完毕后,内核可能根据调度策略决定是否切换进程;而普通过程调用直接返回原调用点。
    • 嵌套调用限制不同:系统调用的嵌套深度受到内核栈空间的限制;而普通过程调用的嵌套深度通常仅受用户栈大小的约束。
  • 系统调用的处理过程可分为四个阶段:
    1. 传递系统调用参数;
    2. 执行陷入指令并切换至内核态;
    3. 定位并执行相应服务程序;
    4. 恢复现场并返还用户态。
  • 常见的用户态转向内核态的情形包括:
    1. 用户程序请求操作系统服务(系统调用)。
    2. 发生中断,如IO完成、时钟信号。
    3. 用户程序执行过程中发生异常,如除零、缺页。
    4. 用户程序试图执行特权指令,从而触发异常。
  • 从内核态返回用户态,由内核通过特定返回指令完成该操作,在内核态执行。

1.4 操作系统结构#

分层法

  • 各层仅可调用其紧邻下层所提供的服务。
  • 优点:
    1. 便于调试与验证。
    2. 易于扩充与维护。
  • 缺点:
    1. 层次划分困难。
    2. 运行效率较低(执行一个高层功能需穿过多个中间层)。

模块化

  • 模块不可过大,否则模块内部结构复杂,难以维护。
  • 模块不可过小,否则模块交互频繁,增加系统整体复杂度。
  • 优点:
    1. 提高了操作系统设计的正确性、可理解性与维护性。
    2. 增强了操作系统的适应性,便于功能的扩展。
    3. 支持并行开发,加速研发过程。
  • 缺点:
    1. 模块间接口规定很难满足对接口的实际需求。
    2. 无法相互验证。
    3. 无法找到可靠的决定顺序。
  • 模块独立性的衡量标准有两个:
    • 一是内聚性:模块内各组成部分间的紧密程度。内聚性越高,模块独立性越好。
    • 二是耦合性:模块间相互依赖与影响的程度,耦合性越低,独立性越好。

宏内核

  • 宏内核是将系统的主要功能模块集成在一个紧密耦合的整体中,运行在内核态中。

微内核

  • 微内核将操作系统中最基础的功能保留在内核中,将其他非核心功能转移至用户态运行,以降低内核复杂度。
  • 将移出的服务组织为若干独立的服务程序,运行于用户态,通过消息传递机制完成与用户进程的交互。
  • 微内核将操作系统划分为两大部分:
    1. 内核:仅实现操作系统最核心机制,包括与硬件紧密相关的部分、基本的资源管理机制、客户与服务器间的通信支持。
    2. 多个服务器。
  • 微内核的优点:
    • 可靠性与安全性
    • 扩展性与灵活性
    • 可移植性
    • 分布式计算
  • 缺点是性能问题,每次服务请求需多次穿越内核态与用户态,导致系统调用延迟增加。

外核

  • 将物理资源直接暴露给用户及系统自身,并负责资源的安全分配与隔离。
  • 优点:
    • 减少抽象开销,提升灵活性与性能。
    • 清晰分离保护与实现,外核仅负责资源保护,功能实现完全置于用户空间。
    • 体系结构简洁,易于验证。

1.5 操作系统引导#

过程如下:

  1. CPU激活与BIOS初始化。
  2. 硬件自检与启动设备选择。
  3. 加载主引导记录。
  4. 定位活动分区并加载分区引导记录。
  5. 加载启动器管理器。
  6. 加载操作系统内核。
  7. 内核初始化与用户环境启动。

1.6 虚拟机#

  • 通过虚拟化技术,将一台物理计算机抽象为多台独立计算环境。核心是隐藏底层物理硬件的细节,向上层提供统一且隔离的执行平台。
  • 第一代虚拟机管理程序:
    • 直接运行在物理硬件上,是操作系统中唯一处于最高权级的软件,类似于一个轻量级的操作系统,管理硬件资源与并发调度多个虚拟机,客户操作系统运行在虚拟内核态。
  • 第二类虚拟机管理程序:
    • 运行在宿主操作系统上,本质是一个用户态进程,例如VMware Workstation。